#ifndef __RT_DEF_H__
#define __RT_DEF_H__
#include <rtconfig.h>
#ifdef __cplusplus
extern "C" {
#endif
#define RT_VERSION 4L
#define RT_SUBVERSION 0L
#define RT_REVISION 3L
#define RTTHREAD_VERSION ((RT_VERSION * 10000) + \
(RT_SUBVERSION * 100) + RT_REVISION)
#ifndef RT_USING_ARCH_DATA_TYPE
typedef signed char rt_int8_t;
typedef signed short rt_int16_t;
typedef signed int rt_int32_t;
typedef unsigned char rt_uint8_t;
typedef unsigned short rt_uint16_t;
typedef unsigned int rt_uint32_t;
#ifdef ARCH_CPU_64BIT
typedef signed long rt_int64_t;
typedef unsigned long rt_uint64_t;
#else
typedef signed long long rt_int64_t;
typedef unsigned long long rt_uint64_t;
#endif
#endif
typedef int rt_bool_t;
typedef long rt_base_t;
typedef unsigned long rt_ubase_t;
typedef rt_base_t rt_err_t;
typedef rt_uint32_t rt_time_t;
typedef rt_uint32_t rt_tick_t;
typedef rt_base_t rt_flag_t;
typedef rt_ubase_t rt_size_t;
typedef rt_ubase_t rt_dev_t;
typedef rt_base_t rt_off_t;
#define RT_TRUE 1
#define RT_FALSE 0
#define RT_UINT8_MAX 0xff
#define RT_UINT16_MAX 0xffff
#define RT_UINT32_MAX 0xffffffff
#define RT_TICK_MAX RT_UINT32_MAX
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#define __CLANG_ARM
#endif
#if defined(__CC_ARM) || defined(__CLANG_ARM)
#include <stdarg.h>
#define SECTION(x) __attribute__((section(x)))
#define RT_UNUSED __attribute__((unused))
#define RT_USED __attribute__((used))
#define ALIGN(n) __attribute__((aligned(n)))
#define RT_WEAK __attribute__((weak))
#define rt_inline static __inline
#ifdef RT_USING_MODULE
#define RTT_API __declspec(dllimport)
#else
#define RTT_API __declspec(dllexport)
#endif
#elif defined (__IAR_SYSTEMS_ICC__)
#include <stdarg.h>
#define SECTION(x) @ x
#define RT_UNUSED
#define RT_USED __root
#define PRAGMA(x) _Pragma(#x)
#define ALIGN(n) PRAGMA(data_alignment=n)
#define RT_WEAK __weak
#define rt_inline static inline
#define RTT_API
#elif defined (__GNUC__)
#ifdef RT_USING_NEWLIB
#include <stdarg.h>
#else
typedef __builtin_va_list __gnuc_va_list;
typedef __gnuc_va_list va_list;
#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)
#endif
#define SECTION(x) __attribute__((section(x)))
#define RT_UNUSED __attribute__((unused))
#define RT_USED __attribute__((used))
#define ALIGN(n) __attribute__((aligned(n)))
#define RT_WEAK __attribute__((weak))
#define rt_inline static __inline
#define RTT_API
#elif defined (__ADSPBLACKFIN__)
#include <stdarg.h>
#define SECTION(x) __attribute__((section(x)))
#define RT_UNUSED __attribute__((unused))
#define RT_USED __attribute__((used))
#define ALIGN(n) __attribute__((aligned(n)))
#define RT_WEAK __attribute__((weak))
#define rt_inline static inline
#define RTT_API
#elif defined (_MSC_VER)
#include <stdarg.h>
#define SECTION(x)
#define RT_UNUSED
#define RT_USED
#define ALIGN(n) __declspec(align(n))
#define RT_WEAK
#define rt_inline static __inline
#define RTT_API
#elif defined (__TI_COMPILER_VERSION__)
#include <stdarg.h>
#define SECTION(x)
#define RT_UNUSED
#define RT_USED
#define PRAGMA(x) _Pragma(#x)
#define ALIGN(n)
#define RT_WEAK
#define rt_inline static inline
#define RTT_API
#else
#error not supported tool chain
#endif
#ifdef RT_USING_COMPONENTS_INIT
typedef int (*init_fn_t)(void);
#ifdef _MSC_VER
#define INIT_EXPORT(fn, level)
#else
#if RT_DEBUG_INIT
struct rt_init_desc
{
const char* fn_name;
const init_fn_t fn;
};
#define INIT_EXPORT(fn, level) \
const char __rti_##fn##_name[] = #fn; \
RT_USED const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn." level) = \
{ __rti_##fn##_name, fn};
#else
#define INIT_EXPORT(fn, level) \
RT_USED const init_fn_t __rt_init_##fn SECTION(".rti_fn." level) = fn
#endif
#endif
#else
#define INIT_EXPORT(fn, level)
#endif
#define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1")
#define INIT_PREV_EXPORT(fn) INIT_EXPORT(fn, "2")
#define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "3")
#define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "4")
#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5")
#define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")
#if !defined(RT_USING_FINSH)
#define FINSH_FUNCTION_EXPORT(name, desc)
#define FINSH_FUNCTION_EXPORT_ALIAS(name, alias, desc)
#define FINSH_VAR_EXPORT(name, type, desc)
#define MSH_CMD_EXPORT(command, desc)
#define MSH_CMD_EXPORT_ALIAS(command, alias, desc)
#elif !defined(FINSH_USING_SYMTAB)
#define FINSH_FUNCTION_EXPORT_CMD(name, cmd, desc)
#endif
#define RT_EVENT_LENGTH 32
#define RT_MM_PAGE_SIZE 4096
#define RT_MM_PAGE_MASK (RT_MM_PAGE_SIZE - 1)
#define RT_MM_PAGE_BITS 12
#ifndef RT_KERNEL_MALLOC
#define RT_KERNEL_MALLOC(sz) rt_malloc(sz)
#endif
#ifndef RT_KERNEL_FREE
#define RT_KERNEL_FREE(ptr) rt_free(ptr)
#endif
#ifndef RT_KERNEL_REALLOC
#define RT_KERNEL_REALLOC(ptr, size) rt_realloc(ptr, size)
#endif
#define RT_EOK 0
#define RT_ERROR 1
#define RT_ETIMEOUT 2
#define RT_EFULL 3
#define RT_EEMPTY 4
#define RT_ENOMEM 5
#define RT_ENOSYS 6
#define RT_EBUSY 7
#define RT_EIO 8
#define RT_EINTR 9
#define RT_EINVAL 10
#define RT_ALIGN(size, align) (((size) + (align) - 1) & ~((align) - 1))
#define RT_ALIGN_DOWN(size, align) ((size) & ~((align) - 1))
#define RT_NULL (0)
struct rt_list_node
{
struct rt_list_node *next;
struct rt_list_node *prev;
};
typedef struct rt_list_node rt_list_t;
struct rt_slist_node
{
struct rt_slist_node *next;
};
typedef struct rt_slist_node rt_slist_t;
#define RT_OBJECT_FLAG_MODULE 0x80
struct rt_object
{
char name[RT_NAME_MAX];
rt_uint8_t type;
rt_uint8_t flag;
#ifdef RT_USING_MODULE
void *module_id;
#endif
rt_list_t list;
};
typedef struct rt_object *rt_object_t;
enum rt_object_class_type
{
RT_Object_Class_Null = 0x00,
RT_Object_Class_Thread = 0x01,
RT_Object_Class_Semaphore = 0x02,
RT_Object_Class_Mutex = 0x03,
RT_Object_Class_Event = 0x04,
RT_Object_Class_MailBox = 0x05,
RT_Object_Class_MessageQueue = 0x06,
RT_Object_Class_MemHeap = 0x07,
RT_Object_Class_MemPool = 0x08,
RT_Object_Class_Device = 0x09,
RT_Object_Class_Timer = 0x0a,
RT_Object_Class_Module = 0x0b,
RT_Object_Class_Unknown = 0x0c,
RT_Object_Class_Static = 0x80
};
struct rt_object_information
{
enum rt_object_class_type type;
rt_list_t object_list;
rt_size_t object_size;
};
#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
#define RT_TIMER_FLAG_DEACTIVATED 0x0
#define RT_TIMER_FLAG_ACTIVATED 0x1
#define RT_TIMER_FLAG_ONE_SHOT 0x0
#define RT_TIMER_FLAG_PERIODIC 0x2
#define RT_TIMER_FLAG_HARD_TIMER 0x0
#define RT_TIMER_FLAG_SOFT_TIMER 0x4
#define RT_TIMER_CTRL_SET_TIME 0x0
#define RT_TIMER_CTRL_GET_TIME 0x1
#define RT_TIMER_CTRL_SET_ONESHOT 0x2
#define RT_TIMER_CTRL_SET_PERIODIC 0x3
#define RT_TIMER_CTRL_GET_STATE 0x4
#ifndef RT_TIMER_SKIP_LIST_LEVEL
#define RT_TIMER_SKIP_LIST_LEVEL 1
#endif
#ifndef RT_TIMER_SKIP_LIST_MASK
#define RT_TIMER_SKIP_LIST_MASK 0x3
#endif
struct rt_timer
{
struct rt_object parent;
rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];
void (*timeout_func)(void *parameter);
void *parameter;
rt_tick_t init_tick;
rt_tick_t timeout_tick;
};
typedef struct rt_timer *rt_timer_t;
#ifdef RT_USING_SIGNALS
#include <libc/libc_signal.h>
typedef unsigned long rt_sigset_t;
typedef void (*rt_sighandler_t)(int signo);
typedef siginfo_t rt_siginfo_t;
#define RT_SIG_MAX 32
#endif
#define RT_THREAD_INIT 0x00
#define RT_THREAD_READY 0x01
#define RT_THREAD_SUSPEND 0x02
#define RT_THREAD_RUNNING 0x03
#define RT_THREAD_BLOCK RT_THREAD_SUSPEND
#define RT_THREAD_CLOSE 0x04
#define RT_THREAD_STAT_MASK 0x07
#define RT_THREAD_STAT_YIELD 0x08
#define RT_THREAD_STAT_YIELD_MASK RT_THREAD_STAT_YIELD
#define RT_THREAD_STAT_SIGNAL 0x10
#define RT_THREAD_STAT_SIGNAL_READY (RT_THREAD_STAT_SIGNAL | RT_THREAD_READY)
#define RT_THREAD_STAT_SIGNAL_WAIT 0x20
#define RT_THREAD_STAT_SIGNAL_PENDING 0x40
#define RT_THREAD_STAT_SIGNAL_MASK 0xf0
#define RT_THREAD_CTRL_STARTUP 0x00
#define RT_THREAD_CTRL_CLOSE 0x01
#define RT_THREAD_CTRL_CHANGE_PRIORITY 0x02
#define RT_THREAD_CTRL_INFO 0x03
#define RT_THREAD_CTRL_BIND_CPU 0x04
#ifdef RT_USING_SMP
#define RT_CPU_DETACHED RT_CPUS_NR
#define RT_CPU_MASK ((1 << RT_CPUS_NR) - 1)
#ifndef RT_SCHEDULE_IPI
#define RT_SCHEDULE_IPI 0
#endif
struct rt_cpu
{
struct rt_thread *current_thread;
rt_uint16_t irq_nest;
rt_uint8_t irq_switch_flag;
rt_uint8_t current_priority;
rt_list_t priority_table[RT_THREAD_PRIORITY_MAX];
#if RT_THREAD_PRIORITY_MAX > 32
rt_uint32_t priority_group;
rt_uint8_t ready_table[32];
#else
rt_uint32_t priority_group;
#endif
rt_tick_t tick;
};
#endif
struct rt_thread
{
char name[RT_NAME_MAX];
rt_uint8_t type;
rt_uint8_t flags;
#ifdef RT_USING_MODULE
void *module_id;
#endif
rt_list_t list;
rt_list_t tlist;
void *sp;
void *entry;
void *parameter;
void *stack_addr;
rt_uint32_t stack_size;
rt_err_t error;
rt_uint8_t stat;
#ifdef RT_USING_SMP
rt_uint8_t bind_cpu;
rt_uint8_t oncpu;
rt_uint16_t scheduler_lock_nest;
rt_uint16_t cpus_lock_nest;
rt_uint16_t critical_lock_nest;
#endif
rt_uint8_t current_priority;
rt_uint8_t init_priority;
#if RT_THREAD_PRIORITY_MAX > 32
rt_uint8_t number;
rt_uint8_t high_mask;
#endif
rt_uint32_t number_mask;
#if defined(RT_USING_EVENT)
rt_uint32_t event_set;
rt_uint8_t event_info;
#endif
#if defined(RT_USING_SIGNALS)
rt_sigset_t sig_pending;
rt_sigset_t sig_mask;
#ifndef RT_USING_SMP
void *sig_ret;
#endif
rt_sighandler_t *sig_vectors;
void *si_list;
#endif
rt_ubase_t init_tick;
rt_ubase_t remaining_tick;
struct rt_timer thread_timer;
void (*cleanup)(struct rt_thread *tid);
#ifdef RT_USING_LWP
void *lwp;
#endif
rt_ubase_t user_data;
};
typedef struct rt_thread *rt_thread_t;
#define RT_IPC_FLAG_FIFO 0x00
#define RT_IPC_FLAG_PRIO 0x01
#define RT_IPC_CMD_UNKNOWN 0x00
#define RT_IPC_CMD_RESET 0x01
#define RT_WAITING_FOREVER -1
#define RT_WAITING_NO 0
struct rt_ipc_object
{
struct rt_object parent;
rt_list_t suspend_thread;
};
#ifdef RT_USING_SEMAPHORE
struct rt_semaphore
{
struct rt_ipc_object parent;
rt_uint16_t value;
rt_uint16_t reserved;
};
typedef struct rt_semaphore *rt_sem_t;
#endif
#ifdef RT_USING_MUTEX
struct rt_mutex
{
struct rt_ipc_object parent;
rt_uint16_t value;
rt_uint8_t original_priority;
rt_uint8_t hold;
struct rt_thread *owner;
};
typedef struct rt_mutex *rt_mutex_t;
#endif
#ifdef RT_USING_EVENT
#define RT_EVENT_FLAG_AND 0x01
#define RT_EVENT_FLAG_OR 0x02
#define RT_EVENT_FLAG_CLEAR 0x04
struct rt_event
{
struct rt_ipc_object parent;
rt_uint32_t set;
};
typedef struct rt_event *rt_event_t;
#endif
#ifdef RT_USING_MAILBOX
struct rt_mailbox
{
struct rt_ipc_object parent;
rt_ubase_t *msg_pool;
rt_uint16_t size;
rt_uint16_t entry;
rt_uint16_t in_offset;
rt_uint16_t out_offset;
rt_list_t suspend_sender_thread;
};
typedef struct rt_mailbox *rt_mailbox_t;
#endif
#ifdef RT_USING_MESSAGEQUEUE
struct rt_messagequeue
{
struct rt_ipc_object parent;
void *msg_pool;
rt_uint16_t msg_size;
rt_uint16_t max_msgs;
rt_uint16_t entry;
void *msg_queue_head;
void *msg_queue_tail;
void *msg_queue_free;
rt_list_t suspend_sender_thread;
};
typedef struct rt_messagequeue *rt_mq_t;
#endif
#ifdef RT_USING_MEMHEAP
struct rt_memheap_item
{
rt_uint32_t magic;
struct rt_memheap *pool_ptr;
struct rt_memheap_item *next;
struct rt_memheap_item *prev;
struct rt_memheap_item *next_free;
struct rt_memheap_item *prev_free;
};
struct rt_memheap
{
struct rt_object parent;
void *start_addr;
rt_uint32_t pool_size;
rt_uint32_t available_size;
rt_uint32_t max_used_size;
struct rt_memheap_item *block_list;
struct rt_memheap_item *free_list;
struct rt_memheap_item free_header;
struct rt_semaphore lock;
};
#endif
#ifdef RT_USING_MEMPOOL
struct rt_mempool
{
struct rt_object parent;
void *start_address;
rt_size_t size;
rt_size_t block_size;
rt_uint8_t *block_list;
rt_size_t block_total_count;
rt_size_t block_free_count;
rt_list_t suspend_thread;
};
typedef struct rt_mempool *rt_mp_t;
#endif
#ifdef RT_USING_DEVICE
enum rt_device_class_type
{
RT_Device_Class_Char = 0,
RT_Device_Class_Block,
RT_Device_Class_NetIf,
RT_Device_Class_MTD,
RT_Device_Class_CAN,
RT_Device_Class_RTC,
RT_Device_Class_Sound,
RT_Device_Class_Graphic,
RT_Device_Class_I2CBUS,
RT_Device_Class_USBDevice,
RT_Device_Class_USBHost,
RT_Device_Class_SPIBUS,
RT_Device_Class_SPIDevice,
RT_Device_Class_SDIO,
RT_Device_Class_PM,
RT_Device_Class_Pipe,
RT_Device_Class_Portal,
RT_Device_Class_Timer,
RT_Device_Class_Miscellaneous,
RT_Device_Class_Sensor,
RT_Device_Class_Touch,
RT_Device_Class_Unknown
};
#define RT_DEVICE_FLAG_DEACTIVATE 0x000
#define RT_DEVICE_FLAG_RDONLY 0x001
#define RT_DEVICE_FLAG_WRONLY 0x002
#define RT_DEVICE_FLAG_RDWR 0x003
#define RT_DEVICE_FLAG_REMOVABLE 0x004
#define RT_DEVICE_FLAG_STANDALONE 0x008
#define RT_DEVICE_FLAG_ACTIVATED 0x010
#define RT_DEVICE_FLAG_SUSPENDED 0x020
#define RT_DEVICE_FLAG_STREAM 0x040
#define RT_DEVICE_FLAG_INT_RX 0x100
#define RT_DEVICE_FLAG_DMA_RX 0x200
#define RT_DEVICE_FLAG_INT_TX 0x400
#define RT_DEVICE_FLAG_DMA_TX 0x800
#define RT_DEVICE_OFLAG_CLOSE 0x000
#define RT_DEVICE_OFLAG_RDONLY 0x001
#define RT_DEVICE_OFLAG_WRONLY 0x002
#define RT_DEVICE_OFLAG_RDWR 0x003
#define RT_DEVICE_OFLAG_OPEN 0x008
#define RT_DEVICE_OFLAG_MASK 0xf0f
#define RT_DEVICE_CTRL_RESUME 0x01
#define RT_DEVICE_CTRL_SUSPEND 0x02
#define RT_DEVICE_CTRL_CONFIG 0x03
#define RT_DEVICE_CTRL_CLOSE 0x04
#define RT_DEVICE_CTRL_SET_INT 0x10
#define RT_DEVICE_CTRL_CLR_INT 0x11
#define RT_DEVICE_CTRL_GET_INT 0x12
#define RT_DEVICE_CTRL_CHAR_STREAM 0x10
#define RT_DEVICE_CTRL_BLK_GETGEOME 0x10
#define RT_DEVICE_CTRL_BLK_SYNC 0x11
#define RT_DEVICE_CTRL_BLK_ERASE 0x12
#define RT_DEVICE_CTRL_BLK_AUTOREFRESH 0x13
#define RT_DEVICE_CTRL_NETIF_GETMAC 0x10
#define RT_DEVICE_CTRL_MTD_FORMAT 0x10
#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10
#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11
#define RT_DEVICE_CTRL_RTC_GET_ALARM 0x12
#define RT_DEVICE_CTRL_RTC_SET_ALARM 0x13
typedef struct rt_device *rt_device_t;
#ifdef RT_USING_DEVICE_OPS
struct rt_device_ops
{
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);
rt_err_t (*control)(rt_device_t dev, int cmd, void *args);
};
#endif
struct rt_wqueue
{
rt_uint32_t flag;
rt_list_t waiting_list;
};
typedef struct rt_wqueue rt_wqueue_t;
struct rt_device
{
struct rt_object parent;
enum rt_device_class_type type;
rt_uint16_t flag;
rt_uint16_t open_flag;
rt_uint8_t ref_count;
rt_uint8_t device_id;
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
#ifdef RT_USING_DEVICE_OPS
const struct rt_device_ops *ops;
#else
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);
rt_err_t (*control)(rt_device_t dev, int cmd, void *args);
#endif
#if defined(RT_USING_POSIX)
const struct dfs_file_ops *fops;
struct rt_wqueue wait_queue;
#endif
void *user_data;
};
struct rt_device_blk_geometry
{
rt_uint32_t sector_count;
rt_uint32_t bytes_per_sector;
rt_uint32_t block_size;
};
struct rt_device_blk_sectors
{
rt_uint32_t sector_begin;
rt_uint32_t sector_end;
};
#define RT_DEVICE_CTRL_CURSOR_SET_POSITION 0x10
#define RT_DEVICE_CTRL_CURSOR_SET_TYPE 0x11
#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
#define RTGRAPHIC_CTRL_GET_EXT 5
enum
{
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_BGR565 = RTGRAPHIC_PIXEL_FORMAT_RGB565P,
RTGRAPHIC_PIXEL_FORMAT_RGB666,
RTGRAPHIC_PIXEL_FORMAT_RGB888,
RTGRAPHIC_PIXEL_FORMAT_ARGB888,
RTGRAPHIC_PIXEL_FORMAT_ABGR888,
RTGRAPHIC_PIXEL_FORMAT_ARGB565,
RTGRAPHIC_PIXEL_FORMAT_ALPHA,
RTGRAPHIC_PIXEL_FORMAT_COLOR,
};
#define RTGRAPHIC_PIXEL_POSITION(x, y) ((x << 16) | y)
struct rt_device_graphic_info
{
rt_uint8_t pixel_format;
rt_uint8_t bits_per_pixel;
rt_uint16_t reserved;
rt_uint16_t width;
rt_uint16_t height;
rt_uint8_t *framebuffer;
};
struct rt_device_rect_info
{
rt_uint16_t x;
rt_uint16_t y;
rt_uint16_t width;
rt_uint16_t height;
};
struct rt_device_graphic_ops
{
void (*set_pixel) (const char *pixel, int x, int y);
void (*get_pixel) (char *pixel, int x, int y);
void (*draw_hline)(const char *pixel, int x1, int x2, int y);
void (*draw_vline)(const char *pixel, int x, int y1, int y2);
void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);
};
#define rt_graphix_ops(device) ((struct rt_device_graphic_ops *)(device->user_data))
#endif
#include "rtlibc.h"
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
namespace rtthread {
enum TICK_WAIT {
WAIT_NONE = 0,
WAIT_FOREVER = -1,
};
}
#endif
#endif