xref: /nrf52832-nimble/rt-thread/include/rtdef.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2007-01-10     Bernard      the first version
9*10465441SEvalZero  * 2008-07-12     Bernard      remove all rt_int8, rt_uint32_t etc typedef
10*10465441SEvalZero  * 2010-10-26     yi.qiu       add module support
11*10465441SEvalZero  * 2010-11-10     Bernard      add cleanup callback function in thread exit.
12*10465441SEvalZero  * 2011-05-09     Bernard      use builtin va_arg in GCC 4.x
13*10465441SEvalZero  * 2012-11-16     Bernard      change RT_NULL from ((void*)0) to 0.
14*10465441SEvalZero  * 2012-12-29     Bernard      change the RT_USING_MEMPOOL location and add
15*10465441SEvalZero  *                             RT_USING_MEMHEAP condition.
16*10465441SEvalZero  * 2012-12-30     Bernard      add more control command for graphic.
17*10465441SEvalZero  * 2013-01-09     Bernard      change version number.
18*10465441SEvalZero  * 2015-02-01     Bernard      change version number to v2.1.0
19*10465441SEvalZero  * 2017-08-31     Bernard      change version number to v3.0.0
20*10465441SEvalZero  * 2017-11-30     Bernard      change version number to v3.0.1
21*10465441SEvalZero  * 2017-12-27     Bernard      change version number to v3.0.2
22*10465441SEvalZero  * 2018-02-24     Bernard      change version number to v3.0.3
23*10465441SEvalZero  * 2018-04-25     Bernard      change version number to v3.0.4
24*10465441SEvalZero  * 2018-05-31     Bernard      change version number to v3.1.0
25*10465441SEvalZero  * 2018-09-04     Bernard      change version number to v3.1.1
26*10465441SEvalZero  * 2018-09-14     Bernard      apply Apache License v2.0 to RT-Thread Kernel
27*10465441SEvalZero  * 2018-10-13     Bernard      change version number to v4.0.0
28*10465441SEvalZero  * 2018-10-02     Bernard      add 64bit arch support
29*10465441SEvalZero  * 2018-11-22     Jesven       add smp member to struct rt_thread
30*10465441SEvalZero  *                             add struct rt_cpu
31*10465441SEvalZero  *                             add smp relevant macros
32*10465441SEvalZero  */
33*10465441SEvalZero 
34*10465441SEvalZero #ifndef __RT_DEF_H__
35*10465441SEvalZero #define __RT_DEF_H__
36*10465441SEvalZero 
37*10465441SEvalZero /* include rtconfig header to import configuration */
38*10465441SEvalZero #include <rtconfig.h>
39*10465441SEvalZero 
40*10465441SEvalZero #ifdef __cplusplus
41*10465441SEvalZero extern "C" {
42*10465441SEvalZero #endif
43*10465441SEvalZero 
44*10465441SEvalZero /**
45*10465441SEvalZero  * @addtogroup BasicDef
46*10465441SEvalZero  */
47*10465441SEvalZero 
48*10465441SEvalZero /**@{*/
49*10465441SEvalZero 
50*10465441SEvalZero /* RT-Thread version information */
51*10465441SEvalZero #define RT_VERSION                      4L              /**< major version number */
52*10465441SEvalZero #define RT_SUBVERSION                   0L              /**< minor version number */
53*10465441SEvalZero #define RT_REVISION                     0L              /**< revise version number */
54*10465441SEvalZero 
55*10465441SEvalZero /* RT-Thread version */
56*10465441SEvalZero #define RTTHREAD_VERSION                ((RT_VERSION * 10000) + \
57*10465441SEvalZero                                          (RT_SUBVERSION * 100) + RT_REVISION)
58*10465441SEvalZero 
59*10465441SEvalZero /* RT-Thread basic data type definitions */
60*10465441SEvalZero typedef signed   char                   rt_int8_t;      /**<  8bit integer type */
61*10465441SEvalZero typedef signed   short                  rt_int16_t;     /**< 16bit integer type */
62*10465441SEvalZero typedef signed   int                    rt_int32_t;     /**< 32bit integer type */
63*10465441SEvalZero typedef unsigned char                   rt_uint8_t;     /**<  8bit unsigned integer type */
64*10465441SEvalZero typedef unsigned short                  rt_uint16_t;    /**< 16bit unsigned integer type */
65*10465441SEvalZero typedef unsigned int                    rt_uint32_t;    /**< 32bit unsigned integer type */
66*10465441SEvalZero 
67*10465441SEvalZero #ifdef ARCH_CPU_64BIT
68*10465441SEvalZero typedef signed long                     rt_int64_t;     /**< 64bit integer type */
69*10465441SEvalZero typedef unsigned long                   rt_uint64_t;    /**< 64bit unsigned integer type */
70*10465441SEvalZero #else
71*10465441SEvalZero typedef signed long long                rt_int64_t;     /**< 64bit integer type */
72*10465441SEvalZero typedef unsigned long long              rt_uint64_t;    /**< 64bit unsigned integer type */
73*10465441SEvalZero #endif
74*10465441SEvalZero 
75*10465441SEvalZero typedef int                             rt_bool_t;      /**< boolean type */
76*10465441SEvalZero typedef long                            rt_base_t;      /**< Nbit CPU related date type */
77*10465441SEvalZero typedef unsigned long                   rt_ubase_t;     /**< Nbit unsigned CPU related data type */
78*10465441SEvalZero 
79*10465441SEvalZero typedef rt_base_t                       rt_err_t;       /**< Type for error number */
80*10465441SEvalZero typedef rt_uint32_t                     rt_time_t;      /**< Type for time stamp */
81*10465441SEvalZero typedef rt_uint32_t                     rt_tick_t;      /**< Type for tick count */
82*10465441SEvalZero typedef rt_base_t                       rt_flag_t;      /**< Type for flags */
83*10465441SEvalZero typedef rt_ubase_t                      rt_size_t;      /**< Type for size number */
84*10465441SEvalZero typedef rt_ubase_t                      rt_dev_t;       /**< Type for device */
85*10465441SEvalZero typedef rt_base_t                       rt_off_t;       /**< Type for offset */
86*10465441SEvalZero 
87*10465441SEvalZero /* boolean type definitions */
88*10465441SEvalZero #define RT_TRUE                         1               /**< boolean true  */
89*10465441SEvalZero #define RT_FALSE                        0               /**< boolean fails */
90*10465441SEvalZero 
91*10465441SEvalZero /**@}*/
92*10465441SEvalZero 
93*10465441SEvalZero /* maximum value of base type */
94*10465441SEvalZero #define RT_UINT8_MAX                    0xff            /**< Maxium number of UINT8 */
95*10465441SEvalZero #define RT_UINT16_MAX                   0xffff          /**< Maxium number of UINT16 */
96*10465441SEvalZero #define RT_UINT32_MAX                   0xffffffff      /**< Maxium number of UINT32 */
97*10465441SEvalZero #define RT_TICK_MAX                     RT_UINT32_MAX   /**< Maxium number of tick */
98*10465441SEvalZero 
99*10465441SEvalZero #if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
100*10465441SEvalZero #define __CLANG_ARM
101*10465441SEvalZero #endif
102*10465441SEvalZero 
103*10465441SEvalZero /* Compiler Related Definitions */
104*10465441SEvalZero #if defined(__CC_ARM) || defined(__CLANG_ARM)           /* ARM Compiler */
105*10465441SEvalZero     #include <stdarg.h>
106*10465441SEvalZero     #define SECTION(x)                  __attribute__((section(x)))
107*10465441SEvalZero     #define RT_UNUSED                   __attribute__((unused))
108*10465441SEvalZero     #define RT_USED                     __attribute__((used))
109*10465441SEvalZero     #define ALIGN(n)                    __attribute__((aligned(n)))
110*10465441SEvalZero 
111*10465441SEvalZero     #define RT_WEAK                     __attribute__((weak))
112*10465441SEvalZero     #define rt_inline                   static __inline
113*10465441SEvalZero     /* module compiling */
114*10465441SEvalZero     #ifdef RT_USING_MODULE
115*10465441SEvalZero         #define RTT_API                 __declspec(dllimport)
116*10465441SEvalZero     #else
117*10465441SEvalZero         #define RTT_API                 __declspec(dllexport)
118*10465441SEvalZero     #endif
119*10465441SEvalZero 
120*10465441SEvalZero #elif defined (__IAR_SYSTEMS_ICC__)     /* for IAR Compiler */
121*10465441SEvalZero     #include <stdarg.h>
122*10465441SEvalZero     #define SECTION(x)                  @ x
123*10465441SEvalZero     #define RT_UNUSED
124*10465441SEvalZero     #define RT_USED                     __root
125*10465441SEvalZero     #define PRAGMA(x)                   _Pragma(#x)
126*10465441SEvalZero     #define ALIGN(n)                    PRAGMA(data_alignment=n)
127*10465441SEvalZero     #define RT_WEAK                     __weak
128*10465441SEvalZero     #define rt_inline                   static inline
129*10465441SEvalZero     #define RTT_API
130*10465441SEvalZero 
131*10465441SEvalZero #elif defined (__GNUC__)                /* GNU GCC Compiler */
132*10465441SEvalZero     #ifdef RT_USING_NEWLIB
133*10465441SEvalZero         #include <stdarg.h>
134*10465441SEvalZero     #else
135*10465441SEvalZero         /* the version of GNU GCC must be greater than 4.x */
136*10465441SEvalZero         typedef __builtin_va_list       __gnuc_va_list;
137*10465441SEvalZero         typedef __gnuc_va_list          va_list;
138*10465441SEvalZero         #define va_start(v,l)           __builtin_va_start(v,l)
139*10465441SEvalZero         #define va_end(v)               __builtin_va_end(v)
140*10465441SEvalZero         #define va_arg(v,l)             __builtin_va_arg(v,l)
141*10465441SEvalZero     #endif
142*10465441SEvalZero 
143*10465441SEvalZero     #define SECTION(x)                  __attribute__((section(x)))
144*10465441SEvalZero     #define RT_UNUSED                   __attribute__((unused))
145*10465441SEvalZero     #define RT_USED                     __attribute__((used))
146*10465441SEvalZero     #define ALIGN(n)                    __attribute__((aligned(n)))
147*10465441SEvalZero     #define RT_WEAK                     __attribute__((weak))
148*10465441SEvalZero     #define rt_inline                   static __inline
149*10465441SEvalZero     #define RTT_API
150*10465441SEvalZero #elif defined (__ADSPBLACKFIN__)        /* for VisualDSP++ Compiler */
151*10465441SEvalZero     #include <stdarg.h>
152*10465441SEvalZero     #define SECTION(x)                  __attribute__((section(x)))
153*10465441SEvalZero     #define RT_UNUSED                   __attribute__((unused))
154*10465441SEvalZero     #define RT_USED                     __attribute__((used))
155*10465441SEvalZero     #define ALIGN(n)                    __attribute__((aligned(n)))
156*10465441SEvalZero     #define RT_WEAK                     __attribute__((weak))
157*10465441SEvalZero     #define rt_inline                   static inline
158*10465441SEvalZero     #define RTT_API
159*10465441SEvalZero #elif defined (_MSC_VER)
160*10465441SEvalZero     #include <stdarg.h>
161*10465441SEvalZero     #define SECTION(x)
162*10465441SEvalZero     #define RT_UNUSED
163*10465441SEvalZero     #define RT_USED
164*10465441SEvalZero     #define ALIGN(n)                    __declspec(align(n))
165*10465441SEvalZero     #define RT_WEAK
166*10465441SEvalZero     #define rt_inline                   static __inline
167*10465441SEvalZero     #define RTT_API
168*10465441SEvalZero #elif defined (__TI_COMPILER_VERSION__)
169*10465441SEvalZero     #include <stdarg.h>
170*10465441SEvalZero     /* The way that TI compiler set section is different from other(at least
171*10465441SEvalZero      * GCC and MDK) compilers. See ARM Optimizing C/C++ Compiler 5.9.3 for more
172*10465441SEvalZero      * details. */
173*10465441SEvalZero     #define SECTION(x)
174*10465441SEvalZero     #define RT_UNUSED
175*10465441SEvalZero     #define RT_USED
176*10465441SEvalZero     #define PRAGMA(x)                   _Pragma(#x)
177*10465441SEvalZero     #define ALIGN(n)
178*10465441SEvalZero     #define RT_WEAK
179*10465441SEvalZero     #define rt_inline                   static inline
180*10465441SEvalZero     #define RTT_API
181*10465441SEvalZero #else
182*10465441SEvalZero     #error not supported tool chain
183*10465441SEvalZero #endif
184*10465441SEvalZero 
185*10465441SEvalZero /* initialization export */
186*10465441SEvalZero #ifdef RT_USING_COMPONENTS_INIT
187*10465441SEvalZero typedef int (*init_fn_t)(void);
188*10465441SEvalZero #ifdef _MSC_VER /* we do not support MS VC++ compiler */
189*10465441SEvalZero     #define INIT_EXPORT(fn, level)
190*10465441SEvalZero #else
191*10465441SEvalZero     #if RT_DEBUG_INIT
192*10465441SEvalZero         struct rt_init_desc
193*10465441SEvalZero         {
194*10465441SEvalZero             const char* fn_name;
195*10465441SEvalZero             const init_fn_t fn;
196*10465441SEvalZero         };
197*10465441SEvalZero         #define INIT_EXPORT(fn, level)                                                       \
198*10465441SEvalZero             const char __rti_##fn##_name[] = #fn;                                            \
199*10465441SEvalZero             RT_USED const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn."level) = \
200*10465441SEvalZero             { __rti_##fn##_name, fn};
201*10465441SEvalZero     #else
202*10465441SEvalZero         #define INIT_EXPORT(fn, level)                                                       \
203*10465441SEvalZero             RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn."level) = fn
204*10465441SEvalZero     #endif
205*10465441SEvalZero #endif
206*10465441SEvalZero #else
207*10465441SEvalZero #define INIT_EXPORT(fn, level)
208*10465441SEvalZero #endif
209*10465441SEvalZero 
210*10465441SEvalZero /* board init routines will be called in board_init() function */
211*10465441SEvalZero #define INIT_BOARD_EXPORT(fn)           INIT_EXPORT(fn, "1")
212*10465441SEvalZero 
213*10465441SEvalZero /* pre/device/component/env/app init routines will be called in init_thread */
214*10465441SEvalZero /* components pre-initialization (pure software initilization) */
215*10465441SEvalZero #define INIT_PREV_EXPORT(fn)            INIT_EXPORT(fn, "2")
216*10465441SEvalZero /* device initialization */
217*10465441SEvalZero #define INIT_DEVICE_EXPORT(fn)          INIT_EXPORT(fn, "3")
218*10465441SEvalZero /* components initialization (dfs, lwip, ...) */
219*10465441SEvalZero #define INIT_COMPONENT_EXPORT(fn)       INIT_EXPORT(fn, "4")
220*10465441SEvalZero /* environment initialization (mount disk, ...) */
221*10465441SEvalZero #define INIT_ENV_EXPORT(fn)             INIT_EXPORT(fn, "5")
222*10465441SEvalZero /* appliation initialization (rtgui application etc ...) */
223*10465441SEvalZero #define INIT_APP_EXPORT(fn)             INIT_EXPORT(fn, "6")
224*10465441SEvalZero 
225*10465441SEvalZero #if !defined(RT_USING_FINSH)
226*10465441SEvalZero /* define these to empty, even if not include finsh.h file */
227*10465441SEvalZero #define FINSH_FUNCTION_EXPORT(name, desc)
228*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc)
229*10465441SEvalZero #define FINSH_VAR_EXPORT(name, type, desc)
230*10465441SEvalZero 
231*10465441SEvalZero #define MSH_CMD_EXPORT(command, desc)
232*10465441SEvalZero #define MSH_CMD_EXPORT_ALIAS(command, alias, desc)
233*10465441SEvalZero #elif !defined(FINSH_USING_SYMTAB)
234*10465441SEvalZero #define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)
235*10465441SEvalZero #endif
236*10465441SEvalZero 
237*10465441SEvalZero /* event length */
238*10465441SEvalZero #define RT_EVENT_LENGTH                 32
239*10465441SEvalZero 
240*10465441SEvalZero /* memory management option */
241*10465441SEvalZero #define RT_MM_PAGE_SIZE                 4096
242*10465441SEvalZero #define RT_MM_PAGE_MASK                 (RT_MM_PAGE_SIZE - 1)
243*10465441SEvalZero #define RT_MM_PAGE_BITS                 12
244*10465441SEvalZero 
245*10465441SEvalZero /* kernel malloc definitions */
246*10465441SEvalZero #ifndef RT_KERNEL_MALLOC
247*10465441SEvalZero #define RT_KERNEL_MALLOC(sz)            rt_malloc(sz)
248*10465441SEvalZero #endif
249*10465441SEvalZero 
250*10465441SEvalZero #ifndef RT_KERNEL_FREE
251*10465441SEvalZero #define RT_KERNEL_FREE(ptr)             rt_free(ptr)
252*10465441SEvalZero #endif
253*10465441SEvalZero 
254*10465441SEvalZero #ifndef RT_KERNEL_REALLOC
255*10465441SEvalZero #define RT_KERNEL_REALLOC(ptr, size)    rt_realloc(ptr, size)
256*10465441SEvalZero #endif
257*10465441SEvalZero 
258*10465441SEvalZero /**
259*10465441SEvalZero  * @addtogroup Error
260*10465441SEvalZero  */
261*10465441SEvalZero 
262*10465441SEvalZero /**@{*/
263*10465441SEvalZero 
264*10465441SEvalZero /* RT-Thread error code definitions */
265*10465441SEvalZero #define RT_EOK                          0               /**< There is no error */
266*10465441SEvalZero #define RT_ERROR                        1               /**< A generic error happens */
267*10465441SEvalZero #define RT_ETIMEOUT                     2               /**< Timed out */
268*10465441SEvalZero #define RT_EFULL                        3               /**< The resource is full */
269*10465441SEvalZero #define RT_EEMPTY                       4               /**< The resource is empty */
270*10465441SEvalZero #define RT_ENOMEM                       5               /**< No memory */
271*10465441SEvalZero #define RT_ENOSYS                       6               /**< No system */
272*10465441SEvalZero #define RT_EBUSY                        7               /**< Busy */
273*10465441SEvalZero #define RT_EIO                          8               /**< IO error */
274*10465441SEvalZero #define RT_EINTR                        9               /**< Interrupted system call */
275*10465441SEvalZero #define RT_EINVAL                       10              /**< Invalid argument */
276*10465441SEvalZero 
277*10465441SEvalZero /**@}*/
278*10465441SEvalZero 
279*10465441SEvalZero /**
280*10465441SEvalZero  * @ingroup BasicDef
281*10465441SEvalZero  *
282*10465441SEvalZero  * @def RT_ALIGN(size, align)
283*10465441SEvalZero  * Return the most contiguous size aligned at specified width. RT_ALIGN(13, 4)
284*10465441SEvalZero  * would return 16.
285*10465441SEvalZero  */
286*10465441SEvalZero #define RT_ALIGN(size, align)           (((size) + (align) - 1) & ~((align) - 1))
287*10465441SEvalZero 
288*10465441SEvalZero /**
289*10465441SEvalZero  * @ingroup BasicDef
290*10465441SEvalZero  *
291*10465441SEvalZero  * @def RT_ALIGN_DOWN(size, align)
292*10465441SEvalZero  * Return the down number of aligned at specified width. RT_ALIGN_DOWN(13, 4)
293*10465441SEvalZero  * would return 12.
294*10465441SEvalZero  */
295*10465441SEvalZero #define RT_ALIGN_DOWN(size, align)      ((size) & ~((align) - 1))
296*10465441SEvalZero 
297*10465441SEvalZero /**
298*10465441SEvalZero  * @ingroup BasicDef
299*10465441SEvalZero  *
300*10465441SEvalZero  * @def RT_NULL
301*10465441SEvalZero  * Similar as the \c NULL in C library.
302*10465441SEvalZero  */
303*10465441SEvalZero #define RT_NULL                         (0)
304*10465441SEvalZero 
305*10465441SEvalZero /**
306*10465441SEvalZero  * Double List structure
307*10465441SEvalZero  */
308*10465441SEvalZero struct rt_list_node
309*10465441SEvalZero {
310*10465441SEvalZero     struct rt_list_node *next;                          /**< point to next node. */
311*10465441SEvalZero     struct rt_list_node *prev;                          /**< point to prev node. */
312*10465441SEvalZero };
313*10465441SEvalZero typedef struct rt_list_node rt_list_t;                  /**< Type for lists. */
314*10465441SEvalZero 
315*10465441SEvalZero /**
316*10465441SEvalZero  * Single List structure
317*10465441SEvalZero  */
318*10465441SEvalZero struct rt_slist_node
319*10465441SEvalZero {
320*10465441SEvalZero     struct rt_slist_node *next;                         /**< point to next node. */
321*10465441SEvalZero };
322*10465441SEvalZero typedef struct rt_slist_node rt_slist_t;                /**< Type for single list. */
323*10465441SEvalZero 
324*10465441SEvalZero /**
325*10465441SEvalZero  * @addtogroup KernelObject
326*10465441SEvalZero  */
327*10465441SEvalZero 
328*10465441SEvalZero /**@{*/
329*10465441SEvalZero 
330*10465441SEvalZero /*
331*10465441SEvalZero  * kernel object macros
332*10465441SEvalZero  */
333*10465441SEvalZero #define RT_OBJECT_FLAG_MODULE           0x80            /**< is module object. */
334*10465441SEvalZero 
335*10465441SEvalZero /**
336*10465441SEvalZero  * Base structure of Kernel object
337*10465441SEvalZero  */
338*10465441SEvalZero struct rt_object
339*10465441SEvalZero {
340*10465441SEvalZero     char       name[RT_NAME_MAX];                       /**< name of kernel object */
341*10465441SEvalZero     rt_uint8_t type;                                    /**< type of kernel object */
342*10465441SEvalZero     rt_uint8_t flag;                                    /**< flag of kernel object */
343*10465441SEvalZero 
344*10465441SEvalZero #ifdef RT_USING_MODULE
345*10465441SEvalZero     void      *module_id;                               /**< id of application module */
346*10465441SEvalZero #endif
347*10465441SEvalZero     rt_list_t  list;                                    /**< list node of kernel object */
348*10465441SEvalZero };
349*10465441SEvalZero typedef struct rt_object *rt_object_t;                  /**< Type for kernel objects. */
350*10465441SEvalZero 
351*10465441SEvalZero /**
352*10465441SEvalZero  *  The object type can be one of the follows with specific
353*10465441SEvalZero  *  macros enabled:
354*10465441SEvalZero  *  - Thread
355*10465441SEvalZero  *  - Semaphore
356*10465441SEvalZero  *  - Mutex
357*10465441SEvalZero  *  - Event
358*10465441SEvalZero  *  - MailBox
359*10465441SEvalZero  *  - MessageQueue
360*10465441SEvalZero  *  - MemHeap
361*10465441SEvalZero  *  - MemPool
362*10465441SEvalZero  *  - Device
363*10465441SEvalZero  *  - Timer
364*10465441SEvalZero  *  - Module
365*10465441SEvalZero  *  - Unknown
366*10465441SEvalZero  *  - Static
367*10465441SEvalZero  */
368*10465441SEvalZero enum rt_object_class_type
369*10465441SEvalZero {
370*10465441SEvalZero     RT_Object_Class_Null   = 0,                         /**< The object is not used. */
371*10465441SEvalZero     RT_Object_Class_Thread,                             /**< The object is a thread. */
372*10465441SEvalZero     RT_Object_Class_Semaphore,                          /**< The object is a semaphore. */
373*10465441SEvalZero     RT_Object_Class_Mutex,                              /**< The object is a mutex. */
374*10465441SEvalZero     RT_Object_Class_Event,                              /**< The object is a event. */
375*10465441SEvalZero     RT_Object_Class_MailBox,                            /**< The object is a mail box. */
376*10465441SEvalZero     RT_Object_Class_MessageQueue,                       /**< The object is a message queue. */
377*10465441SEvalZero     RT_Object_Class_MemHeap,                            /**< The object is a memory heap */
378*10465441SEvalZero     RT_Object_Class_MemPool,                            /**< The object is a memory pool. */
379*10465441SEvalZero     RT_Object_Class_Device,                             /**< The object is a device */
380*10465441SEvalZero     RT_Object_Class_Timer,                              /**< The object is a timer. */
381*10465441SEvalZero     RT_Object_Class_Module,                             /**< The object is a module. */
382*10465441SEvalZero     RT_Object_Class_Unknown,                            /**< The object is unknown. */
383*10465441SEvalZero     RT_Object_Class_Static = 0x80                       /**< The object is a static object. */
384*10465441SEvalZero };
385*10465441SEvalZero 
386*10465441SEvalZero /**
387*10465441SEvalZero  * The information of the kernel object
388*10465441SEvalZero  */
389*10465441SEvalZero struct rt_object_information
390*10465441SEvalZero {
391*10465441SEvalZero     enum rt_object_class_type type;                     /**< object class type */
392*10465441SEvalZero     rt_list_t                 object_list;              /**< object list */
393*10465441SEvalZero     rt_size_t                 object_size;              /**< object size */
394*10465441SEvalZero };
395*10465441SEvalZero 
396*10465441SEvalZero /**
397*10465441SEvalZero  * The hook function call macro
398*10465441SEvalZero  */
399*10465441SEvalZero #ifdef RT_USING_HOOK
400*10465441SEvalZero #define RT_OBJECT_HOOK_CALL(func, argv) \
401*10465441SEvalZero     do { if ((func) != RT_NULL) func argv; } while (0)
402*10465441SEvalZero #else
403*10465441SEvalZero #define RT_OBJECT_HOOK_CALL(func, argv)
404*10465441SEvalZero #endif
405*10465441SEvalZero 
406*10465441SEvalZero /**@}*/
407*10465441SEvalZero 
408*10465441SEvalZero /**
409*10465441SEvalZero  * @addtogroup Clock
410*10465441SEvalZero  */
411*10465441SEvalZero 
412*10465441SEvalZero /**@{*/
413*10465441SEvalZero 
414*10465441SEvalZero /**
415*10465441SEvalZero  * clock & timer macros
416*10465441SEvalZero  */
417*10465441SEvalZero #define RT_TIMER_FLAG_DEACTIVATED       0x0             /**< timer is deactive */
418*10465441SEvalZero #define RT_TIMER_FLAG_ACTIVATED         0x1             /**< timer is active */
419*10465441SEvalZero #define RT_TIMER_FLAG_ONE_SHOT          0x0             /**< one shot timer */
420*10465441SEvalZero #define RT_TIMER_FLAG_PERIODIC          0x2             /**< periodic timer */
421*10465441SEvalZero 
422*10465441SEvalZero #define RT_TIMER_FLAG_HARD_TIMER        0x0             /**< hard timer,the timer's callback function will be called in tick isr. */
423*10465441SEvalZero #define RT_TIMER_FLAG_SOFT_TIMER        0x4             /**< soft timer,the timer's callback function will be called in timer thread. */
424*10465441SEvalZero 
425*10465441SEvalZero #define RT_TIMER_CTRL_SET_TIME          0x0             /**< set timer control command */
426*10465441SEvalZero #define RT_TIMER_CTRL_GET_TIME          0x1             /**< get timer control command */
427*10465441SEvalZero #define RT_TIMER_CTRL_SET_ONESHOT       0x2             /**< change timer to one shot */
428*10465441SEvalZero #define RT_TIMER_CTRL_SET_PERIODIC      0x3             /**< change timer to periodic */
429*10465441SEvalZero 
430*10465441SEvalZero #ifndef RT_TIMER_SKIP_LIST_LEVEL
431*10465441SEvalZero #define RT_TIMER_SKIP_LIST_LEVEL          1
432*10465441SEvalZero #endif
433*10465441SEvalZero 
434*10465441SEvalZero /* 1 or 3 */
435*10465441SEvalZero #ifndef RT_TIMER_SKIP_LIST_MASK
436*10465441SEvalZero #define RT_TIMER_SKIP_LIST_MASK         0x3
437*10465441SEvalZero #endif
438*10465441SEvalZero 
439*10465441SEvalZero /**
440*10465441SEvalZero  * timer structure
441*10465441SEvalZero  */
442*10465441SEvalZero struct rt_timer
443*10465441SEvalZero {
444*10465441SEvalZero     struct rt_object parent;                            /**< inherit from rt_object */
445*10465441SEvalZero 
446*10465441SEvalZero     rt_list_t        row[RT_TIMER_SKIP_LIST_LEVEL];
447*10465441SEvalZero 
448*10465441SEvalZero     void (*timeout_func)(void *parameter);              /**< timeout function */
449*10465441SEvalZero     void            *parameter;                         /**< timeout function's parameter */
450*10465441SEvalZero 
451*10465441SEvalZero     rt_tick_t        init_tick;                         /**< timer timeout tick */
452*10465441SEvalZero     rt_tick_t        timeout_tick;                      /**< timeout tick */
453*10465441SEvalZero };
454*10465441SEvalZero typedef struct rt_timer *rt_timer_t;
455*10465441SEvalZero 
456*10465441SEvalZero /**@}*/
457*10465441SEvalZero 
458*10465441SEvalZero /**
459*10465441SEvalZero  * @addtogroup Signal
460*10465441SEvalZero  */
461*10465441SEvalZero #ifdef RT_USING_SIGNALS
462*10465441SEvalZero #include <libc/libc_signal.h>
463*10465441SEvalZero typedef unsigned long rt_sigset_t;
464*10465441SEvalZero typedef void (*rt_sighandler_t)(int signo);
465*10465441SEvalZero typedef siginfo_t rt_siginfo_t;
466*10465441SEvalZero 
467*10465441SEvalZero #define RT_SIG_MAX          32
468*10465441SEvalZero #endif
469*10465441SEvalZero /**@}*/
470*10465441SEvalZero 
471*10465441SEvalZero /**
472*10465441SEvalZero  * @addtogroup Thread
473*10465441SEvalZero  */
474*10465441SEvalZero 
475*10465441SEvalZero /**@{*/
476*10465441SEvalZero 
477*10465441SEvalZero /*
478*10465441SEvalZero  * Thread
479*10465441SEvalZero  */
480*10465441SEvalZero 
481*10465441SEvalZero /*
482*10465441SEvalZero  * thread state definitions
483*10465441SEvalZero  */
484*10465441SEvalZero #define RT_THREAD_INIT                  0x00                /**< Initialized status */
485*10465441SEvalZero #define RT_THREAD_READY                 0x01                /**< Ready status */
486*10465441SEvalZero #define RT_THREAD_SUSPEND               0x02                /**< Suspend status */
487*10465441SEvalZero #define RT_THREAD_RUNNING               0x03                /**< Running status */
488*10465441SEvalZero #define RT_THREAD_BLOCK                 RT_THREAD_SUSPEND   /**< Blocked status */
489*10465441SEvalZero #define RT_THREAD_CLOSE                 0x04                /**< Closed status */
490*10465441SEvalZero #define RT_THREAD_STAT_MASK             0x0f
491*10465441SEvalZero 
492*10465441SEvalZero #define RT_THREAD_STAT_SIGNAL           0x10
493*10465441SEvalZero #define RT_THREAD_STAT_SIGNAL_READY     (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
494*10465441SEvalZero #define RT_THREAD_STAT_SIGNAL_WAIT      0x20
495*10465441SEvalZero #define RT_THREAD_STAT_SIGNAL_MASK      0xf0
496*10465441SEvalZero 
497*10465441SEvalZero /**
498*10465441SEvalZero  * thread control command definitions
499*10465441SEvalZero  */
500*10465441SEvalZero #define RT_THREAD_CTRL_STARTUP          0x00                /**< Startup thread. */
501*10465441SEvalZero #define RT_THREAD_CTRL_CLOSE            0x01                /**< Close thread. */
502*10465441SEvalZero #define RT_THREAD_CTRL_CHANGE_PRIORITY  0x02                /**< Change thread priority. */
503*10465441SEvalZero #define RT_THREAD_CTRL_INFO             0x03                /**< Get thread information. */
504*10465441SEvalZero #define RT_THREAD_CTRL_BIND_CPU         0x04                /**< Set thread bind cpu. */
505*10465441SEvalZero 
506*10465441SEvalZero #ifdef RT_USING_SMP
507*10465441SEvalZero 
508*10465441SEvalZero #define RT_CPU_DETACHED                 RT_CPUS_NR          /**< The thread not running on cpu. */
509*10465441SEvalZero #define RT_CPU_MASK                     ((1 << RT_CPUS_NR) - 1) /**< All CPUs mask bit. */
510*10465441SEvalZero 
511*10465441SEvalZero #ifndef RT_SCHEDULE_IPI
512*10465441SEvalZero #define RT_SCHEDULE_IPI                 0
513*10465441SEvalZero #endif
514*10465441SEvalZero 
515*10465441SEvalZero /**
516*10465441SEvalZero  * CPUs definitions
517*10465441SEvalZero  *
518*10465441SEvalZero  */
519*10465441SEvalZero struct rt_cpu
520*10465441SEvalZero {
521*10465441SEvalZero     struct rt_thread *current_thread;
522*10465441SEvalZero 
523*10465441SEvalZero     rt_uint16_t irq_nest;
524*10465441SEvalZero     rt_uint8_t  irq_switch_flag;
525*10465441SEvalZero 
526*10465441SEvalZero     rt_uint8_t current_priority;
527*10465441SEvalZero     rt_list_t priority_table[RT_THREAD_PRIORITY_MAX];
528*10465441SEvalZero #if RT_THREAD_PRIORITY_MAX > 32
529*10465441SEvalZero     rt_uint32_t priority_group;
530*10465441SEvalZero     rt_uint8_t ready_table[32];
531*10465441SEvalZero #else
532*10465441SEvalZero     rt_uint32_t priority_group;
533*10465441SEvalZero #endif
534*10465441SEvalZero 
535*10465441SEvalZero     rt_tick_t tick;
536*10465441SEvalZero };
537*10465441SEvalZero 
538*10465441SEvalZero #endif
539*10465441SEvalZero 
540*10465441SEvalZero /**
541*10465441SEvalZero  * Thread structure
542*10465441SEvalZero  */
543*10465441SEvalZero struct rt_thread
544*10465441SEvalZero {
545*10465441SEvalZero     /* rt object */
546*10465441SEvalZero     char        name[RT_NAME_MAX];                      /**< the name of thread */
547*10465441SEvalZero     rt_uint8_t  type;                                   /**< type of object */
548*10465441SEvalZero     rt_uint8_t  flags;                                  /**< thread's flags */
549*10465441SEvalZero 
550*10465441SEvalZero #ifdef RT_USING_MODULE
551*10465441SEvalZero     void       *module_id;                              /**< id of application module */
552*10465441SEvalZero #endif
553*10465441SEvalZero 
554*10465441SEvalZero     rt_list_t   list;                                   /**< the object list */
555*10465441SEvalZero     rt_list_t   tlist;                                  /**< the thread list */
556*10465441SEvalZero 
557*10465441SEvalZero     /* stack point and entry */
558*10465441SEvalZero     void       *sp;                                     /**< stack point */
559*10465441SEvalZero     void       *entry;                                  /**< entry */
560*10465441SEvalZero     void       *parameter;                              /**< parameter */
561*10465441SEvalZero     void       *stack_addr;                             /**< stack address */
562*10465441SEvalZero     rt_uint32_t stack_size;                             /**< stack size */
563*10465441SEvalZero 
564*10465441SEvalZero     /* error code */
565*10465441SEvalZero     rt_err_t    error;                                  /**< error code */
566*10465441SEvalZero 
567*10465441SEvalZero     rt_uint8_t  stat;                                   /**< thread status */
568*10465441SEvalZero 
569*10465441SEvalZero #ifdef RT_USING_SMP
570*10465441SEvalZero     rt_uint8_t  bind_cpu;                               /**< thread is bind to cpu */
571*10465441SEvalZero     rt_uint8_t  oncpu;                                  /**< process on cpu` */
572*10465441SEvalZero 
573*10465441SEvalZero     rt_uint16_t scheduler_lock_nest;                    /**< scheduler lock count */
574*10465441SEvalZero     rt_uint16_t cpus_lock_nest;                         /**< cpus lock count */
575*10465441SEvalZero #endif /*RT_USING_SMP*/
576*10465441SEvalZero 
577*10465441SEvalZero     /* priority */
578*10465441SEvalZero     rt_uint8_t  current_priority;                       /**< current priority */
579*10465441SEvalZero     rt_uint8_t  init_priority;                          /**< initialized priority */
580*10465441SEvalZero #if RT_THREAD_PRIORITY_MAX > 32
581*10465441SEvalZero     rt_uint8_t  number;
582*10465441SEvalZero     rt_uint8_t  high_mask;
583*10465441SEvalZero #endif
584*10465441SEvalZero     rt_uint32_t number_mask;
585*10465441SEvalZero 
586*10465441SEvalZero #if defined(RT_USING_EVENT)
587*10465441SEvalZero     /* thread event */
588*10465441SEvalZero     rt_uint32_t event_set;
589*10465441SEvalZero     rt_uint8_t  event_info;
590*10465441SEvalZero #endif
591*10465441SEvalZero 
592*10465441SEvalZero #if defined(RT_USING_SIGNALS)
593*10465441SEvalZero     rt_sigset_t     sig_pending;                        /**< the pending signals */
594*10465441SEvalZero     rt_sigset_t     sig_mask;                           /**< the mask bits of signal */
595*10465441SEvalZero 
596*10465441SEvalZero     void            *sig_ret;                           /**< the return stack pointer from signal */
597*10465441SEvalZero     rt_sighandler_t *sig_vectors;                       /**< vectors of signal handler */
598*10465441SEvalZero     void            *si_list;                           /**< the signal infor list */
599*10465441SEvalZero #endif
600*10465441SEvalZero 
601*10465441SEvalZero     rt_ubase_t  init_tick;                              /**< thread's initialized tick */
602*10465441SEvalZero     rt_ubase_t  remaining_tick;                         /**< remaining tick */
603*10465441SEvalZero 
604*10465441SEvalZero     struct rt_timer thread_timer;                       /**< built-in thread timer */
605*10465441SEvalZero 
606*10465441SEvalZero     void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit */
607*10465441SEvalZero 
608*10465441SEvalZero     /* light weight process if present */
609*10465441SEvalZero #ifdef RT_USING_LWP
610*10465441SEvalZero     void        *lwp;
611*10465441SEvalZero #endif
612*10465441SEvalZero 
613*10465441SEvalZero     rt_uint32_t user_data;                             /**< private user data beyond this thread */
614*10465441SEvalZero };
615*10465441SEvalZero typedef struct rt_thread *rt_thread_t;
616*10465441SEvalZero 
617*10465441SEvalZero /**@}*/
618*10465441SEvalZero 
619*10465441SEvalZero /**
620*10465441SEvalZero  * @addtogroup IPC
621*10465441SEvalZero  */
622*10465441SEvalZero 
623*10465441SEvalZero /**@{*/
624*10465441SEvalZero 
625*10465441SEvalZero /**
626*10465441SEvalZero  * IPC flags and control command definitions
627*10465441SEvalZero  */
628*10465441SEvalZero #define RT_IPC_FLAG_FIFO                0x00            /**< FIFOed IPC. @ref IPC. */
629*10465441SEvalZero #define RT_IPC_FLAG_PRIO                0x01            /**< PRIOed IPC. @ref IPC. */
630*10465441SEvalZero 
631*10465441SEvalZero #define RT_IPC_CMD_UNKNOWN              0x00            /**< unknown IPC command */
632*10465441SEvalZero #define RT_IPC_CMD_RESET                0x01            /**< reset IPC object */
633*10465441SEvalZero 
634*10465441SEvalZero #define RT_WAITING_FOREVER              -1              /**< Block forever until get resource. */
635*10465441SEvalZero #define RT_WAITING_NO                   0               /**< Non-block. */
636*10465441SEvalZero 
637*10465441SEvalZero /**
638*10465441SEvalZero  * Base structure of IPC object
639*10465441SEvalZero  */
640*10465441SEvalZero struct rt_ipc_object
641*10465441SEvalZero {
642*10465441SEvalZero     struct rt_object parent;                            /**< inherit from rt_object */
643*10465441SEvalZero 
644*10465441SEvalZero     rt_list_t        suspend_thread;                    /**< threads pended on this resource */
645*10465441SEvalZero };
646*10465441SEvalZero 
647*10465441SEvalZero #ifdef RT_USING_SEMAPHORE
648*10465441SEvalZero /**
649*10465441SEvalZero  * Semaphore structure
650*10465441SEvalZero  */
651*10465441SEvalZero struct rt_semaphore
652*10465441SEvalZero {
653*10465441SEvalZero     struct rt_ipc_object parent;                        /**< inherit from ipc_object */
654*10465441SEvalZero 
655*10465441SEvalZero     rt_uint16_t          value;                         /**< value of semaphore. */
656*10465441SEvalZero };
657*10465441SEvalZero typedef struct rt_semaphore *rt_sem_t;
658*10465441SEvalZero #endif
659*10465441SEvalZero 
660*10465441SEvalZero #ifdef RT_USING_MUTEX
661*10465441SEvalZero /**
662*10465441SEvalZero  * Mutual exclusion (mutex) structure
663*10465441SEvalZero  */
664*10465441SEvalZero struct rt_mutex
665*10465441SEvalZero {
666*10465441SEvalZero     struct rt_ipc_object parent;                        /**< inherit from ipc_object */
667*10465441SEvalZero 
668*10465441SEvalZero     rt_uint16_t          value;                         /**< value of mutex */
669*10465441SEvalZero 
670*10465441SEvalZero     rt_uint8_t           original_priority;             /**< priority of last thread hold the mutex */
671*10465441SEvalZero     rt_uint8_t           hold;                          /**< numbers of thread hold the mutex */
672*10465441SEvalZero 
673*10465441SEvalZero     struct rt_thread    *owner;                         /**< current owner of mutex */
674*10465441SEvalZero };
675*10465441SEvalZero typedef struct rt_mutex *rt_mutex_t;
676*10465441SEvalZero #endif
677*10465441SEvalZero 
678*10465441SEvalZero #ifdef RT_USING_EVENT
679*10465441SEvalZero /**
680*10465441SEvalZero  * flag defintions in event
681*10465441SEvalZero  */
682*10465441SEvalZero #define RT_EVENT_FLAG_AND               0x01            /**< logic and */
683*10465441SEvalZero #define RT_EVENT_FLAG_OR                0x02            /**< logic or */
684*10465441SEvalZero #define RT_EVENT_FLAG_CLEAR             0x04            /**< clear flag */
685*10465441SEvalZero 
686*10465441SEvalZero /*
687*10465441SEvalZero  * event structure
688*10465441SEvalZero  */
689*10465441SEvalZero struct rt_event
690*10465441SEvalZero {
691*10465441SEvalZero     struct rt_ipc_object parent;                        /**< inherit from ipc_object */
692*10465441SEvalZero 
693*10465441SEvalZero     rt_uint32_t          set;                           /**< event set */
694*10465441SEvalZero };
695*10465441SEvalZero typedef struct rt_event *rt_event_t;
696*10465441SEvalZero #endif
697*10465441SEvalZero 
698*10465441SEvalZero #ifdef RT_USING_MAILBOX
699*10465441SEvalZero /**
700*10465441SEvalZero  * mailbox structure
701*10465441SEvalZero  */
702*10465441SEvalZero struct rt_mailbox
703*10465441SEvalZero {
704*10465441SEvalZero     struct rt_ipc_object parent;                        /**< inherit from ipc_object */
705*10465441SEvalZero 
706*10465441SEvalZero     rt_ubase_t          *msg_pool;                      /**< start address of message buffer */
707*10465441SEvalZero 
708*10465441SEvalZero     rt_uint16_t          size;                          /**< size of message pool */
709*10465441SEvalZero 
710*10465441SEvalZero     rt_uint16_t          entry;                         /**< index of messages in msg_pool */
711*10465441SEvalZero     rt_uint16_t          in_offset;                     /**< input offset of the message buffer */
712*10465441SEvalZero     rt_uint16_t          out_offset;                    /**< output offset of the message buffer */
713*10465441SEvalZero 
714*10465441SEvalZero     rt_list_t            suspend_sender_thread;         /**< sender thread suspended on this mailbox */
715*10465441SEvalZero };
716*10465441SEvalZero typedef struct rt_mailbox *rt_mailbox_t;
717*10465441SEvalZero #endif
718*10465441SEvalZero 
719*10465441SEvalZero #ifdef RT_USING_MESSAGEQUEUE
720*10465441SEvalZero /**
721*10465441SEvalZero  * message queue structure
722*10465441SEvalZero  */
723*10465441SEvalZero struct rt_messagequeue
724*10465441SEvalZero {
725*10465441SEvalZero     struct rt_ipc_object parent;                        /**< inherit from ipc_object */
726*10465441SEvalZero 
727*10465441SEvalZero     void                *msg_pool;                      /**< start address of message queue */
728*10465441SEvalZero 
729*10465441SEvalZero     rt_uint16_t          msg_size;                      /**< message size of each message */
730*10465441SEvalZero     rt_uint16_t          max_msgs;                      /**< max number of messages */
731*10465441SEvalZero 
732*10465441SEvalZero     rt_uint16_t          entry;                         /**< index of messages in the queue */
733*10465441SEvalZero 
734*10465441SEvalZero     void                *msg_queue_head;                /**< list head */
735*10465441SEvalZero     void                *msg_queue_tail;                /**< list tail */
736*10465441SEvalZero     void                *msg_queue_free;                /**< pointer indicated the free node of queue */
737*10465441SEvalZero };
738*10465441SEvalZero typedef struct rt_messagequeue *rt_mq_t;
739*10465441SEvalZero #endif
740*10465441SEvalZero 
741*10465441SEvalZero /**@}*/
742*10465441SEvalZero 
743*10465441SEvalZero /**
744*10465441SEvalZero  * @addtogroup MM
745*10465441SEvalZero  */
746*10465441SEvalZero 
747*10465441SEvalZero /**@{*/
748*10465441SEvalZero 
749*10465441SEvalZero /*
750*10465441SEvalZero  * memory management
751*10465441SEvalZero  * heap & partition
752*10465441SEvalZero  */
753*10465441SEvalZero 
754*10465441SEvalZero #ifdef RT_USING_MEMHEAP
755*10465441SEvalZero /**
756*10465441SEvalZero  * memory item on the heap
757*10465441SEvalZero  */
758*10465441SEvalZero struct rt_memheap_item
759*10465441SEvalZero {
760*10465441SEvalZero     rt_uint32_t             magic;                      /**< magic number for memheap */
761*10465441SEvalZero     struct rt_memheap      *pool_ptr;                   /**< point of pool */
762*10465441SEvalZero 
763*10465441SEvalZero     struct rt_memheap_item *next;                       /**< next memheap item */
764*10465441SEvalZero     struct rt_memheap_item *prev;                       /**< prev memheap item */
765*10465441SEvalZero 
766*10465441SEvalZero     struct rt_memheap_item *next_free;                  /**< next free memheap item */
767*10465441SEvalZero     struct rt_memheap_item *prev_free;                  /**< prev free memheap item */
768*10465441SEvalZero };
769*10465441SEvalZero 
770*10465441SEvalZero /**
771*10465441SEvalZero  * Base structure of memory heap object
772*10465441SEvalZero  */
773*10465441SEvalZero struct rt_memheap
774*10465441SEvalZero {
775*10465441SEvalZero     struct rt_object        parent;                     /**< inherit from rt_object */
776*10465441SEvalZero 
777*10465441SEvalZero     void                   *start_addr;                 /**< pool start address and size */
778*10465441SEvalZero 
779*10465441SEvalZero     rt_uint32_t             pool_size;                  /**< pool size */
780*10465441SEvalZero     rt_uint32_t             available_size;             /**< available size */
781*10465441SEvalZero     rt_uint32_t             max_used_size;              /**< maximum allocated size */
782*10465441SEvalZero 
783*10465441SEvalZero     struct rt_memheap_item *block_list;                 /**< used block list */
784*10465441SEvalZero 
785*10465441SEvalZero     struct rt_memheap_item *free_list;                  /**< free block list */
786*10465441SEvalZero     struct rt_memheap_item  free_header;                /**< free block list header */
787*10465441SEvalZero 
788*10465441SEvalZero     struct rt_semaphore     lock;                       /**< semaphore lock */
789*10465441SEvalZero };
790*10465441SEvalZero #endif
791*10465441SEvalZero 
792*10465441SEvalZero #ifdef RT_USING_MEMPOOL
793*10465441SEvalZero /**
794*10465441SEvalZero  * Base structure of Memory pool object
795*10465441SEvalZero  */
796*10465441SEvalZero struct rt_mempool
797*10465441SEvalZero {
798*10465441SEvalZero     struct rt_object parent;                            /**< inherit from rt_object */
799*10465441SEvalZero 
800*10465441SEvalZero     void            *start_address;                     /**< memory pool start */
801*10465441SEvalZero     rt_size_t        size;                              /**< size of memory pool */
802*10465441SEvalZero 
803*10465441SEvalZero     rt_size_t        block_size;                        /**< size of memory blocks */
804*10465441SEvalZero     rt_uint8_t      *block_list;                        /**< memory blocks list */
805*10465441SEvalZero 
806*10465441SEvalZero     rt_size_t        block_total_count;                 /**< numbers of memory block */
807*10465441SEvalZero     rt_size_t        block_free_count;                  /**< numbers of free memory block */
808*10465441SEvalZero 
809*10465441SEvalZero     rt_list_t        suspend_thread;                    /**< threads pended on this resource */
810*10465441SEvalZero     rt_size_t        suspend_thread_count;              /**< numbers of thread pended on this resource */
811*10465441SEvalZero };
812*10465441SEvalZero typedef struct rt_mempool *rt_mp_t;
813*10465441SEvalZero #endif
814*10465441SEvalZero 
815*10465441SEvalZero /**@}*/
816*10465441SEvalZero 
817*10465441SEvalZero #ifdef RT_USING_DEVICE
818*10465441SEvalZero /**
819*10465441SEvalZero  * @addtogroup Device
820*10465441SEvalZero  */
821*10465441SEvalZero 
822*10465441SEvalZero /**@{*/
823*10465441SEvalZero 
824*10465441SEvalZero /**
825*10465441SEvalZero  * device (I/O) class type
826*10465441SEvalZero  */
827*10465441SEvalZero enum rt_device_class_type
828*10465441SEvalZero {
829*10465441SEvalZero     RT_Device_Class_Char = 0,                           /**< character device */
830*10465441SEvalZero     RT_Device_Class_Block,                              /**< block device */
831*10465441SEvalZero     RT_Device_Class_NetIf,                              /**< net interface */
832*10465441SEvalZero     RT_Device_Class_MTD,                                /**< memory device */
833*10465441SEvalZero     RT_Device_Class_CAN,                                /**< CAN device */
834*10465441SEvalZero     RT_Device_Class_RTC,                                /**< RTC device */
835*10465441SEvalZero     RT_Device_Class_Sound,                              /**< Sound device */
836*10465441SEvalZero     RT_Device_Class_Graphic,                            /**< Graphic device */
837*10465441SEvalZero     RT_Device_Class_I2CBUS,                             /**< I2C bus device */
838*10465441SEvalZero     RT_Device_Class_USBDevice,                          /**< USB slave device */
839*10465441SEvalZero     RT_Device_Class_USBHost,                            /**< USB host bus */
840*10465441SEvalZero     RT_Device_Class_SPIBUS,                             /**< SPI bus device */
841*10465441SEvalZero     RT_Device_Class_SPIDevice,                          /**< SPI device */
842*10465441SEvalZero     RT_Device_Class_SDIO,                               /**< SDIO bus device */
843*10465441SEvalZero     RT_Device_Class_PM,                                 /**< PM pseudo device */
844*10465441SEvalZero     RT_Device_Class_Pipe,                               /**< Pipe device */
845*10465441SEvalZero     RT_Device_Class_Portal,                             /**< Portal device */
846*10465441SEvalZero     RT_Device_Class_Timer,                              /**< Timer device */
847*10465441SEvalZero     RT_Device_Class_Miscellaneous,                      /**< Miscellaneous device */
848*10465441SEvalZero     RT_Device_Class_Unknown                             /**< unknown device */
849*10465441SEvalZero };
850*10465441SEvalZero 
851*10465441SEvalZero /**
852*10465441SEvalZero  * device flags defitions
853*10465441SEvalZero  */
854*10465441SEvalZero #define RT_DEVICE_FLAG_DEACTIVATE       0x000           /**< device is not not initialized */
855*10465441SEvalZero 
856*10465441SEvalZero #define RT_DEVICE_FLAG_RDONLY           0x001           /**< read only */
857*10465441SEvalZero #define RT_DEVICE_FLAG_WRONLY           0x002           /**< write only */
858*10465441SEvalZero #define RT_DEVICE_FLAG_RDWR             0x003           /**< read and write */
859*10465441SEvalZero 
860*10465441SEvalZero #define RT_DEVICE_FLAG_REMOVABLE        0x004           /**< removable device */
861*10465441SEvalZero #define RT_DEVICE_FLAG_STANDALONE       0x008           /**< standalone device */
862*10465441SEvalZero #define RT_DEVICE_FLAG_ACTIVATED        0x010           /**< device is activated */
863*10465441SEvalZero #define RT_DEVICE_FLAG_SUSPENDED        0x020           /**< device is suspended */
864*10465441SEvalZero #define RT_DEVICE_FLAG_STREAM           0x040           /**< stream mode */
865*10465441SEvalZero 
866*10465441SEvalZero #define RT_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx */
867*10465441SEvalZero #define RT_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx */
868*10465441SEvalZero #define RT_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx */
869*10465441SEvalZero #define RT_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx */
870*10465441SEvalZero 
871*10465441SEvalZero #define RT_DEVICE_OFLAG_CLOSE           0x000           /**< device is closed */
872*10465441SEvalZero #define RT_DEVICE_OFLAG_RDONLY          0x001           /**< read only access */
873*10465441SEvalZero #define RT_DEVICE_OFLAG_WRONLY          0x002           /**< write only access */
874*10465441SEvalZero #define RT_DEVICE_OFLAG_RDWR            0x003           /**< read and write */
875*10465441SEvalZero #define RT_DEVICE_OFLAG_OPEN            0x008           /**< device is opened */
876*10465441SEvalZero #define RT_DEVICE_OFLAG_MASK            0xf0f           /**< mask of open flag */
877*10465441SEvalZero 
878*10465441SEvalZero /**
879*10465441SEvalZero  * general device commands
880*10465441SEvalZero  */
881*10465441SEvalZero #define RT_DEVICE_CTRL_RESUME           0x01            /**< resume device */
882*10465441SEvalZero #define RT_DEVICE_CTRL_SUSPEND          0x02            /**< suspend device */
883*10465441SEvalZero #define RT_DEVICE_CTRL_CONFIG           0x03            /**< configure device */
884*10465441SEvalZero 
885*10465441SEvalZero #define RT_DEVICE_CTRL_SET_INT          0x10            /**< set interrupt */
886*10465441SEvalZero #define RT_DEVICE_CTRL_CLR_INT          0x11            /**< clear interrupt */
887*10465441SEvalZero #define RT_DEVICE_CTRL_GET_INT          0x12            /**< get interrupt status */
888*10465441SEvalZero 
889*10465441SEvalZero /**
890*10465441SEvalZero  * special device commands
891*10465441SEvalZero  */
892*10465441SEvalZero #define RT_DEVICE_CTRL_CHAR_STREAM      0x10            /**< stream mode on char device */
893*10465441SEvalZero #define RT_DEVICE_CTRL_BLK_GETGEOME     0x10            /**< get geometry information   */
894*10465441SEvalZero #define RT_DEVICE_CTRL_BLK_SYNC         0x11            /**< flush data to block device */
895*10465441SEvalZero #define RT_DEVICE_CTRL_BLK_ERASE        0x12            /**< erase block on block device */
896*10465441SEvalZero #define RT_DEVICE_CTRL_BLK_AUTOREFRESH  0x13            /**< block device : enter/exit auto refresh mode */
897*10465441SEvalZero #define RT_DEVICE_CTRL_NETIF_GETMAC     0x10            /**< get mac address */
898*10465441SEvalZero #define RT_DEVICE_CTRL_MTD_FORMAT       0x10            /**< format a MTD device */
899*10465441SEvalZero #define RT_DEVICE_CTRL_RTC_GET_TIME     0x10            /**< get time */
900*10465441SEvalZero #define RT_DEVICE_CTRL_RTC_SET_TIME     0x11            /**< set time */
901*10465441SEvalZero #define RT_DEVICE_CTRL_RTC_GET_ALARM    0x12            /**< get alarm */
902*10465441SEvalZero #define RT_DEVICE_CTRL_RTC_SET_ALARM    0x13            /**< set alarm */
903*10465441SEvalZero 
904*10465441SEvalZero typedef struct rt_device *rt_device_t;
905*10465441SEvalZero /**
906*10465441SEvalZero  * operations set for device object
907*10465441SEvalZero  */
908*10465441SEvalZero struct rt_device_ops
909*10465441SEvalZero {
910*10465441SEvalZero     /* common device interface */
911*10465441SEvalZero     rt_err_t  (*init)   (rt_device_t dev);
912*10465441SEvalZero     rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
913*10465441SEvalZero     rt_err_t  (*close)  (rt_device_t dev);
914*10465441SEvalZero     rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
915*10465441SEvalZero     rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
916*10465441SEvalZero     rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);
917*10465441SEvalZero };
918*10465441SEvalZero 
919*10465441SEvalZero /**
920*10465441SEvalZero  * WaitQueue structure
921*10465441SEvalZero  */
922*10465441SEvalZero struct rt_wqueue
923*10465441SEvalZero {
924*10465441SEvalZero     rt_uint32_t flag;
925*10465441SEvalZero     rt_list_t waiting_list;
926*10465441SEvalZero };
927*10465441SEvalZero typedef struct rt_wqueue rt_wqueue_t;
928*10465441SEvalZero 
929*10465441SEvalZero /**
930*10465441SEvalZero  * Device structure
931*10465441SEvalZero  */
932*10465441SEvalZero struct rt_device
933*10465441SEvalZero {
934*10465441SEvalZero     struct rt_object          parent;                   /**< inherit from rt_object */
935*10465441SEvalZero 
936*10465441SEvalZero     enum rt_device_class_type type;                     /**< device type */
937*10465441SEvalZero     rt_uint16_t               flag;                     /**< device flag */
938*10465441SEvalZero     rt_uint16_t               open_flag;                /**< device open flag */
939*10465441SEvalZero 
940*10465441SEvalZero     rt_uint8_t                ref_count;                /**< reference count */
941*10465441SEvalZero     rt_uint8_t                device_id;                /**< 0 - 255 */
942*10465441SEvalZero 
943*10465441SEvalZero     /* device call back */
944*10465441SEvalZero     rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
945*10465441SEvalZero     rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
946*10465441SEvalZero 
947*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
948*10465441SEvalZero     const struct rt_device_ops *ops;
949*10465441SEvalZero #else
950*10465441SEvalZero     /* common device interface */
951*10465441SEvalZero     rt_err_t  (*init)   (rt_device_t dev);
952*10465441SEvalZero     rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
953*10465441SEvalZero     rt_err_t  (*close)  (rt_device_t dev);
954*10465441SEvalZero     rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
955*10465441SEvalZero     rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
956*10465441SEvalZero     rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);
957*10465441SEvalZero #endif
958*10465441SEvalZero 
959*10465441SEvalZero #if defined(RT_USING_POSIX)
960*10465441SEvalZero     const struct dfs_file_ops *fops;
961*10465441SEvalZero     struct rt_wqueue wait_queue;
962*10465441SEvalZero #endif
963*10465441SEvalZero 
964*10465441SEvalZero     void                     *user_data;                /**< device private data */
965*10465441SEvalZero };
966*10465441SEvalZero 
967*10465441SEvalZero /**
968*10465441SEvalZero  * block device geometry structure
969*10465441SEvalZero  */
970*10465441SEvalZero struct rt_device_blk_geometry
971*10465441SEvalZero {
972*10465441SEvalZero     rt_uint32_t sector_count;                           /**< count of sectors */
973*10465441SEvalZero     rt_uint32_t bytes_per_sector;                       /**< number of bytes per sector */
974*10465441SEvalZero     rt_uint32_t block_size;                             /**< number of bytes to erase one block */
975*10465441SEvalZero };
976*10465441SEvalZero 
977*10465441SEvalZero /**
978*10465441SEvalZero  * sector arrange struct on block device
979*10465441SEvalZero  */
980*10465441SEvalZero struct rt_device_blk_sectors
981*10465441SEvalZero {
982*10465441SEvalZero     rt_uint32_t sector_begin;                           /**< begin sector */
983*10465441SEvalZero     rt_uint32_t sector_end;                             /**< end sector   */
984*10465441SEvalZero };
985*10465441SEvalZero 
986*10465441SEvalZero /**
987*10465441SEvalZero  * cursor control command
988*10465441SEvalZero  */
989*10465441SEvalZero #define RT_DEVICE_CTRL_CURSOR_SET_POSITION  0x10
990*10465441SEvalZero #define RT_DEVICE_CTRL_CURSOR_SET_TYPE      0x11
991*10465441SEvalZero 
992*10465441SEvalZero /**
993*10465441SEvalZero  * graphic device control command
994*10465441SEvalZero  */
995*10465441SEvalZero #define RTGRAPHIC_CTRL_RECT_UPDATE      0
996*10465441SEvalZero #define RTGRAPHIC_CTRL_POWERON          1
997*10465441SEvalZero #define RTGRAPHIC_CTRL_POWEROFF         2
998*10465441SEvalZero #define RTGRAPHIC_CTRL_GET_INFO         3
999*10465441SEvalZero #define RTGRAPHIC_CTRL_SET_MODE         4
1000*10465441SEvalZero #define RTGRAPHIC_CTRL_GET_EXT          5
1001*10465441SEvalZero 
1002*10465441SEvalZero /* graphic deice */
1003*10465441SEvalZero enum
1004*10465441SEvalZero {
1005*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_MONO = 0,
1006*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_GRAY4,
1007*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_GRAY16,
1008*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB332,
1009*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB444,
1010*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB565,
1011*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB565P,
1012*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_BGR565 = RTGRAPHIC_PIXEL_FORMAT_RGB565P,
1013*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB666,
1014*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_RGB888,
1015*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_ARGB888,
1016*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_ABGR888,
1017*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_ARGB565,
1018*10465441SEvalZero     RTGRAPHIC_PIXEL_FORMAT_ALPHA,
1019*10465441SEvalZero };
1020*10465441SEvalZero 
1021*10465441SEvalZero /**
1022*10465441SEvalZero  * build a pixel position according to (x, y) coordinates.
1023*10465441SEvalZero  */
1024*10465441SEvalZero #define RTGRAPHIC_PIXEL_POSITION(x, y)  ((x << 16) | y)
1025*10465441SEvalZero 
1026*10465441SEvalZero /**
1027*10465441SEvalZero  * graphic device information structure
1028*10465441SEvalZero  */
1029*10465441SEvalZero struct rt_device_graphic_info
1030*10465441SEvalZero {
1031*10465441SEvalZero     rt_uint8_t  pixel_format;                           /**< graphic format */
1032*10465441SEvalZero     rt_uint8_t  bits_per_pixel;                         /**< bits per pixel */
1033*10465441SEvalZero     rt_uint16_t reserved;                               /**< reserved field */
1034*10465441SEvalZero 
1035*10465441SEvalZero     rt_uint16_t width;                                  /**< width of graphic device */
1036*10465441SEvalZero     rt_uint16_t height;                                 /**< height of graphic device */
1037*10465441SEvalZero 
1038*10465441SEvalZero     rt_uint8_t *framebuffer;                            /**< frame buffer */
1039*10465441SEvalZero };
1040*10465441SEvalZero 
1041*10465441SEvalZero /**
1042*10465441SEvalZero  * rectangle information structure
1043*10465441SEvalZero  */
1044*10465441SEvalZero struct rt_device_rect_info
1045*10465441SEvalZero {
1046*10465441SEvalZero     rt_uint16_t x;                                      /**< x coordinate */
1047*10465441SEvalZero     rt_uint16_t y;                                      /**< y coordinate */
1048*10465441SEvalZero     rt_uint16_t width;                                  /**< width */
1049*10465441SEvalZero     rt_uint16_t height;                                 /**< height */
1050*10465441SEvalZero };
1051*10465441SEvalZero 
1052*10465441SEvalZero /**
1053*10465441SEvalZero  * graphic operations
1054*10465441SEvalZero  */
1055*10465441SEvalZero struct rt_device_graphic_ops
1056*10465441SEvalZero {
1057*10465441SEvalZero     void (*set_pixel) (const char *pixel, int x, int y);
1058*10465441SEvalZero     void (*get_pixel) (char *pixel, int x, int y);
1059*10465441SEvalZero 
1060*10465441SEvalZero     void (*draw_hline)(const char *pixel, int x1, int x2, int y);
1061*10465441SEvalZero     void (*draw_vline)(const char *pixel, int x, int y1, int y2);
1062*10465441SEvalZero 
1063*10465441SEvalZero     void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
1064*10465441SEvalZero };
1065*10465441SEvalZero #define rt_graphix_ops(device)          ((struct rt_device_graphic_ops *)(device->user_data))
1066*10465441SEvalZero 
1067*10465441SEvalZero /**@}*/
1068*10465441SEvalZero #endif
1069*10465441SEvalZero 
1070*10465441SEvalZero /* definitions for libc */
1071*10465441SEvalZero #include "rtlibc.h"
1072*10465441SEvalZero 
1073*10465441SEvalZero #ifdef __cplusplus
1074*10465441SEvalZero }
1075*10465441SEvalZero #endif
1076*10465441SEvalZero 
1077*10465441SEvalZero #ifdef __cplusplus
1078*10465441SEvalZero /* RT-Thread definitions for C++ */
1079*10465441SEvalZero namespace rtthread {
1080*10465441SEvalZero 
1081*10465441SEvalZero enum TICK_WAIT {
1082*10465441SEvalZero     WAIT_NONE = 0,
1083*10465441SEvalZero     WAIT_FOREVER = -1,
1084*10465441SEvalZero };
1085*10465441SEvalZero 
1086*10465441SEvalZero }
1087*10465441SEvalZero 
1088*10465441SEvalZero #endif /* end of __cplusplus */
1089*10465441SEvalZero 
1090*10465441SEvalZero #endif
1091