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 33 34 35
/**
 * @addtogroup BasicDef
 */
/*@{*/

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

/**
 * RT-Thread basic data type definitions
 */
D
dzzxzz 已提交
43 44 45 46 47 48 49
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 */
50 51

/* 32bit CPU */
D
dzzxzz 已提交
52 53
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 已提交
54

D
dzzxzz 已提交
55 56 57 58 59 60 61
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 已提交
62 63 64 65

/**
 * boolean type definitions
 */
D
dzzxzz 已提交
66 67
#define RT_TRUE                         1   /**< boolean true  */
#define RT_FALSE                        0   /**< boolean fails */
B
bernard.xiong@gmail.com 已提交
68
/*@}*/
69

D
dzzxzz 已提交
70 71 72 73 74
/* maximun value of base type */
#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    */
75

B
bernard.xiong 已提交
76
/* Compiler Related Definitions */
D
dzzxzz 已提交
77 78 79 80 81 82
#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 已提交
83 84
	/* module compiling */
	#ifdef RT_USING_MODULE
D
dzzxzz 已提交
85
		#define RTT_API __declspec(dllimport)
B
bernard.xiong 已提交
86 87 88
	#else
		#define RTT_API __declspec(dllexport)
	#endif
89

D
dzzxzz 已提交
90 91 92 93 94 95 96
#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 已提交
97
	#define RTT_API
98

D
dzzxzz 已提交
99 100 101 102
#elif defined (__GNUC__)                /* GNU GCC Compiler */
	#ifdef RT_USING_NEWLIB
		#include <stdarg.h>
	#else
B
bernard.xiong 已提交
103 104 105 106
		#if __GNUC__ < 4
			typedef void *__sys_va_list;
			typedef __sys_va_list va_list;
			#define __va_rounded_size(type)	\
D
dzzxzz 已提交
107
				(((sizeof(type) + sizeof(int) - 1) / sizeof(int)) * sizeof(int))
B
bernard.xiong 已提交
108 109 110 111 112
			#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 已提交
113 114
				(ap = (__sys_va_list) ((char *)(ap) + __va_rounded_size(type)),  \
				*((type *) (void *) ((char *)(ap) - __va_rounded_size(type))))
B
bernard.xiong 已提交
115 116 117
		#else
			typedef __builtin_va_list __gnuc_va_list;
			typedef __gnuc_va_list va_list;
D
dzzxzz 已提交
118 119 120
			#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 已提交
121
		#endif
D
dzzxzz 已提交
122
	#endif
123

D
dzzxzz 已提交
124 125 126 127
	#define SECTION(x)                  __attribute__((section(x)))
	#define UNUSED                      __attribute__((unused))
	#define ALIGN(n)                    __attribute__((aligned(n)))
	#define rt_inline                   static __inline
B
bernard.xiong 已提交
128
	#define RTT_API
129 130
#endif

D
dzzxzz 已提交
131 132
/* event length */
#define RT_EVENT_LENGTH                 32
133 134

/* memory management option */
D
dzzxzz 已提交
135 136 137
#define RT_MM_PAGE_SIZE                 4096
#define RT_MM_PAGE_MASK                 (RT_MM_PAGE_SIZE - 1)
#define RT_MM_PAGE_BITS                 12
138 139 140 141 142

/**
 * @addtogroup Error
 */
/*@{*/
B
bernard.xiong@gmail.com 已提交
143
/** RT-Thread error code definitions */
D
dzzxzz 已提交
144 145 146 147 148 149 150
#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 已提交
151 152
#define RT_EBUSY                        7               /**< Busy                    */
#define RT_EIO							8 				/**< IO error 				 */
153 154 155
/*@}*/

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

/**
B
bernard.xiong@gmail.com 已提交
173 174
 * @ingroup BasicDef
 *
175 176 177
 * @def RT_NULL
 * Similar as the \c NULL in C library.
 */
D
dzzxzz 已提交
178
#define RT_NULL                         ((void *)0)
179 180 181

struct rt_list_node
{
D
dzzxzz 已提交
182 183
	struct rt_list_node                 *next;          /* point to next node. */
	struct rt_list_node                 *prev;          /* point to prev node. */
184
};
D
dzzxzz 已提交
185
typedef struct rt_list_node rt_list_t;                  /* Type for lists.     */
186 187 188 189 190

/**
 * @addtogroup KernelObject
 */
/*@{*/
qiuyiuestc's avatar
qiuyiuestc 已提交
191 192 193 194

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

B
bernard.xiong@gmail.com 已提交
197
/**
198 199 200 201
 * Base structure of Kernel object
 */
