1  /******************************************************************************
2   *
3   * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4   *
5   ******************************************************************************/
6  #ifndef __BASIC_TYPES_H__
7  #define __BASIC_TYPES_H__
8  
9  //#define PLATFORM_FREERTOS
10  #include <stdint.h>
11  #include <stddef.h> /* for size_t */
12  
13  #define PLATFORM_LITTLE_ENDIAN                  0
14  #define PLATFORM_BIG_ENDIAN                     1
15  
16  #define SYSTEM_ENDIAN                           PLATFORM_LITTLE_ENDIAN
17  
18  #define SUCCESS	0
19  #define FAIL	(-1)
20  
21  #undef _SUCCESS
22  #define _SUCCESS	1
23  
24  #undef _FAIL
25  #define _FAIL		0
26  
27  #ifndef FALSE
28      #define FALSE   0
29  #endif
30  
31  #ifndef TRUE
32      #define TRUE    (!FALSE)
33  #endif
34  
35  #define _TRUE        TRUE
36  #define _FALSE	     FALSE
37  
38  #ifndef NULL
39  #define NULL 0
40  #endif
41  
42  #ifdef __GNUC__
43  #define __weak                  __attribute__((weak))
44  #ifndef likely
45  #define likely(x)               __builtin_expect ((x), 1)
46  #endif
47  #ifndef unlikely
48  #define unlikely(x)             __builtin_expect ((x), 0)
49  #endif
50  
51  #elif defined(__ICCARM__)
52  #define likely(x)               (x)
53  #define unlikely(x)             (x)
54  
55  #endif
56  
57  typedef unsigned int	        uint;
58  typedef	signed int		        sint;
59  
60  #ifdef __ICCARM__
61  typedef signed long long        __int64_t;
62  typedef unsigned long long      __uint64_t;
63  #endif
64  
65  #define s8                      int8_t
66  #define u8                      uint8_t
67  #define s16                     int16_t
68  #define u16                     uint16_t
69  #define s32                     int32_t
70  #define u32                     uint32_t
71  #define s64                     int64_t
72  #define u64                     uint64_t
73  
74  #ifdef CONFIG_MBED_ENABLED
75  #ifndef BOOL
76  typedef unsigned char           BOOL;
77  #endif
78  #ifndef bool
79  typedef unsigned char           bool;
80  #endif
81  #else
82  #ifndef BOOL
83  typedef unsigned char           BOOL;
84  #endif
85  #ifdef __cplusplus
86  #else
87  #ifndef bool
88  typedef unsigned char           bool;
89  #endif
90  #endif
91  #endif
92  
93  #define UCHAR                   uint8_t
94  #define USHORT                  uint16_t
95  #define UINT                    uint32_t
96  #define ULONG                   uint32_t
97  
98  //typedef struct { volatile int counter; } atomic_t;
99  
100  typedef enum _RTK_STATUS_ {
101      _EXIT_SUCCESS = 0,
102      _EXIT_FAILURE = 1
103  }RTK_STATUS, *PRTK_STATUS;
104  
105  #define IN
106  #define OUT
107  #define VOID void
108  #define INOUT
109  #define NDIS_OID uint
110  #define NDIS_STATUS uint
111  
112  #ifndef	PVOID
113  typedef void * PVOID;
114  #endif
115  
116  typedef     u32 dma_addr_t;
117  
118  typedef     void (*proc_t)(void*);
119  
120  typedef     unsigned int __kernel_size_t;
121  typedef     int __kernel_ssize_t;
122  
123  typedef 	__kernel_size_t	SIZE_T;
124  typedef	    __kernel_ssize_t	SSIZE_T;
125  #define     FIELD_OFFSET(s,field)	((SSIZE_T)&((s*)(0))->field)
126  
127  #define MEM_ALIGNMENT_OFFSET	(sizeof (SIZE_T))
128  #define MEM_ALIGNMENT_PADDING	(sizeof(SIZE_T) - 1)
129  
130  #define SIZE_PTR SIZE_T
131  #define SSIZE_PTR SSIZE_T
132  
133  #ifndef ON
134  #define   ON        1
135  #endif
136  
137  #ifndef OFF
138  #define   OFF       0
139  #endif
140  
141  #ifndef ENABLE
142  #define   ENABLE    1
143  #endif
144  
145  #ifndef DISABLE
146  #define   DISABLE   0
147  #endif
148  
149  
150  #define BIT0	0x0001
151  #define BIT1	0x0002
152  #define BIT2	0x0004
153  #define BIT3	0x0008
154  #define BIT4	0x0010
155  #define BIT5	0x0020
156  #define BIT6	0x0040
157  #define BIT7	0x0080
158  #define BIT8	0x0100
159  #define BIT9	0x0200
160  #define BIT10	0x0400
161  #define BIT11	0x0800
162  #define BIT12	0x1000
163  #define BIT13	0x2000
164  #define BIT14	0x4000
165  #define BIT15	0x8000
166  #define BIT16	0x00010000
167  #define BIT17	0x00020000
168  #define BIT18	0x00040000
169  #define BIT19	0x00080000
170  #define BIT20	0x00100000
171  #define BIT21	0x00200000
172  #define BIT22	0x00400000
173  #define BIT23	0x00800000
174  #define BIT24	0x01000000
175  #define BIT25	0x02000000
176  #define BIT26	0x04000000
177  #define BIT27	0x08000000
178  #define BIT28	0x10000000
179  #define BIT29	0x20000000
180  #define BIT30	0x40000000
181  #define BIT31	0x80000000
182  
183  #define BIT_(__n)       (1<<(__n))
184  
185  #ifndef BIT
186  #define BIT(__n)       (1<<(__n))
187  #endif
188  
189  #if defined (__ICCARM__)
190  #define STRINGIFY(s) #s
191  #define SECTION(_name) _Pragma( STRINGIFY(location=_name))
192  #define ALIGNMTO(_bound) _Pragma( STRINGIFY(data_alignment=_bound))
193  #define _PACKED_       __packed
194  #define _LONG_CALL_
195  #define _WEAK          __weak
196  #define _OPTIMIZE_NONE_           _Pragma( STRINGIFY(optimize=none))
197  #define UNUSED_WARN_DIS
198  #else
199  #define SECTION(_name) __attribute__ ((__section__(_name)))
200  #define ALIGNMTO(_bound) __attribute__ ((aligned (_bound)))
201  #define _PACKED_       __attribute__ ((packed))
202  #define _LONG_CALL_     __attribute__ ((long_call))
203  #define _WEAK           __attribute__ ((weak))
204  #define _OPTIMIZE_NONE_           __attribute__ ((optimize("O0")))
205  #define UNUSED_WARN_DIS	__attribute__((unused))
206  #endif
207  
208  
209  
210  //port from fw by thomas
211  // TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness
212  
213  #define SWAP32(x) ((u32)(                         \
214   			(((u32)(x) & (u32)0x000000ff) << 24) |            \
215   			(((u32)(x) & (u32)0x0000ff00) <<  8) |            \
216   			(((u32)(x) & (u32)0x00ff0000) >>  8) |            \
217   			(((u32)(x) & (u32)0xff000000) >> 24)))
218  
219  #define WAP16(x) ((u16)(                         \
220   			(((u16)(x) & (u16)0x00ff) <<  8) |            \
221   			(((u16)(x) & (u16)0xff00) >>  8)))
222  
223  #if SYSTEM_ENDIAN == PLATFORM_LITTLE_ENDIAN
224  #ifndef rtk_le16_to_cpu
225  #define rtk_cpu_to_le32(x)		((u32)(x))
226  #define rtk_le32_to_cpu(x)		((u32)(x))
227  #define rtk_cpu_to_le16(x)		((u16)(x))
228  #define rtk_le16_to_cpu(x)		((u16)(x))
229  #define rtk_cpu_to_be32(x)		SWAP32((x))
230  #define rtk_be32_to_cpu(x)		SWAP32((x))
231  #define rtk_cpu_to_be16(x)		WAP16((x))
232  #define rtk_be16_to_cpu(x)		WAP16((x))
233  #endif
234  
235  #elif SYSTEM_ENDIAN == PLATFORM_BIG_ENDIAN
236  #ifndef rtk_le16_to_cpu
237  #define rtk_cpu_to_le32(x)		SWAP32((x))
238  #define rtk_le32_to_cpu(x)		SWAP32((x))
239  #define rtk_cpu_to_le16(x)		WAP16((x))
240  #define rtk_le16_to_cpu(x)		WAP16((x))
241  #define rtk_cpu_to_be32(x)		((__u32)(x))
242  #define rtk_be32_to_cpu(x)		((__u32)(x))
243  #define rtk_cpu_to_be16(x)		((__u16)(x))
244  #define rtk_be16_to_cpu(x)		((__u16)(x))
245  #endif
246  #endif
247  
248  
249  /*
250   *	Call endian free function when
251   *		1. Read/write packet content.
252   *		2. Before write integer to IO.
253   *		3. After read integer from IO.
254  */
255  
256  //
257  // Byte Swapping routine.
258  //
259  #define EF1Byte	(u8)
260  #define EF2Byte 	le16_to_cpu
261  #define EF4Byte	le32_to_cpu
262  
263  //
264  // Read LE format data from memory
265  //
266  #define ReadEF1Byte(_ptr)		EF1Byte(*((u8 *)(_ptr)))
267  #define ReadEF2Byte(_ptr)		EF2Byte(*((u16 *)(_ptr)))
268  #define ReadEF4Byte(_ptr)		EF4Byte(*((u32 *)(_ptr)))
269  
270  //
271  // Write LE data to memory
272  //
273  #define WriteEF1Byte(_ptr, _val)	(*((u8 *)(_ptr)))=EF1Byte(_val)
274  #define WriteEF2Byte(_ptr, _val)	(*((u16 *)(_ptr)))=EF2Byte(_val)
275  #define WriteEF4Byte(_ptr, _val)	(*((u32 *)(_ptr)))=EF4Byte(_val)
276  
277  //
278  //	Example:
279  //		BIT_LEN_MASK_32(0) => 0x00000000
280  //		BIT_LEN_MASK_32(1) => 0x00000001
281  //		BIT_LEN_MASK_32(2) => 0x00000003
282  //		BIT_LEN_MASK_32(32) => 0xFFFFFFFF
283  //
284  #define BIT_LEN_MASK_32(__BitLen) \
285  	(0xFFFFFFFF >> (32 - (__BitLen)))
286  //
287  //	Example:
288  //		BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
289  //		BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
290  //
291  #define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \
292  	(BIT_LEN_MASK_32(__BitLen) << (__BitOffset))
293  
294  //
295  //	Description:
296  //		Return 4-byte value in host byte ordering from
297  //		4-byte pointer in litten-endian system.
298  //
299  #define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
300  	(EF4Byte(*((u32 *)(__pStart))))
301  
302  //
303  //	Description:
304  //		Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to
305  //		4-byte value in host byte ordering.
306  //
307  #define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
308  	( \
309  		( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \
310  		& \
311  		BIT_LEN_MASK_32(__BitLen) \
312  	)
313  
314  //
315  //	Description:
316  //		Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering
317  //		and return the result in 4-byte value in host byte ordering.
318  //
319  #define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
320  	( \
321  		LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
322  		& \
323  		( ~ BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \
324  	)
325  
326  //
327  //	Description:
328  //		Set subfield of little-endian 4-byte value to specified value.
329  //
330  #define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \
331  	*((u32 *)(__pStart)) = \
332  		EF4Byte( \
333  			LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
334  			| \
335  			( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \
336  		);
337  
338  
339  #define BIT_LEN_MASK_16(__BitLen) \
340  		(0xFFFF >> (16 - (__BitLen)))
341  
342  #define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \
343  	(BIT_LEN_MASK_16(__BitLen) << (__BitOffset))
344  
345  #define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
346  	(EF2Byte(*((u16 *)(__pStart))))
347  
348  #define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
349  	( \
350  		( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \
351  		& \
352  		BIT_LEN_MASK_16(__BitLen) \
353  	)
354  
355  #define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
356  	( \
357  		LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
358  		& \
359  		( ~ BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \
360  	)
361  
362  #define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \
363  	*((u16 *)(__pStart)) = \
364  		EF2Byte( \
365  			LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
366  			| \
367  			( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \
368  		);
369  
370  #define BIT_LEN_MASK_8(__BitLen) \
371  		(0xFF >> (8 - (__BitLen)))
372  
373  #define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \
374  	(BIT_LEN_MASK_8(__BitLen) << (__BitOffset))
375  
376  #define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
377  	(EF1Byte(*((u8 *)(__pStart))))
378  
379  #define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
380  	( \
381  		( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \
382  		& \
383  		BIT_LEN_MASK_8(__BitLen) \
384  	)
385  
386  #define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
387  	( \
388  		LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
389  		& \
390  		( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \
391  	)
392  
393  #define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \
394  	*((u8 *)(__pStart)) = \
395  		EF1Byte( \
396  			LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
397  			| \
398  			( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \
399  		);
400  
401  //pclint
402  #define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
403  	( \
404  		LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
405  	)
406  
407  //pclint
408  #define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \
409  { \
410  	*((pu1Byte)(__pStart)) = \
411  		EF1Byte( \
412  			LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \
413  			| \
414  			((u1Byte)__Value) \
415  		); \
416  }
417  
418  // Get the N-bytes aligment offset from the current length
419  #define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment))
420  
421  typedef unsigned char	BOOLEAN,*PBOOLEAN;
422  
423  #define TEST_FLAG(__Flag,__testFlag)		(((__Flag) & (__testFlag)) != 0)
424  #define SET_FLAG(__Flag, __setFlag)			((__Flag) |= __setFlag)
425  #define CLEAR_FLAG(__Flag, __clearFlag)		((__Flag) &= ~(__clearFlag))
426  #define CLEAR_FLAGS(__Flag)					((__Flag) = 0)
427  #define TEST_FLAGS(__Flag, __testFlags)		(((__Flag) & (__testFlags)) == (__testFlags))
428  
429  /* Define compilor specific symbol */
430  //
431  // inline function
432  //
433  
434  #if defined ( __ICCARM__ )
435  #define __inline__                      inline
436  #define __inline                        inline
437  #define __inline_definition			//In dialect C99, inline means that a function's definition is provided
438  								//only for inlining, and that there is another definition
439  								//(without inline) somewhere else in the program.
440  								//That means that this program is incomplete, because if
441  								//add isn't inlined (for example, when compiling without optimization),
442  								//then main will have an unresolved reference to that other definition.
443  
444  								// Do not inline function is the function body is defined .c file and this
445  								// function will be called somewhere else, otherwise there is compile error
446  #ifndef   __STATIC_INLINE
447  #define __STATIC_INLINE           _Pragma("inline=forced")
448  #endif
449  #elif defined ( __CC_ARM   )
450  #define __inline__			__inline	//__linine__ is not supported in keil compilor, use __inline instead
451  #define inline				__inline
452  #define __inline_definition			// for dialect C99
453  #elif defined   (  __GNUC__  )
454  #define __inline__                      inline
455  #define __inline                        inline
456  #define __inline_definition		inline
457  #ifndef   __STATIC_INLINE
458  #define __STATIC_INLINE           static inline   __attribute__((always_inline))
459  #endif
460  #endif
461  
462  //
463  // pack
464  //
465  
466  #if defined (__ICCARM__)
467  
468  #define RTW_PACK_STRUCT_BEGIN _Pragma( STRINGIFY(pack(1)))
469  #define RTW_PACK_STRUCT_STRUCT
470  #define RTW_PACK_STRUCT_END _Pragma( STRINGIFY(pack()))
471  //#define RTW_PACK_STRUCT_USE_INCLUDES
472  
473  #elif defined (__CC_ARM)
474  
475  #define RTW_PACK_STRUCT_BEGIN __packed
476  #define RTW_PACK_STRUCT_STRUCT
477  #define RTW_PACK_STRUCT_END
478  
479  #elif defined (__GNUC__)
480  
481  #define RTW_PACK_STRUCT_BEGIN
482  #define RTW_PACK_STRUCT_STRUCT __attribute__ ((__packed__))
483  #define RTW_PACK_STRUCT_END
484  
485  #elif defined(PLATFORM_WINDOWS)
486  
487  #define RTW_PACK_STRUCT_BEGIN
488  #define RTW_PACK_STRUCT_STRUCT
489  #define RTW_PACK_STRUCT_END
490  #define RTW_PACK_STRUCT_USE_INCLUDES
491  #endif
492  
493  // for standard library
494  #ifdef __ICCARM__
495  #define __extension__		/* Ignore */
496  #define	__restrict			/* Ignore */
497  #endif
498  
499  #if defined (__ARM_FEATURE_CMSE)
500  #ifdef __ICCARM__
501  #define NS_ENTRY    __cmse_nonsecure_entry
502  #else
503  #define NS_ENTRY    __attribute__((cmse_nonsecure_entry))
504  #endif
505  #if defined (ARM_CORE_CM4)
506  #ifdef __ICCARM__
507  typedef __cmse_nonsecure_call void nsfunc(void);
508  #else
509  typedef void __attribute__((cmse_nonsecure_call)) nsfunc(void);
510  #endif
511  #endif
512  #endif
513  
514  typedef struct {
515  	VOID (*RamStartFun) (VOID);
516  	VOID (*RamWakeupFun) (VOID);
517  	u32 VectorNS;
518  }RAM_START_FUNCTION, *PRAM_START_FUNCTION;
519  
520  typedef struct _RAM_FUNCTION_START_TABLE_ {
521  	VOID (*RamStartFun) (VOID);
522  	VOID (*RamWakeupFun) (VOID);
523  	VOID (*RamPatchFun0) (VOID);
524  	VOID (*RamPatchFun1) (VOID);
525  	VOID (*RamPatchFun2) (VOID);
526  	VOID (*FlashStartFun) (VOID);
527  	u32 Img1ValidCode;
528  	u32 Img1Rsvd;
529  }RAM_FUNCTION_START_TABLE, *PRAM_FUNCTION_START_TABLE;
530  
531  typedef struct _DSLP_RETENTION_FUNC_TABLE_ {
532  	VOID (*DSLPPatchFun0) (VOID);
533  	u32	PatchLen;
534  }DSLP_RETENTION_FUNC_TABLE, *PDSLP_RETENTION_FUNC_TABLE;
535  
536  #endif// __BASIC_TYPES_H__
537