Files
mr-library/include/mrdef.h
2023-08-30 00:40:30 +08:00

553 lines
20 KiB
C

/*
* Copyright (c) 2023, mr-library Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-05-08 MacRsh first version
*/
#ifndef _MR_DEF_H_
#define _MR_DEF_H_
#include "mrconfig.h"
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <malloc.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @version mr-library version
*/
#define MR_LIBRARY_VERSION "0.0.3"
/**
* @def Compiler related
*/
#if defined(__ARMCC_VERSION)
#define MR_SECTION(x) __attribute__((section(x)))
#define MR_USED __attribute__((used))
#define MR_ALIGN(n) __attribute__((aligned(n)))
#define MR_WEAK __attribute__((weak))
#define MR_INLINE static __inline
#elif defined (__IAR_SYSTEMS_ICC__)
#define MR_SECTION(x) @ x
#define MR_USED __root
#define mr_pragma(x) _Pragma(#x)
#define MR_ALIGN(n) PRAGMA(data_alignment=n)
#define MR_WEAK __weak
#define MR_INLINE static inline
#elif defined (__GNUC__)
#define MR_SECTION(x) __attribute__((section(x)))
#define MR_USED __attribute__((used))
#define MR_ALIGN(n) __attribute__((aligned(n)))
#define MR_WEAK __attribute__((weak))
#define MR_INLINE static __inline
#elif defined (__ADSPBLACKFIN__)
#define MR_SECTION(x) __attribute__((section(x)))
#define MR_USED __attribute__((used))
#define MR_ALIGN(n) __attribute__((aligned(n)))
#define MR_WEAK __attribute__((weak))
#define MR_INLINE static inline
#elif defined (_MSC_VER)
#define MR_SECTION(x)
#define MR_USED
#define MR_ALIGN(n) __declspec(align(n))
#define MR_WEAK
#define MR_INLINE static __inline
#elif defined (__TASKING__)
#define MR_SECTION(x) __attribute__((section(x)))
#define MR_USED __attribute__((used, protect))
#define MR_ALIGN(n) __attribute__((__align(n)))
#define MR_WEAK __attribute__((weak))
#define MR_INLINE static inline
#endif
/**
* @def Basic data type
*/
typedef signed char mr_int8_t; /* Type for 8bit integer */
typedef signed short mr_int16_t; /* Type for 16bit integer */
typedef signed int mr_int32_t; /* Type for 32bit integer */
typedef signed long long mr_int64_t; /* Type for 64bit integer */
typedef unsigned char mr_uint8_t; /* Type for 8bit unsigned integer */
typedef unsigned short mr_uint16_t; /* Type for 16bit unsigned integer */
typedef unsigned int mr_uint32_t; /* Type for 32bit unsigned integer */
typedef unsigned long long mr_uint64_t; /* Type for 64bit unsigned integer */
typedef float mr_fp32_t; /* Type for single-precision floating point */
typedef double mr_fp64_t; /* Type for double-precision floating point */
typedef signed int mr_base_t; /* Type for Nbit CPU related date */
typedef unsigned int mr_ubase_t; /* Type for Nbit unsigned CPU related data */
typedef mr_ubase_t mr_size_t; /* Type for size number */
typedef mr_base_t mr_ssize_t; /* Type for signed size number */
typedef mr_base_t mr_err_t; /* Type for error number */
typedef mr_base_t mr_pos_t; /* Type for position */
typedef mr_int8_t mr_bool_t; /* Type for boolean */
typedef mr_int8_t mr_level_t; /* Type for level */
typedef mr_int8_t mr_state_t; /* Type for state */
#define MR_UINT8_MAX 0xff /* Maximum unsigned 8bit integer */
#define MR_UINT16_MAX 0xffff /* Maximum unsigned 16bit integer */
#define MR_UINT32_MAX 0xffffffff /* Maximum unsigned 32bit integer */
#define MR_INT8_MAX 0x7f /* Maximum signed 8bit integer */
#define MR_INT16_MAX 0x7fff /* Maximum signed 16bit integer */
#define MR_INT32_MAX 0x7fffffff /* Maximum signed 32bit integer */
/**
* @def Null pointer
*/
#define MR_NULL (void *)0 /* Null pointer */
/**
* @def Boolean value
*/
#define MR_FALSE 0 /* False */
#define MR_TRUE 1 /* True */
/**
* @def Level value
*/
#define MR_LOW 0 /* Low level */
#define MR_HIGH 1 /* High level */
/**
* @def State value
*/
#define MR_DISABLE 0 /* Disable */
#define MR_ENABLE 1 /* Enable */
/**
* @def Error code
*/
#define MR_ERR_OK 0 /* There is no error */
#define MR_ERR_GENERIC 1 /* Generic error happens */
#define MR_ERR_NO_MEMORY 2 /* No memory */
#define MR_ERR_IO 3 /* IO error */
#define MR_ERR_TIMEOUT 4 /* Timed out */
#define MR_ERR_BUSY 5 /* Busy */
#define MR_ERR_NOT_FOUND 6 /* Not found */
#define MR_ERR_UNSUPPORTED 7 /* Unsupported feature */
#define MR_ERR_INVALID 8 /* Invalid parameter */
/**
* @addtogroup Auto init
* @{
*/
#if(MR_CFG_AUTO_INIT == MR_CFG_ENABLE)
typedef int (*init_fn_t)(void);
/**
* @def Auto-init export
*/
#define MR_INIT_EXPORT(fn, level) \
MR_USED const init_fn_t _mr_auto_init_##fn MR_SECTION(".auto_init."level) = fn
/**
* @def Driver auto-init export
*/
#define MR_INIT_DRIVER_EXPORT(fn) MR_INIT_EXPORT(fn, "1")
/**
* @def Device auto-init export
*/
#define MR_INIT_DEVICE_EXPORT(fn) MR_INIT_EXPORT(fn, "2")
/**
* @def Module auto-init export
*/
#define MR_INIT_MODULE_EXPORT(fn) MR_INIT_EXPORT(fn, "3")
/**
* @def App auto-init export
*/
#define MR_INIT_APP_EXPORT(fn) MR_INIT_EXPORT(fn, "4")
#else
#define MR_INIT_DEVICE_EXPORT(fn)
#define MR_INIT_MODULE_EXPORT(fn)
#define MR_INIT_APP_EXPORT(fn)
#endif
/** @} */
/**
* @struct Single list
*/
struct mr_slist
{
struct mr_slist *next; /* Point to next node */
};
typedef struct mr_slist *mr_slist_t; /* Type for slist */
/**
* @struct Double list
*/
struct mr_list
{
struct mr_list *next; /* Point to next node */
struct mr_list *prev; /* Point to prev node */
};
typedef struct mr_list *mr_list_t; /* Type for list */
/**
* @struct AVL tree
*/
struct mr_avl
{
mr_int8_t height; /* Balance factor */
mr_uint32_t value; /* Key-hold */
struct mr_avl *left_child; /* Point to left-child node */
struct mr_avl *right_child; /* Point to right-child node */
};
typedef struct mr_avl *mr_avl_t; /* Type for avl-tree */
/**
* @struct Ring buffer
*/
struct mr_rb
{
mr_uint16_t read_mirror: 1; /* Read mirror flag */
mr_uint16_t read_index: 15; /* Read index */
mr_uint16_t write_mirror: 1; /* Write mirror flag */
mr_uint16_t write_index: 15; /* Write index */
mr_uint16_t size; /* Buffer pool size */
mr_uint8_t *buffer; /* Buffer pool */
};
typedef struct mr_rb *mr_rb_t; /* Type for fifo */
/**
* @struct Transfer
*/
struct mr_transfer
{
void *data; /* Transfer data */
mr_size_t size; /* Transfer size */
struct mr_transfer *next; /* Point to next transfer */
};
typedef struct mr_transfer *mr_transfer_t; /* Type for transfer */
/**
* @addtogroup Object
* @{
*/
/**
* @enum Object type
*/
enum mr_object_type
{
Mr_Object_Type_None, /* No object */
Mr_Object_Type_Device, /* Device object */
Mr_Object_Type_Fsm, /* FSM object */
Mr_Object_Type_Event, /* Event object */
Mr_Object_Type_SoftTimer, /* Soft timer object */
Mr_Object_Type_Module, /* Module object */
};
/**
* @struct Object container
*/
struct mr_object_container
{
enum mr_object_type type; /* Object type */
struct mr_list list; /* Container list */
};
typedef struct mr_object_container *mr_object_container_t; /* Type for container */
/**
* @struct Object
*/
struct mr_object
{
char name[MR_CFG_OBJECT_NAME_SIZE]; /* Object name */
enum mr_object_type type; /* Object type */
struct mr_list list; /* Object list */
};
typedef struct mr_object *mr_object_t; /* Type for object */
/** @} */
/**
* @struct Mutex
*/
struct mr_mutex
{
volatile mr_size_t hold; /* Mutex hold count */
volatile void *owner; /* Mutex owner */
};
typedef struct mr_mutex *mr_mutex_t; /* Type for mutex */
/**
* @addtogroup Finite State Machine
* @{
*/
#if (MR_CFG_FSM == MR_CFG_ENABLE)
typedef struct mr_fsm_table *mr_fsm_table_t; /* Type for fsm table */
/**
* @struct FSM
*/
struct mr_fsm
{
struct mr_object object; /* FSM object */
mr_fsm_table_t table; /* State table */
mr_size_t table_size; /* State table size */
mr_uint32_t current_state; /* Current state */
mr_uint32_t next_state; /* Next state */
};
typedef struct mr_fsm *mr_fsm_t; /* Type for fsm */
/**
* @struct FSM table
*/
struct mr_fsm_table
{
mr_err_t (*cb)(mr_fsm_t fsm, void *args); /* State callback */
void *args; /* State arguments */
mr_err_t (*signal)(mr_fsm_t fsm, mr_uint32_t signal); /* State signal */
};
#endif
/** @} */
/**
* @addtogroup Event
* @{
*/
#if (MR_CFG_EVENT == MR_CFG_ENABLE)
typedef struct mr_event_table *mr_event_table_t; /* Type for event */
/**
* @struct Event
*/
struct mr_event
{
struct mr_object object; /* Event object */
mr_event_table_t table; /* Event table */
mr_size_t table_size; /* Event table size */
struct mr_rb queue; /* Event queue */
};
typedef struct mr_event *mr_event_t; /* Type for event */
/**
* @struct Event table
*/
struct mr_event_table
{
mr_err_t (*cb)(mr_event_t event, void *args); /* Event callback */
void *args; /* Event arguments */
};
#endif
/** @} */
/**
* @addtogroup Soft-timer
* @{
*/
#if (MR_CFG_SOFT_TIMER == MR_CFG_ENABLE)
/**
* @enum Soft-timer type
*/
enum mr_soft_timer_type
{
Mr_Soft_Timer_Type_Period, /* Periodic timer */
Mr_Soft_Timer_Type_Oneshot, /* One-shot timer */
};
/**
* @struct Soft-timer data
*/
struct mr_soft_timer_data
{
mr_uint32_t timeout; /* Timeout time */
struct mr_list timeout_list; /* Timeout list */
};
typedef struct mr_soft_timer_data *mr_soft_timer_data_t; /* Type for soft-timer data */
typedef struct mr_soft_timer_table *mr_soft_timer_table_t; /* Type for soft-timer table */
/**
* @struct Soft-timer
*/
struct mr_soft_timer
{
struct mr_object object; /* Soft-timer object */
mr_soft_timer_table_t table; /* Timer table */
mr_size_t table_size; /* Timer table size */
mr_uint32_t current_time; /* Current time */
struct mr_list timeout_list; /* Timeout list */
mr_soft_timer_data_t data; /* Timer data */
};
typedef struct mr_soft_timer *mr_soft_timer_t; /* Type for soft-timer */
/**
* @struct Soft-timer table
*/
struct mr_soft_timer_table
{
mr_uint32_t time; /* Timer interval time */
enum mr_soft_timer_type type; /* Timer type */
mr_err_t (*cb)(mr_soft_timer_t timer, void *args); /* Timer callback */
void *args; /* Timer arguments */
};
#endif
/** @} */
/**
* @addtogroup Device
* @{
*/
#if (MR_CFG_DEVICE == MR_CFG_ENABLE)
/**
* @enum Device type
*/
enum mr_device_type
{
Mr_Device_Type_None, /* No device */
Mr_Device_Type_Pin, /* GPIO device */
Mr_Device_Type_SPIBUS, /* SPI-BUS device */
Mr_Device_Type_SPI, /* SPI device */
Mr_Device_Type_I2CBUS, /* I2C-BUS device */
Mr_Device_Type_I2C, /* I2C device */
Mr_Device_Type_Serial, /* UART device */
Mr_Device_Type_ADC, /* ADC device */
Mr_Device_Type_DAC, /* DAC device */
Mr_Device_Type_PWM, /* PWM device */
Mr_Device_Type_Timer, /* TIMER device */
Mr_Device_Type_Flash, /* FLASH device */
/* ... */
};
/**
* @def Device open mode flags
*/
#define MR_OPEN_CLOSED 0x0000 /* Closed */
#define MR_OPEN_RDONLY 0x1000 /* Read only */
#define MR_OPEN_WRONLY 0x2000 /* Write only */
#define MR_OPEN_RDWR 0x3000 /* Read and write */
#define MR_OPEN_NONBLOCKING 0x4000 /* Non-blocking */
#define MR_OPEN_FLAG_MASK 0xf000 /* Mask for open mode flag */
/**
* @def Device control flags
*/
#define MR_CTRL_NONE 0x0000 /* No control */
#define MR_CTRL_SET_CONFIG 0x1000 /* Set configure */
#define MR_CTRL_GET_CONFIG 0x2000 /* Get configure */
#define MR_CTRL_SET_RX_CB 0x3000 /* Set receive callback */
#define MR_CTRL_SET_TX_CB 0x4000 /* Set transmit callback */
#define MR_CTRL_SET_RX_BUFSZ 0x5000 /* Set receive buffer size */
#define MR_CTRL_SET_TX_BUFSZ 0x6000 /* Set transmit buffer size */
#define MR_CTRL_ATTACH 0x7000 /* Attach the bus */
#define MR_CTRL_TRANSFER 0x8000 /* Transfer */
#define MR_CTRL_REBOOT 0x9000 /* Reboot */
#define MR_CTRL_FLAG_MASK 0xf000 /* Mask for control flag */
typedef struct mr_device *mr_device_t; /* Type for device */
/**
* @struct Device operations
*/
struct mr_device_ops
{
mr_err_t (*open)(mr_device_t device);
mr_err_t (*close)(mr_device_t device);
mr_err_t (*ioctl)(mr_device_t device, int cmd, void *args);
mr_ssize_t (*read)(mr_device_t device, mr_pos_t pos, void *buffer, mr_size_t size);
mr_ssize_t (*write)(mr_device_t device, mr_pos_t pos, const void *buffer, mr_size_t size);
};
/**
* @struct Device
*/
struct mr_device
{
struct mr_object object; /* Device object */
enum mr_device_type type; /* Device type */
mr_uint16_t support_flag; /* Open mode supported */
mr_uint16_t open_flag; /* Open mode */
mr_size_t ref_count; /* Number of references */
mr_err_t (*rx_cb)(mr_device_t device, void *args); /* Receive the completed callback */
mr_err_t (*tx_cb)(mr_device_t device, void *args); /* Send completion callback */
const struct mr_device_ops *ops; /* Operations */
void *data; /* Device data */
};
/**
* @struct Device channel
*/
struct mr_device_channel
{
union
{
struct
{
mr_pos_t ch0: 1;
mr_pos_t ch1: 1;
mr_pos_t ch2: 1;
mr_pos_t ch3: 1;
mr_pos_t ch4: 1;
mr_pos_t ch5: 1;
mr_pos_t ch6: 1;
mr_pos_t ch7: 1;
mr_pos_t ch8: 1;
mr_pos_t ch9: 1;
mr_pos_t ch10: 1;
mr_pos_t ch11: 1;
mr_pos_t ch12: 1;
mr_pos_t ch13: 1;
mr_pos_t ch14: 1;
mr_pos_t ch15: 1;
mr_pos_t ch16: 1;
mr_pos_t ch17: 1;
mr_pos_t ch18: 1;
mr_pos_t ch19: 1;
mr_pos_t ch20: 1;
mr_pos_t ch21: 1;
mr_pos_t ch22: 1;
mr_pos_t ch23: 1;
mr_pos_t ch24: 1;
mr_pos_t ch25: 1;
mr_pos_t ch26: 1;
mr_pos_t ch27: 1;
mr_pos_t ch28: 1;
mr_pos_t ch29: 1;
mr_pos_t ch30: 1;
mr_pos_t ch31: 1;
};
mr_pos_t mask;
};
};
typedef struct mr_device_channel *mr_device_channel_t; /* Type for device channel */
#endif
/** @} */
#endif /* _MR_DEF_H_ */