struct rt_object
{
D
dzzxzz 已提交
202 203 204
	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 已提交
205

B
bernard.xiong@gmail.com 已提交
206
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
207
	void        *module_id;                             /**< id of application module   */
B
bernard.xiong@gmail.com 已提交
208
#endif
D
dzzxzz 已提交
209
	rt_list_t   list;                                   /**< list node of kernel object */
210
};
D
dzzxzz 已提交
211 212 213 214 215 216 217 218 219 220 221 222
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
223
 *  - Device
D
dzzxzz 已提交
224 225 226
 *  - Timer
 *  - Unknown
 *  - Static
227 228 229
 */
enum rt_object_class_type
{
D
dzzxzz 已提交
230
	RT_Object_Class_Thread = 0,                         /**< The object is a thread.                */
231
#ifdef RT_USING_SEMAPHORE
D
dzzxzz 已提交
232
	RT_Object_Class_Semaphore,                          /**< The object is a semaphore.             */
233 234
#endif
#ifdef RT_USING_MUTEX
D
dzzxzz 已提交
235
	RT_Object_Class_Mutex,                              /**< The object is a mutex.                 */
236 237
#endif
#ifdef RT_USING_EVENT
D
dzzxzz 已提交
238
	RT_Object_Class_Event,                              /**< The object is a event.                 */
239 240
#endif
#ifdef RT_USING_MAILBOX
D
dzzxzz 已提交
241
	RT_Object_Class_MailBox,                            /**< The object is a mail box.              */
242 243
#endif
#ifdef RT_USING_MESSAGEQUEUE
D
dzzxzz 已提交
244
	RT_Object_Class_MessageQueue,                       /**< The object is a message queue.         */
245 246
#endif
#ifdef RT_USING_MEMPOOL
D
dzzxzz 已提交
247
	RT_Object_Class_MemPool,                            /**< The object is a memory pool.           */
248 249
#endif
#ifdef RT_USING_DEVICE
D
dzzxzz 已提交
250
	RT_Object_Class_Device,                             /**< The object is a device                 */
251
#endif
D
dzzxzz 已提交
252
	RT_Object_Class_Timer,                              /**< The object is a timer.                 */
253
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
254
	RT_Object_Class_Module,                             /**< The object is a module.                */
255
#endif
D
dzzxzz 已提交
256 257
	RT_Object_Class_Unknown,                            /**< The object is unknown.                 */
	RT_Object_Class_Static = 0x80                       /**< The object is a static object.         */
258
};
259

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

/**
 * 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

280 281 282 283 284 285 286
/*@}*/

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

B
bernard.xiong@gmail.com 已提交
287
/**
288 289
 * clock & timer macros
 */
D
dzzxzz 已提交
290 291 292 293
#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                         */
294

D
dzzxzz 已提交
295 296
#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. */
297

D
dzzxzz 已提交
298 299 300 301
#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               */
302

B
bernard.xiong@gmail.com 已提交
303
/**
304 305 306 307
 * timer structure
 */
struct rt_timer
{
D
dzzxzz 已提交
308
	struct rt_object parent;                            /**< inherit from rt_object                 */
309

D
dzzxzz 已提交
310
	rt_list_t list;                                     /**< the node of timer list                 */
311

D
dzzxzz 已提交
312 313
	void (*timeout_func)(void *parameter);              /**< timeout function                       */
	void *parameter;                                    /**< timeout function's parameter           */
314

D
dzzxzz 已提交
315 316
	rt_tick_t init_tick;                                /**< timer timeout tick                     */
	rt_tick_t timeout_tick;                             /**< timeout tick                           */
317
};
D
dzzxzz 已提交
318
typedef struct rt_timer *rt_timer_t;
319 320 321 322 323 324 325 326 327 328 329
/*@}*/

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

/*
 * Thread
 */

B
bernard.xiong@gmail.com 已提交
330 331 332
/*
 * thread state definitions
 */
D
dzzxzz 已提交
333 334 335 336 337 338
#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                      */
339

B
bernard.xiong@gmail.com 已提交
340 341 342
/**
 * thread control command definitions
 */
D
dzzxzz 已提交
343 344 345 346
#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.            */
347

D
dzzxzz 已提交
348
typedef struct rt_thread *rt_thread_t;
349

B
bernard.xiong@gmail.com 已提交
350 351 352
/**
 * Thread structure
 *
353 354 355 356
 */
