rtdef.h 29.9 KB
Newer Older
1 2 3
/*
 * File      : rtdef.h
 * This file is part of RT-Thread RTOS
D
dzzxzz 已提交
4
 * COPYRIGHT (C) 2006 - 2011, RT-Thread Development Team
5 6 7
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
D
dzzxzz 已提交
8
 * http://www.rt-thread.org/license/LICENSE
9 10 11 12
 *
 * Change Logs:
 * Date           Author       Notes
 * 2007-01-10     Bernard      the first version
D
dzzxzz 已提交
13
 * 2008-07-12     Bernard      remove all rt_int8, rt_uint32_t etc typedef
qiuyiuestc's avatar
qiuyiuestc 已提交
14
 * 2010-10-26     yi.qiu       add module support
15
 * 2010-11-10     Bernard      add cleanup callback function in thread exit.
B
bernard.xiong 已提交
16
 * 2011-05-09     Bernard      use builtin va_arg in GCC 4.x
17
 */
D
dzzxzz 已提交
18
 
19 20 21 22 23 24 25 26 27
#ifndef __RT_DEF_H__
#define __RT_DEF_H__

#include <rtconfig.h>

#ifdef __cplusplus
extern "C" {
#endif

B
bernard.xiong@gmail.com 已提交
28 29 30 31 32
/**
 * @addtogroup BasicDef
 */
/*@{*/

B
bernard.xiong@gmail.com 已提交
33
/* RT-Thread version information */
D
dzzxzz 已提交
34
#define RT_VERSION                      1L      /**< major version number */
D
dzzxzz 已提交
35
#define RT_SUBVERSION                   0L      /**< minor version number */
D
dzzxzz 已提交
36
#define RT_REVISION                   	0L      /**< revise version number */
B
bernard.xiong@gmail.com 已提交
37

B
bernard.xiong@gmail.com 已提交
38
/* RT-Thread basic data type definitions */
D
dzzxzz 已提交
39 40 41 42 43 44 45
typedef signed   char                   rt_int8_t;      /**<  8bit integer type */
typedef signed   short                  rt_int16_t;     /**< 16bit integer type */
typedef signed   long                   rt_int32_t;     /**< 32bit integer type */
typedef unsigned char                   rt_uint8_t;     /**<  8bit unsigned integer type */
typedef unsigned short                  rt_uint16_t;    /**< 16bit unsigned integer type */
typedef unsigned long                   rt_uint32_t;    /**< 32bit unsigned integer type */
typedef int                             rt_bool_t;      /**< boolean type */
46 47

/* 32bit CPU */
D
dzzxzz 已提交
48 49
typedef long                            rt_base_t;      /**< Nbit CPU related date type */
typedef unsigned long                   rt_ubase_t;     /**< Nbit unsigned CPU related data type */
B
bernard.xiong@gmail.com 已提交
50

D
dzzxzz 已提交
51 52 53 54 55 56 57
typedef rt_base_t                       rt_err_t;       /**< Type for error number      */
typedef rt_uint32_t                     rt_time_t;      /**< Type for time stamp        */
typedef rt_uint32_t                     rt_tick_t;      /**< Type for tick count        */
typedef rt_base_t                       rt_flag_t;      /**< Type for flags             */
typedef rt_ubase_t                      rt_size_t;      /**< Type for size number       */
typedef rt_ubase_t                      rt_dev_t;       /**< Type for device            */
typedef rt_base_t                       rt_off_t;       /**< Type for offset            */
B
bernard.xiong@gmail.com 已提交
58

B
bernard.xiong@gmail.com 已提交
59
/* boolean type definitions */
D
dzzxzz 已提交
60 61
#define RT_TRUE                         1   /**< boolean true  */
#define RT_FALSE                        0   /**< boolean fails */
B
bernard.xiong@gmail.com 已提交
62
/*@}*/
63

B
bernard.xiong@gmail.com 已提交
64
/* maximum value of base type */
D
dzzxzz 已提交
65 66 67 68
#define RT_UINT8_MAX                    0xff            /* Maxium number of UINT8   */
#define RT_UINT16_MAX                   0xffff          /* Maxium number of UINT16  */
#define RT_UINT32_MAX                   0xffffffff      /* Maxium number of UINT32  */
#define RT_TICK_MAX                     RT_UINT32_MAX   /* Maxium number of tick    */
69

B
bernard.xiong 已提交
70
/* Compiler Related Definitions */
D
dzzxzz 已提交
71 72 73 74 75 76
#ifdef __CC_ARM                         /* ARM Compiler */
	#include <stdarg.h>
	#define SECTION(x)                  __attribute__((section(x)))
	#define UNUSED                      __attribute__((unused))
	#define ALIGN(n)                    __attribute__((aligned(n)))
	#define rt_inline                   static __inline
B
bernard.xiong 已提交
77 78
	/* module compiling */
	#ifdef RT_USING_MODULE
D
dzzxzz 已提交
79
		#define RTT_API __declspec(dllimport)
B
bernard.xiong 已提交
80 81 82
	#else
		#define RTT_API __declspec(dllexport)
	#endif
83

D
dzzxzz 已提交
84 85 86 87 88 89 90
#elif defined (__IAR_SYSTEMS_ICC__)     /* for IAR Compiler */
	#include <stdarg.h>
	#define SECTION(x)                  @ x
	#define UNUSED
	#define PRAGMA(x)                   _Pragma(#x)
	#define ALIGN(n)                    PRAGMA(data_alignment=n)
	#define rt_inline                   static inline
B
bernard.xiong 已提交
91
	#define RTT_API
92

D
dzzxzz 已提交
93 94 95 96
#elif defined (__GNUC__)                /* GNU GCC Compiler */
	#ifdef RT_USING_NEWLIB
		#include <stdarg.h>
	#else
B
bernard.xiong 已提交
97 98 99 100
		#if __GNUC__ < 4
			typedef void *__sys_va_list;
			typedef __sys_va_list va_list;
			#define __va_rounded_size(type)	\
D
dzzxzz 已提交
101
				(((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
B
bernard.xiong 已提交
102 103 104 105 106
			#define va_start(ap, lastarg)	\
				(ap = ((char *) &(lastarg) + __va_rounded_size(lastarg)))
			#define va_end(ap)	((void)0)
			/*	little endian */
			#define va_arg(ap, type)	\
D
dzzxzz 已提交
107 108
				(ap = (__sys_va_list) ((char *)(ap) + __va_rounded_size(type)),  \
				*((type *) (void *) ((char *)(ap) - __va_rounded_size(type))))
B
bernard.xiong 已提交
109 110 111
		#else
			typedef __builtin_va_list __gnuc_va_list;
			typedef __gnuc_va_list va_list;
D
dzzxzz 已提交
112 113 114
			#define va_start(v,l)   __builtin_va_start(v,l)
			#define va_end(v)       __builtin_va_end(v)
			#define va_arg(v,l)     __builtin_va_arg(v,l)
B
bernard.xiong 已提交
115
		#endif
D
dzzxzz 已提交
116
	#endif
117

D
dzzxzz 已提交
118 119 120 121
	#define SECTION(x)                  __attribute__((section(x)))
	#define UNUSED                      __attribute__((unused))
	#define ALIGN(n)                    __attribute__((aligned(n)))
	#define rt_inline                   static __inline
B
bernard.xiong 已提交
122
	#define RTT_API
123 124
#endif

D
dzzxzz 已提交
125 126
/* event length */
#define RT_EVENT_LENGTH                 32
127 128

/* memory management option */
D
dzzxzz 已提交
129 130 131
#define RT_MM_PAGE_SIZE                 4096
#define RT_MM_PAGE_MASK                 (RT_MM_PAGE_SIZE - 1)
#define RT_MM_PAGE_BITS                 12
132 133 134 135 136

/**
 * @addtogroup Error
 */
/*@{*/
B
bernard.xiong@gmail.com 已提交
137
/* RT-Thread error code definitions */
D
dzzxzz 已提交
138 139 140 141 142 143 144
#define RT_EOK                          0               /**< There is no error       */
#define RT_ERROR                        1               /**< A generic error happens */
#define RT_ETIMEOUT                     2               /**< Timed out               */
#define RT_EFULL                        3               /**< The resource is full    */
#define RT_EEMPTY                       4               /**< The resource is empty   */
#define RT_ENOMEM                       5               /**< No memory               */
#define RT_ENOSYS                       6               /**< No system               */
B
bernard.xiong@gmail.com 已提交
145 146
#define RT_EBUSY                        7               /**< Busy                    */
#define RT_EIO							8 				/**< IO error 				 */
147 148 149
/*@}*/

/**
B
bernard.xiong@gmail.com 已提交
150 151
 * @ingroup BasicDef
 *
152 153
 * @def RT_ALIGN(size, align)
 * Return the most contiguous size aligned at specified width. RT_ALIGN(13, 4)
154
 * would return 16.
B
bernard.xiong@gmail.com 已提交
155
 */
D
dzzxzz 已提交
156
#define RT_ALIGN(size, align)           (((size) + (align) - 1) & ~((align) - 1))
B
bernard.xiong@gmail.com 已提交
157 158
/**
 * @ingroup BasicDef
159 160 161 162
 *
 * @def RT_ALIGN_DOWN(size, align)
 * Return the down number of aligned at specified width. RT_ALIGN_DOWN(13, 4)
 * would return 12. 
163
 */
D
dzzxzz 已提交
164
#define RT_ALIGN_DOWN(size, align)      ((size) & ~((align) - 1))
165 166

/**
B
bernard.xiong@gmail.com 已提交
167 168
 * @ingroup BasicDef
 *
169 170 171
 * @def RT_NULL
 * Similar as the \c NULL in C library.
 */
D
dzzxzz 已提交
172
#define RT_NULL                         ((void *)0)
173 174 175

struct rt_list_node
{
D
dzzxzz 已提交
176 177
	struct rt_list_node                 *next;          /* point to next node. */
	struct rt_list_node                 *prev;          /* point to prev node. */
178
};
D
dzzxzz 已提交
179
typedef struct rt_list_node rt_list_t;                  /* Type for lists.     */
180 181 182 183 184

/**
 * @addtogroup KernelObject
 */
/*@{*/
qiuyiuestc's avatar
qiuyiuestc 已提交
185 186 187 188

/*
 * kernel object macros
 */
D
dzzxzz 已提交
189
#define RT_OBJECT_FLAG_MODULE           0x80            /* is module object.   */
qiuyiuestc's avatar
qiuyiuestc 已提交
190

B
bernard.xiong@gmail.com 已提交
191
/**
192 193 194 195
 * Base structure of Kernel object
 */
struct rt_object
{
D
dzzxzz 已提交
196 197 198
	char        name[RT_NAME_MAX];                      /**< name of kernel object      */
	rt_uint8_t  type;                                   /**< type of kernel object      */
	rt_uint8_t  flag;                                   /**< flag of kernel object      */
qiuyiuestc's avatar
qiuyiuestc 已提交
199

B
bernard.xiong@gmail.com 已提交
200
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
201
	void        *module_id;                             /**< id of application module   */
B
bernard.xiong@gmail.com 已提交
202
#endif
D
dzzxzz 已提交
203
	rt_list_t   list;                                   /**< list node of kernel object */
204
};
D
dzzxzz 已提交
205 206 207 208 209 210 211 212 213 214 215 216
typedef struct rt_object *rt_object_t;                  /* Type for kernel objects.     */

/**
 *  The object type can be one of the follows with specific
 *  macros enabled:
 *  - Thread
 *  - Semaphore
 *  - Mutex
 *  - Event
 *  - MailBox
 *  - MessageQueue
 *  - MemPool
217
 *  - Device
D
dzzxzz 已提交
218 219 220
 *  - Timer
 *  - Unknown
 *  - Static
221 222 223
 */
enum rt_object_class_type
{
D
dzzxzz 已提交
224
	RT_Object_Class_Thread = 0,                         /**< The object is a thread.                */
225
#ifdef RT_USING_SEMAPHORE
D
dzzxzz 已提交
226
	RT_Object_Class_Semaphore,                          /**< The object is a semaphore.             */
227 228
#endif
#ifdef RT_USING_MUTEX
D
dzzxzz 已提交
229
	RT_Object_Class_Mutex,                              /**< The object is a mutex.                 */
230 231
#endif
#ifdef RT_USING_EVENT
D
dzzxzz 已提交
232
	RT_Object_Class_Event,                              /**< The object is a event.                 */
233 234
#endif
#ifdef RT_USING_MAILBOX
D
dzzxzz 已提交
235
	RT_Object_Class_MailBox,                            /**< The object is a mail box.              */
236 237
#endif
#ifdef RT_USING_MESSAGEQUEUE
D
dzzxzz 已提交
238
	RT_Object_Class_MessageQueue,                       /**< The object is a message queue.         */
239 240
#endif
#ifdef RT_USING_MEMPOOL
D
dzzxzz 已提交
241
	RT_Object_Class_MemPool,                            /**< The object is a memory pool.           */
242 243
#endif
#ifdef RT_USING_DEVICE
D
dzzxzz 已提交
244
	RT_Object_Class_Device,                             /**< The object is a device                 */
245
#endif
D
dzzxzz 已提交
246
	RT_Object_Class_Timer,                              /**< The object is a timer.                 */
247
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
248
	RT_Object_Class_Module,                             /**< The object is a module.                */
249
#endif
D
dzzxzz 已提交
250 251
	RT_Object_Class_Unknown,                            /**< The object is unknown.                 */
	RT_Object_Class_Static = 0x80                       /**< The object is a static object.         */
252
};
253

B
bernard.xiong@gmail.com 已提交
254 255
/**
 * The information of the kernel object
256 257 258
 */
struct rt_object_information
{
D
dzzxzz 已提交
259 260 261
	enum rt_object_class_type type;                     /**< object class type                      */
	rt_list_t object_list;                              /**< object list                            */
	rt_size_t object_size;                              /**< object size                            */
262
};
263 264 265 266 267 268 269 270 271 272 273

/**
 * The hook function call macro
 */
#ifdef RT_USING_HOOK
#define RT_OBJECT_HOOK_CALL(func, argv)	\
	do { if ((func) != RT_NULL) func argv; } while (0)
#else
#define RT_OBJECT_HOOK_CALL(func, argv)	
#endif

274 275 276 277 278 279 280
/*@}*/

/**
 * @addtogroup Clock
 */
/*@{*/

B
bernard.xiong@gmail.com 已提交
281
/**
282 283
 * clock & timer macros
 */
D
dzzxzz 已提交
284 285 286 287
#define RT_TIMER_FLAG_DEACTIVATED       0x0             /**< timer is deactive                      */
#define RT_TIMER_FLAG_ACTIVATED         0x1             /**< timer is active                        */
#define RT_TIMER_FLAG_ONE_SHOT          0x0             /**< one shot timer                         */
#define RT_TIMER_FLAG_PERIODIC          0x2             /**< periodic timer                         */
288

D
dzzxzz 已提交
289 290
#define RT_TIMER_FLAG_HARD_TIMER        0x0             /**< hard timer,the timer's callback function will be called in tick isr.     */
#define RT_TIMER_FLAG_SOFT_TIMER        0x4             /**< soft timer,the timer's callback function will be called in timer thread. */
291

D
dzzxzz 已提交
292 293 294 295
#define RT_TIMER_CTRL_SET_TIME          0x0             /**< set timer control command              */
#define RT_TIMER_CTRL_GET_TIME          0x1             /**< get timer control command              */
#define RT_TIMER_CTRL_SET_ONESHOT       0x2             /**< change timer to one shot               */
#define RT_TIMER_CTRL_SET_PERIODIC      0x3             /**< change timer to periodic               */
296

B
bernard.xiong@gmail.com 已提交
297
/**
298 299 300 301
 * timer structure
 */
struct rt_timer
{
D
dzzxzz 已提交
302
	struct rt_object parent;                            /**< inherit from rt_object                 */
303

D
dzzxzz 已提交
304
	rt_list_t list;                                     /**< the node of timer list                 */
305

D
dzzxzz 已提交
306 307
	void (*timeout_func)(void *parameter);              /**< timeout function                       */
	void *parameter;                                    /**< timeout function's parameter           */
308

D
dzzxzz 已提交
309 310
	rt_tick_t init_tick;                                /**< timer timeout tick                     */
	rt_tick_t timeout_tick;                             /**< timeout tick                           */
311
};
D
dzzxzz 已提交
312
typedef struct rt_timer *rt_timer_t;
313 314 315 316 317 318 319 320 321 322 323
/*@}*/

/**
 * @addtogroup Thread
 */
/*@{*/

/*
 * Thread
 */

B
bernard.xiong@gmail.com 已提交
324 325 326
/*
 * thread state definitions
 */
D
dzzxzz 已提交
327 328 329 330 331 332
#define RT_THREAD_INIT                  0x00                /**< Initialized status                 */
#define RT_THREAD_READY                 0x01                /**< Ready status                       */
#define RT_THREAD_SUSPEND               0x02                /**< Suspend status                     */
#define RT_THREAD_RUNNING               0x03                /**< Running status                     */
#define RT_THREAD_BLOCK                 RT_THREAD_SUSPEND   /**< Blocked status                     */
#define RT_THREAD_CLOSE                 0x04                /**< Closed status                      */
333

B
bernard.xiong@gmail.com 已提交
334 335 336
/**
 * thread control command definitions
 */
D
dzzxzz 已提交
337 338 339 340
#define RT_THREAD_CTRL_STARTUP          0x00                /**< Starup thread.                     */
#define RT_THREAD_CTRL_CLOSE            0x01                /**< Close thread.                      */
#define RT_THREAD_CTRL_CHANGE_PRIORITY  0x02                /**< Change thread priority.            */
#define RT_THREAD_CTRL_INFO             0x03                /**< Get thread information.            */
341

D
dzzxzz 已提交
342
typedef struct rt_thread *rt_thread_t;
343

B
bernard.xiong@gmail.com 已提交
344 345 346
/**
 * Thread structure
 *
347 348 349 350
 */
struct rt_thread
{
	/* rt object */
D
dzzxzz 已提交
351 352 353
	char        name[RT_NAME_MAX];                      /**< the name of thread                     */
	rt_uint8_t  type;                                   /**< type of object                         */
	rt_uint8_t  flags;                                  /**< thread's flags                         */
qiuyiuestc's avatar
qiuyiuestc 已提交
354 355
	
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
356
	void        *module_id;                             /**< id of application module               */
qiuyiuestc's avatar
qiuyiuestc 已提交
357
#endif
358

D
dzzxzz 已提交
359 360
	rt_list_t   list;                                   /**< the object list                        */
	rt_list_t   tlist;                                  /**< the thread list                        */
361 362

	/* stack point and entry */
D
dzzxzz 已提交
363 364 365 366 367
	void        *sp;                                    /**< stack point                            */
	void        *entry;                                 /**< entry                                  */
	void        *parameter;                             /**< parameter                              */
	void        *stack_addr;                            /**< stack address                          */
	rt_uint16_t stack_size;                             /**< stack size                             */
368 369

	/* error code */
D
dzzxzz 已提交
370
	rt_err_t    error;                                  /**< error code                             */
371

D
dzzxzz 已提交
372
	rt_uint8_t  stat;                                   /**< thread stat                            */
373

374
	/* priority */
D
dzzxzz 已提交
375 376
	rt_uint8_t  current_priority;                       /**< current priority                       */
	rt_uint8_t  init_priority;                          /**< initialized priority                   */
377
#if RT_THREAD_PRIORITY_MAX > 32
D
dzzxzz 已提交
378 379
	rt_uint8_t  number;
	rt_uint8_t  high_mask;
380
#endif
D
dzzxzz 已提交
381
	rt_uint32_t number_mask;
382

B
bernard.xiong 已提交
383
#if defined(RT_USING_EVENT)
384 385
	/* thread event */
	rt_uint32_t event_set;
D
dzzxzz 已提交
386
	rt_uint8_t  event_info;
387 388
#endif

D
dzzxzz 已提交
389 390
	rt_ubase_t  init_tick;                              /**< thread's initialized tick              */
	rt_ubase_t  remaining_tick;                         /**< remaining tick                         */
391

B
bernard.xiong@gmail.com 已提交
392
	struct rt_timer thread_timer;                       /**< built-in thread timer                   */
393

D
dzzxzz 已提交
394
	void (*cleanup)(struct rt_thread *tid);             /**< cleanup function when thread exit      */
395

B
bernard.xiong@gmail.com 已提交
396
	rt_uint32_t user_data;                              /**< private user data beyond this thread  */
397 398 399 400 401 402 403
};
/*@}*/

/**
 * @addtogroup IPC
 */
/*@{*/
B
bernard.xiong@gmail.com 已提交
404 405

/**
B
bernard.xiong@gmail.com 已提交
406
 * IPC flags and control command definitions
407
 */
D
dzzxzz 已提交
408 409
#define RT_IPC_FLAG_FIFO                0x00            /**< FIFOed IPC. @ref IPC.                  */
#define RT_IPC_FLAG_PRIO                0x01            /**< PRIOed IPC. @ref IPC.                  */
410

D
dzzxzz 已提交
411 412
#define RT_IPC_CMD_UNKNOWN              0x00            /**< unknown IPC command                    */
#define RT_IPC_CMD_RESET                0x01            /**< reset IPC object                       */
413

D
dzzxzz 已提交
414 415
#define RT_WAITING_FOREVER              -1              /**< Block forever until get resource.      */
#define RT_WAITING_NO                   0               /**< Non-block.                             */
416

B
bernard.xiong@gmail.com 已提交
417
/**
418 419 420 421
 * Base structure of IPC object
 */
struct rt_ipc_object
{
D
dzzxzz 已提交
422
	struct rt_object parent;                            /**< inherit from rt_object                 */
423

D
dzzxzz 已提交
424
	rt_list_t suspend_thread;                           /**< threads pended on this resource        */
425 426 427
};

#ifdef RT_USING_SEMAPHORE
B
bernard.xiong@gmail.com 已提交
428 429
/**
 * Semaphore structure
430 431 432
 */
struct rt_semaphore
{
D
dzzxzz 已提交
433
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
434

D
dzzxzz 已提交
435
	rt_uint16_t value;                                  /**< value of semaphore.                    */
436
};
D
dzzxzz 已提交
437
typedef struct rt_semaphore *rt_sem_t;
438 439 440
#endif

#ifdef RT_USING_MUTEX
B
bernard.xiong@gmail.com 已提交
441 442
/**
 * Mutual exclusion (mutex) structure
443 444 445
 */
struct rt_mutex
{
D
dzzxzz 已提交
446
	struct rt_ipc_object    parent;                     /**< inherit from ipc_object                */
447

D
dzzxzz 已提交
448
	rt_uint16_t             value;                      /**< value of mutex                         */
449

D
dzzxzz 已提交
450 451
	rt_uint8_t              original_priority;          /**< priority of last thread hold the mutex */
	rt_uint8_t              hold;                       /**< numbers of thread hold the mutex       */
452

D
dzzxzz 已提交
453
	struct rt_thread        *owner;                     /**< current owner of mutex                 */
454
};
D
dzzxzz 已提交
455
typedef struct rt_mutex *rt_mutex_t;
456 457 458
#endif

#ifdef RT_USING_EVENT
B
bernard.xiong@gmail.com 已提交
459 460 461
/**
 * flag defintions in event
 */
D
dzzxzz 已提交
462 463 464
#define RT_EVENT_FLAG_AND               0x01            /**< logic and                              */
#define RT_EVENT_FLAG_OR                0x02            /**< logic or                               */
#define RT_EVENT_FLAG_CLEAR             0x04            /**< clear flag                             */
B
bernard.xiong@gmail.com 已提交
465

466
/*
B
bernard.xiong@gmail.com 已提交
467
 * event structure
468 469 470
 */
struct rt_event
{
D
dzzxzz 已提交
471
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
472

D
dzzxzz 已提交
473
	rt_uint32_t set;                                    /**< event set                              */
474
};
D
dzzxzz 已提交
475
typedef struct rt_event *rt_event_t;
476 477 478
#endif

#ifdef RT_USING_MAILBOX
B
bernard.xiong@gmail.com 已提交
479 480
/**
 * mailbox structure
481 482 483 484
 *
 */
struct rt_mailbox
{
D
dzzxzz 已提交
485
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
486

D
dzzxzz 已提交
487
	rt_uint32_t *msg_pool;                              /**< start address of message buffer        */
488

D
dzzxzz 已提交
489
	rt_uint16_t size;                                   /**< size of message pool                   */
490

D
dzzxzz 已提交
491 492
	rt_uint16_t entry;                                  /**< index of messages in msg_pool          */
	rt_uint16_t in_offset, out_offset;                  /**< in/output offset of the message buffer */
493

B
bernard.xiong@gmail.com 已提交
494
	rt_list_t suspend_sender_thread;                    /**< sender thread suspended on this mailbox */
495
};
D
dzzxzz 已提交
496
typedef struct rt_mailbox *rt_mailbox_t;
497 498 499
#endif

#ifdef RT_USING_MESSAGEQUEUE
B
bernard.xiong@gmail.com 已提交
500 501
/**
 * message queue structure
502 503 504
 */
struct rt_messagequeue
{
D
dzzxzz 已提交
505
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
506

D
dzzxzz 已提交
507
	void *msg_pool;                                     /**< start address of message queue         */
508

D
dzzxzz 已提交
509 510
	rt_uint16_t msg_size;                               /**< message size of each message           */
	rt_uint16_t max_msgs;                               /**< max number of messages                 */
511

D
dzzxzz 已提交
512
	rt_uint16_t entry;                                  /**< index of messages in the queue         */
513

D
dzzxzz 已提交
514 515 516
	void *msg_queue_head;                               /**< list head                              */
	void *msg_queue_tail;                               /**< list tail                              */
	void *msg_queue_free;                               /**< pointer indicated the free node of queue */
517
};
D
dzzxzz 已提交
518
typedef struct rt_messagequeue *rt_mq_t;
519 520 521 522 523 524 525 526 527 528 529 530
#endif
/*@}*/

/**
 * @addtogroup MM
 */
/*@{*/
/*
 * memory management
 * heap & partition
 */
#ifdef RT_USING_MEMPOOL
B
bernard.xiong@gmail.com 已提交
531
/**
532 533 534 535
 * Base structure of Memory pool object
 */
struct rt_mempool
{
D
dzzxzz 已提交
536
	struct rt_object parent;                        /**< inherit from rt_object                     */
537

D
dzzxzz 已提交
538 539
	void        *start_address;                     /**< memory pool start                          */
	rt_size_t   size;                               /**< size of memory pool                        */
540

D
dzzxzz 已提交
541 542
	rt_size_t   block_size;                         /**< size of memory blocks                      */
	rt_uint8_t  *block_list;                        /**< memory blocks list                         */
543

D
dzzxzz 已提交
544 545
	rt_size_t   block_total_count;                  /**< numbers of memory block                    */
	rt_size_t   block_free_count;                   /**< numbers of free memory block               */
546

D
dzzxzz 已提交
547 548
	rt_list_t   suspend_thread;                     /**< threads pended on this resource            */
	rt_size_t   suspend_thread_count;               /**< numbers of thread pended on this resource  */
549
};
D
dzzxzz 已提交
550
typedef struct rt_mempool *rt_mp_t;
551 552 553 554 555 556 557 558 559
#endif
/*@}*/

#ifdef RT_USING_DEVICE
/**
 * @addtogroup Device
 */
/*@{*/

B
bernard.xiong@gmail.com 已提交
560 561
/**
 * device (I/O) class type
562 563 564
 */
enum rt_device_class_type
{
D
dzzxzz 已提交
565 566 567 568 569 570 571 572 573 574
	RT_Device_Class_Char = 0,                       /**< character device                           */
	RT_Device_Class_Block,                          /**< block device                               */
	RT_Device_Class_NetIf,                          /**< net interface                              */
	RT_Device_Class_MTD,                            /**< memory device                              */
	RT_Device_Class_CAN,                            /**< CAN device                                 */
	RT_Device_Class_RTC,                            /**< RTC device                                 */
	RT_Device_Class_Sound,                          /**< Sound device                               */
	RT_Device_Class_Graphic,                        /**< Graphic device                             */
	RT_Device_Class_I2C,                            /**< I2C device                                 */
	RT_Device_Class_USBDevice,                      /**< USB slave device                           */
B
bernard.xiong@gmail.com 已提交
575 576 577 578
	RT_Device_Class_USBHost,                        /**< USB host bus                               */
	RT_Device_Class_SPIBUS, 						/**< SPI bus device                             */
	RT_Device_Class_SPIDevice,                      /**< SPI device                                 */
	RT_Device_Class_SDIO, 							/**< SDIO bus device                            */
D
dzzxzz 已提交
579
	RT_Device_Class_Unknown                         /**< unknown device                             */
580 581
};

B
bernard.xiong@gmail.com 已提交
582 583 584
/**
 * device flags defitions
 */
D
dzzxzz 已提交
585
#define RT_DEVICE_FLAG_DEACTIVATE       0x000       /**< device is not not initialized              */
B
bernard.xiong@gmail.com 已提交
586

D
dzzxzz 已提交
587 588 589
#define RT_DEVICE_FLAG_RDONLY           0x001       /**< read only                                  */
#define RT_DEVICE_FLAG_WRONLY           0x002       /**< write only                                 */
#define RT_DEVICE_FLAG_RDWR             0x003       /**< read and write                             */
B
bernard.xiong@gmail.com 已提交
590

D
dzzxzz 已提交
591 592 593 594 595
#define RT_DEVICE_FLAG_REMOVABLE        0x004       /**< removable device                           */
#define RT_DEVICE_FLAG_STANDALONE       0x008       /**< standalone device                          */
#define RT_DEVICE_FLAG_ACTIVATED        0x010       /**< device is activated                        */
#define RT_DEVICE_FLAG_SUSPENDED        0x020       /**< device is suspended                        */
#define RT_DEVICE_FLAG_STREAM           0x040       /**< stream mode                                */
B
bernard.xiong@gmail.com 已提交
596

D
dzzxzz 已提交
597 598 599 600
#define RT_DEVICE_FLAG_INT_RX           0x100       /**< INT mode on Rx                             */
#define RT_DEVICE_FLAG_DMA_RX           0x200       /**< DMA mode on Rx                             */
#define RT_DEVICE_FLAG_INT_TX           0x400       /**< INT mode on Tx                             */
#define RT_DEVICE_FLAG_DMA_TX           0x800       /**< DMA mode on Tx                             */
B
bernard.xiong@gmail.com 已提交
601

D
dzzxzz 已提交
602 603 604 605 606
#define RT_DEVICE_OFLAG_CLOSE           0x000       /**< device is closed                           */
#define RT_DEVICE_OFLAG_RDONLY          0x001       /**< read only access                           */
#define RT_DEVICE_OFLAG_WRONLY          0x002       /**< write only access                          */
#define RT_DEVICE_OFLAG_RDWR            0x003       /**< read and write                             */
#define RT_DEVICE_OFLAG_OPEN            0x008       /**< device is opened                           */
B
bernard.xiong@gmail.com 已提交
607 608 609 610

/**
 * general device commands
 */
D
dzzxzz 已提交
611 612
#define RT_DEVICE_CTRL_RESUME           0x01        /**< resume device                              */
#define RT_DEVICE_CTRL_SUSPEND          0x02        /**< suspend device                             */
B
bernard.xiong@gmail.com 已提交
613 614 615 616

/**
 * special device commands
 */
D
dzzxzz 已提交
617 618 619 620 621 622
#define RT_DEVICE_CTRL_CHAR_STREAM      0x10        /**< stream mode on char device                 */
#define RT_DEVICE_CTRL_BLK_GETGEOME     0x10        /**< get geometry information                   */
#define RT_DEVICE_CTRL_NETIF_GETMAC     0x10        /**< get mac address                            */
#define RT_DEVICE_CTRL_MTD_FORMAT       0x10        /**< format a MTD device                        */
#define RT_DEVICE_CTRL_RTC_GET_TIME     0x10        /**< get time                                   */
#define RT_DEVICE_CTRL_RTC_SET_TIME     0x11        /**< set time                                   */
623

D
dzzxzz 已提交
624
typedef struct rt_device *rt_device_t;
B
bernard.xiong@gmail.com 已提交
625 626
/**
 * Device structure
627 628 629
 */
struct rt_device
{
D
dzzxzz 已提交
630
	struct rt_object parent;                        /**< inherit from rt_object                     */
631

D
dzzxzz 已提交
632 633
	enum rt_device_class_type type;                 /**< device type                                */
	rt_uint16_t flag, open_flag;                    /**< device flag and device open flag           */
634 635 636 637 638 639

	/* device call back */
	rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
	rt_err_t (*tx_complete)(rt_device_t dev, void* buffer);

	/* common device interface */
D
dzzxzz 已提交
640 641 642 643 644
	rt_err_t  (*init)   (rt_device_t dev);
	rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
	rt_err_t  (*close)  (rt_device_t dev);
	rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
	rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
645 646 647 648 649 650 651
	rt_err_t  (*control)(rt_device_t dev, rt_uint8_t cmd, void *args);

#ifdef RT_USING_DEVICE_SUSPEND
	rt_err_t (*suspend) (rt_device_t dev);
	rt_err_t (*resumed) (rt_device_t dev);
#endif

D
dzzxzz 已提交
652
	void *user_data;                                /**< device private data                        */
653 654
};

B
bernard.xiong@gmail.com 已提交
655 656 657
/**
 * block device geometry structure
 */
658 659
struct rt_device_blk_geometry
{
D
dzzxzz 已提交
660 661 662
	rt_uint32_t sector_count;                       /**< count of sectors                           */
	rt_uint32_t bytes_per_sector;                   /**< number of bytes per sector                 */
	rt_uint32_t block_size;                         /**< size to erase one block                    */
663
};
B
bernard.xiong@gmail.com 已提交
664 665

/**
D
dzzxzz 已提交
666
 * graphic device control command
B
bernard.xiong@gmail.com 已提交
667
 */
D
dzzxzz 已提交
668 669 670 671 672
#define RTGRAPHIC_CTRL_RECT_UPDATE  0
#define RTGRAPHIC_CTRL_POWERON      1
#define RTGRAPHIC_CTRL_POWEROFF     2
#define RTGRAPHIC_CTRL_GET_INFO     3
#define RTGRAPHIC_CTRL_SET_MODE     4
B
bernard.xiong@gmail.com 已提交
673 674

/* graphic deice */
D
dzzxzz 已提交
675
enum
B
bernard.xiong@gmail.com 已提交
676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
{
	RTGRAPHIC_PIXEL_FORMAT_MONO = 0,
	RTGRAPHIC_PIXEL_FORMAT_GRAY4,
	RTGRAPHIC_PIXEL_FORMAT_GRAY16,
	RTGRAPHIC_PIXEL_FORMAT_RGB332,
	RTGRAPHIC_PIXEL_FORMAT_RGB444,
	RTGRAPHIC_PIXEL_FORMAT_RGB565,
	RTGRAPHIC_PIXEL_FORMAT_RGB565P,
	RTGRAPHIC_PIXEL_FORMAT_RGB666,
	RTGRAPHIC_PIXEL_FORMAT_RGB888,
	RTGRAPHIC_PIXEL_FORMAT_ARGB888
};
/**
 * build a pixel position according to (x, y) coordinates.
 */
#define RTGRAPHIC_PIXEL_POSITION(x, y)	((x << 16) | y)

/**
 * graphic device information structure
 */
struct rt_device_graphic_info
{
D
dzzxzz 已提交
698 699 700
	rt_uint8_t  pixel_format;       /**< graphic format           */
	rt_uint8_t  bits_per_pixel;     /**< bits per pixel           */
	rt_uint16_t reserved;           /**< reserved field           */
B
bernard.xiong@gmail.com 已提交
701

D
dzzxzz 已提交
702 703
	rt_uint16_t width;              /**< width of graphic device  */
	rt_uint16_t height;             /**< height of graphic device */
B
bernard.xiong@gmail.com 已提交
704

D
dzzxzz 已提交
705
	rt_uint8_t *framebuffer;        /**< frame buffer             */
B
bernard.xiong@gmail.com 已提交
706 707 708 709 710 711 712
};

/**
 * rectangle information structure
 */
struct rt_device_rect_info
{
D
dzzxzz 已提交
713 714
	rt_uint16_t x, y;               /**< x, y coordinate          */
	rt_uint16_t width, height;      /**< width and height         */
B
bernard.xiong@gmail.com 已提交
715
};
716 717 718 719 720 721

/**
 * graphic operations
 */
struct rt_device_graphic_ops
{
D
dzzxzz 已提交
722 723
	void (*set_pixel) (const char *pixel, int x, int y);
	void (*get_pixel) (char *pixel, int x, int y);
724

D
dzzxzz 已提交
725 726
	void (*draw_hline)(const char *pixel, int x1, int x2, int y);
	void (*draw_vline)(const char *pixel, int x, int y1, int y2);
727

D
dzzxzz 已提交
728
	void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
729
};
D
dzzxzz 已提交
730
#define rt_graphix_ops(device)    ((struct rt_device_graphic_ops *)(device->user_data))
B
bernard.xiong@gmail.com 已提交
731
/*@}*/
732

B
bernard.xiong@gmail.com 已提交
733 734 735 736
/**
 * @addtogroup Module
 */
/*@{*/
qiuyiuestc's avatar
qiuyiuestc 已提交
737 738 739 740 741
#ifdef RT_USING_MODULE
/*
 * module system
 */

D
dzzxzz 已提交
742 743
#define RT_MODULE_FLAG_WITHENTRY        0x00        /* with entry point                             */
#define RT_MODULE_FLAG_WITHOUTENTRY     0x01        /* without entry point                          */
qiuyiuestc's avatar
qiuyiuestc 已提交
744

B
bernard.xiong@gmail.com 已提交
745 746 747
/**
 * Application Module structure
 */
qiuyiuestc's avatar
qiuyiuestc 已提交
748 749
struct rt_module
{
D
dzzxzz 已提交
750
	struct rt_object parent;                        /**< inherit from object                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
751

D
dzzxzz 已提交
752
	rt_uint8_t  *module_space;                      /**< module memory space                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
753

D
dzzxzz 已提交
754 755 756
	void        *module_entry;                      /**< entry address of module's thread           */
	rt_thread_t module_thread;                      /**< stack size of module's thread              */
	rt_uint32_t stack_size;                         /**< priority of module's thread                */
qiuyiuestc's avatar
qiuyiuestc 已提交
757 758 759
	rt_uint32_t thread_priority;

	/* module memory allocator */
D
dzzxzz 已提交
760 761 762
	void        *mem_list;                          /**< module's free memory list                  */
	void        *page_array;                        /**< module's using pages                       */
	rt_uint32_t page_cnt;                           /**< module's using pages count                 */
qiuyiuestc's avatar
qiuyiuestc 已提交
763

D
dzzxzz 已提交
764 765
	rt_uint32_t nsym;                               /**< number of symbol in the module             */
	struct rt_module_symtab *symtab;                /**< module symbol table                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
766

D
dzzxzz 已提交
767
	rt_uint32_t nref;                               /**< reference count                            */
qiuyiuestc's avatar
qiuyiuestc 已提交
768
	
B
bernard.xiong@gmail.com 已提交
769
	/**< object in this module, module object is the last basic object type */
qiuyiuestc's avatar
qiuyiuestc 已提交
770 771
	struct rt_object_information module_object[RT_Object_Class_Unknown];
};
D
dzzxzz 已提交
772
typedef struct rt_module *rt_module_t;
qiuyiuestc's avatar
qiuyiuestc 已提交
773 774
#endif

775 776 777 778 779 780 781 782
/*@}*/
#endif

#ifdef __cplusplus
}
#endif

#endif