struct rt_thread
{
	/* rt object */
D
dzzxzz 已提交
357 358 359
	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 已提交
360 361
	
#ifdef RT_USING_MODULE
D
dzzxzz 已提交
362
	void        *module_id;                             /**< id of application module               */
qiuyiuestc's avatar
qiuyiuestc 已提交
363
#endif
364

D
dzzxzz 已提交
365 366
	rt_list_t   list;                                   /**< the object list                        */
	rt_list_t   tlist;                                  /**< the thread list                        */
367 368

	/* stack point and entry */
D
dzzxzz 已提交
369 370 371 372 373
	void        *sp;                                    /**< stack point                            */
	void        *entry;                                 /**< entry                                  */
	void        *parameter;                             /**< parameter                              */
	void        *stack_addr;                            /**< stack address                          */
	rt_uint16_t stack_size;                             /**< stack size                             */
374 375

	/* error code */
D
dzzxzz 已提交
376
	rt_err_t    error;                                  /**< error code                             */
377

D
dzzxzz 已提交
378
	rt_uint8_t  stat;                                   /**< thread stat                            */
379

380
	/* priority */
D
dzzxzz 已提交
381 382
	rt_uint8_t  current_priority;                       /**< current priority                       */
	rt_uint8_t  init_priority;                          /**< initialized priority                   */
383
#if RT_THREAD_PRIORITY_MAX > 32
D
dzzxzz 已提交
384 385
	rt_uint8_t  number;
	rt_uint8_t  high_mask;
386
#endif
D
dzzxzz 已提交
387
	rt_uint32_t number_mask;
388

B
bernard.xiong 已提交
389
#if defined(RT_USING_EVENT)
390 391
	/* thread event */
	rt_uint32_t event_set;
D
dzzxzz 已提交
392
	rt_uint8_t  event_info;
393 394
#endif

D
dzzxzz 已提交
395 396
	rt_ubase_t  init_tick;                              /**< thread's initialized tick              */
	rt_ubase_t  remaining_tick;                         /**< remaining tick                         */
397

D
dzzxzz 已提交
398
	struct rt_timer thread_timer;                       /**< thread timer                           */
399

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

D
dzzxzz 已提交
402
	rt_uint32_t user_data;                              /**< user data                              */
403 404 405 406 407 408 409
};
/*@}*/

/**
 * @addtogroup IPC
 */
/*@{*/
B
bernard.xiong@gmail.com 已提交
410 411 412

/**
 * IPC flags and control command defitions
413
 */
D
dzzxzz 已提交
414 415
#define RT_IPC_FLAG_FIFO                0x00            /**< FIFOed IPC. @ref IPC.                  */
#define RT_IPC_FLAG_PRIO                0x01            /**< PRIOed IPC. @ref IPC.                  */
416

D
dzzxzz 已提交
417 418
#define RT_IPC_CMD_UNKNOWN              0x00            /**< unknown IPC command                    */
#define RT_IPC_CMD_RESET                0x01            /**< reset IPC object                       */
419

D
dzzxzz 已提交
420 421
#define RT_WAITING_FOREVER              -1              /**< Block forever until get resource.      */
#define RT_WAITING_NO                   0               /**< Non-block.                             */
422

B
bernard.xiong@gmail.com 已提交
423
/**
424 425 426 427
 * Base structure of IPC object
 */
struct rt_ipc_object
{
D
dzzxzz 已提交
428
	struct rt_object parent;                            /**< inherit from rt_object                 */
429

D
dzzxzz 已提交
430
	rt_list_t suspend_thread;                           /**< threads pended on this resource        */
431 432 433
};

#ifdef RT_USING_SEMAPHORE
B
bernard.xiong@gmail.com 已提交
434 435
/**
 * Semaphore structure
436 437 438
 */
struct rt_semaphore
{
D
dzzxzz 已提交
439
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
440

D
dzzxzz 已提交
441
	rt_uint16_t value;                                  /**< value of semaphore.                    */
442
};
D
dzzxzz 已提交
443
typedef struct rt_semaphore *rt_sem_t;
444 445 446
#endif

#ifdef RT_USING_MUTEX
B
bernard.xiong@gmail.com 已提交
447 448
/**
 * Mutual exclusion (mutex) structure
449 450 451
 */
struct rt_mutex
{
D
dzzxzz 已提交
452
	struct rt_ipc_object    parent;                     /**< inherit from ipc_object                */
453

D
dzzxzz 已提交
454
	rt_uint16_t             value;                      /**< value of mutex                         */
455

D
dzzxzz 已提交
456 457
	rt_uint8_t              original_priority;          /**< priority of last thread hold the mutex */
	rt_uint8_t              hold;                       /**< numbers of thread hold the mutex       */
458

D
dzzxzz 已提交
459
	struct rt_thread        *owner;                     /**< current owner of mutex                 */
460
};
D
dzzxzz 已提交
461
typedef struct rt_mutex *rt_mutex_t;
462 463 464
#endif

#ifdef RT_USING_EVENT
B
bernard.xiong@gmail.com 已提交
465 466 467
/**
 * flag defintions in event
 */
D
dzzxzz 已提交
468 469 470
#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 已提交
471

472
/*
B
bernard.xiong@gmail.com 已提交
473
 * event structure
474 475 476
 */
struct rt_event
{
D
dzzxzz 已提交
477
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
478

D
dzzxzz 已提交
479
	rt_uint32_t set;                                    /**< event set                              */
480
};
D
dzzxzz 已提交
481
typedef struct rt_event *rt_event_t;
482 483 484
#endif

#ifdef RT_USING_MAILBOX
B
bernard.xiong@gmail.com 已提交
485 486
/**
 * mailbox structure
487 488 489 490
 *
 */
struct rt_mailbox
{
D
dzzxzz 已提交
491
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
492

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

D
dzzxzz 已提交
495
	rt_uint16_t size;                                   /**< size of message pool                   */
496

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

D
dzzxzz 已提交
500
	rt_list_t suspend_sender_thread;                    /**< sender thread suspended on this mb     */
501
};
D
dzzxzz 已提交
502
typedef struct rt_mailbox *rt_mailbox_t;
503 504 505
#endif

#ifdef RT_USING_MESSAGEQUEUE
B
bernard.xiong@gmail.com 已提交
506 507
/**
 * message queue structure
508 509 510
 */
struct rt_messagequeue
{
D
dzzxzz 已提交
511
	struct rt_ipc_object parent;                        /**< inherit from ipc_object                */
512

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

D
dzzxzz 已提交
515 516
	rt_uint16_t msg_size;                               /**< message size of each message           */
	rt_uint16_t max_msgs;                               /**< max number of messages                 */
517

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

D
dzzxzz 已提交
520 521 522
	void *msg_queue_head;                               /**< list head                              */
	void *msg_queue_tail;                               /**< list tail                              */
	void *msg_queue_free;                               /**< pointer indicated the free node of queue */
523
};
D
dzzxzz 已提交
524
typedef struct rt_messagequeue *rt_mq_t;
525 526 527 528 529 530 531 532 533 534 535 536
#endif
/*@}*/

/**
 * @addtogroup MM
 */
/*@{*/
/*
 * memory management
 * heap & partition
 */
#ifdef RT_USING_MEMPOOL
B
bernard.xiong@gmail.com 已提交
537
/**
538 539 540 541
 * Base structure of Memory pool object
 */
struct rt_mempool
{
D
dzzxzz 已提交
542
	struct rt_object parent;                        /**< inherit from rt_object                     */
543

D
dzzxzz 已提交
544 545
	void        *start_address;                     /**< memory pool start                          */
	rt_size_t   size;                               /**< size of memory pool                        */
546

D
dzzxzz 已提交
547 548
	rt_size_t   block_size;                         /**< size of memory blocks                      */
	rt_uint8_t  *block_list;                        /**< memory blocks list                         */
549

D
dzzxzz 已提交
550 551
	rt_size_t   block_total_count;                  /**< numbers of memory block                    */
	rt_size_t   block_free_count;                   /**< numbers of free memory block               */
552

D
dzzxzz 已提交
553 554
	rt_list_t   suspend_thread;                     /**< threads pended on this resource            */
	rt_size_t   suspend_thread_count;               /**< numbers of thread pended on this resource  */
555
};
D
dzzxzz 已提交
556
typedef struct rt_mempool *rt_mp_t;
557 558 559 560 561 562 563 564 565
#endif
/*@}*/

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

B
bernard.xiong@gmail.com 已提交
566 567
/**
 * device (I/O) class type
568 569 570
 */
enum rt_device_class_type
{
D
dzzxzz 已提交
571 572 573 574 575 576 577 578 579 580
	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 已提交
581 582 583 584
	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 已提交
585
	RT_Device_Class_Unknown                         /**< unknown device                             */
586 587
};

B
bernard.xiong@gmail.com 已提交
588 589 590
/**
 * device flags defitions
 */
D
dzzxzz 已提交
591
#define RT_DEVICE_FLAG_DEACTIVATE       0x000       /**< device is not not initialized              */
B
bernard.xiong@gmail.com 已提交
592

D
dzzxzz 已提交
593 594 595
#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 已提交
596

D
dzzxzz 已提交
597 598 599 600 601
#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 已提交
602

D
dzzxzz 已提交
603 604 605 606
#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 已提交
607

D
dzzxzz 已提交
608 609 610 611 612
#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 已提交
613 614 615 616

/**
 * general device commands
 */
D
dzzxzz 已提交
617 618
#define RT_DEVICE_CTRL_RESUME           0x01        /**< resume device                              */
#define RT_DEVICE_CTRL_SUSPEND          0x02        /**< suspend device                             */
B
bernard.xiong@gmail.com 已提交
619 620 621 622

/**
 * special device commands
 */
D
dzzxzz 已提交
623 624 625 626 627 628
#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                                   */
629

D
dzzxzz 已提交
630
typedef struct rt_device *rt_device_t;
B
bernard.xiong@gmail.com 已提交
631 632
/**
 * Device structure
633 634 635
 */
struct rt_device
{
D
dzzxzz 已提交
636
	struct rt_object parent;                        /**< inherit from rt_object                     */
637

D
dzzxzz 已提交
638 639
	enum rt_device_class_type type;                 /**< device type                                */
	rt_uint16_t flag, open_flag;                    /**< device flag and device open flag           */
640 641 642 643 644 645

	/* 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 已提交
646 647 648 649 650
	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);
651 652 653 654 655 656 657
	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 已提交
658
	void *user_data;                                /**< device private data                        */
659 660
};

B
bernard.xiong@gmail.com 已提交
661 662 663
/**
 * block device geometry structure
 */
664 665
struct rt_device_blk_geometry
{
D
dzzxzz 已提交
666 667 668
	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                    */
669
};
B
bernard.xiong@gmail.com 已提交
670 671

/**
D
dzzxzz 已提交
672
 * graphic device control command
B
bernard.xiong@gmail.com 已提交
673
 */
D
dzzxzz 已提交
674 675 676 677 678
#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 已提交
679 680

/* graphic deice */
D
dzzxzz 已提交
681
enum
B
bernard.xiong@gmail.com 已提交
682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703
{
	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 已提交
704 705 706
	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 已提交
707

D
dzzxzz 已提交
708 709
	rt_uint16_t width;              /**< width of graphic device  */
	rt_uint16_t height;             /**< height of graphic device */
B
bernard.xiong@gmail.com 已提交
710

D
dzzxzz 已提交
711
	rt_uint8_t *framebuffer;        /**< frame buffer             */
B
bernard.xiong@gmail.com 已提交
712 713 714 715 716 717 718
};

/**
 * rectangle information structure
 */
struct rt_device_rect_info
{
D
dzzxzz 已提交
719 720
	rt_uint16_t x, y;               /**< x, y coordinate          */
	rt_uint16_t width, height;      /**< width and height         */
B
bernard.xiong@gmail.com 已提交
721
};
722 723 724 725 726 727

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

D
dzzxzz 已提交
731 732
	void (*draw_hline)(const char *pixel, int x1, int x2, int y);
	void (*draw_vline)(const char *pixel, int x, int y1, int y2);
733

D
dzzxzz 已提交
734
	void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
735
};
D
dzzxzz 已提交
736
#define rt_graphix_ops(device)    ((struct rt_device_graphic_ops *)(device->user_data))
B
bernard.xiong@gmail.com 已提交
737
/*@}*/
738

B
bernard.xiong@gmail.com 已提交
739 740 741 742
/**
 * @addtogroup Module
 */
/*@{*/
qiuyiuestc's avatar
qiuyiuestc 已提交
743 744 745 746 747
#ifdef RT_USING_MODULE
/*
 * module system
 */

D
dzzxzz 已提交
748 749
#define RT_MODULE_FLAG_WITHENTRY        0x00        /* with entry point                             */
#define RT_MODULE_FLAG_WITHOUTENTRY     0x01        /* without entry point                          */
qiuyiuestc's avatar
qiuyiuestc 已提交
750

B
bernard.xiong@gmail.com 已提交
751 752 753
/**
 * Application Module structure
 */
qiuyiuestc's avatar
qiuyiuestc 已提交
754 755
struct rt_module
{
D
dzzxzz 已提交
756
	struct rt_object parent;                        /**< inherit from object                        */
qiuyiuestc's avatar
qiuyiuestc 已提交
757

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

D
dzzxzz 已提交
760 761 762
	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 已提交
763 764 765
	rt_uint32_t thread_priority;

	/* module memory allocator */
D
dzzxzz 已提交
766 767 768
	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 已提交
769

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

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

781 782 783 784 785 786 787 788
/*@}*/
#endif

#ifdef __cplusplus
}
#endif

#endif