doubao_chat/include_lib/utils/btmesh/adaptation/adaptation.h

350 lines
8.9 KiB
C

#ifndef __ADAPTATION_H__
#define __ADAPTATION_H__
#include "api/basic_depend.h"
#include "generic/list.h"
#include "generic/jiffies.h"
#include "misc/byteorder.h"
#include "misc/slist.h"
// #include "kernel/atomic_h.h"
#include "api/sig_mesh_api.h"
/*******************************************************************/
/*
*------------------- common adapter
*/
//< base operation
#define min(a, b) MIN(a, b)
#define max(a, b) MAX(a, b)
#define BIT_MASK(n) (BIT(n) - 1)
#define CONTAINER_OF container_of
#undef offsetof
#define offsetof list_offsetof
#define _STRINGIFY(x) #x
#define ___in_section(a, b, c) \
__attribute__((section("." _STRINGIFY(a) \
"." _STRINGIFY(b) \
"." _STRINGIFY(c))))
#define __in_section(a, b, c) ___in_section(a, b, c)
/* Unaligned access */
#define UNALIGNED_GET(p) \
__extension__ ({ \
struct __attribute__((__packed__)) { \
__typeof__(*(p)) __v; \
} *__p = (__typeof__(__p)) (p); \
__p->__v; \
})
#define popcount(x) __builtin_popcount(x)
#define CODE_UNREACHABLE return 0
#define ALWAYS_INLINE inline
#define __noinit
#define __ASSERT ASSERT
#define __ASSERT_NO_MSG(test) ASSERT(test)
#define BUILD_ASSERT(...)
static inline int irq_lock(void)
{
local_irq_disable();
return 0;
}
static inline void irq_unlock(int key)
{
local_irq_enable();
}
/**
*
* @brief find most significant bit set in a 32-bit word
*
* This routine finds the first bit set starting from the most significant bit
* in the argument passed in and returns the index of that bit. Bits are
* numbered starting at 1 from the least significant bit. A return value of
* zero indicates that the value passed is zero.
*
* @return most significant bit set, 0 if @a op is 0
*/
static ALWAYS_INLINE unsigned int find_msb_set(u32_t op)
{
if (!op) {
return 0;
}
return 32 - __builtin_clz(op);
}
/**
*
* @brief find least significant bit set in a 32-bit word
*
* This routine finds the first bit set starting from the least significant bit
* in the argument passed in and returns the index of that bit. Bits are
* numbered starting at 1 from the least significant bit. A return value of
* zero indicates that the value passed is zero.
*
* @return least significant bit set, 0 if @a op is 0
*/
static ALWAYS_INLINE unsigned int find_lsb_set(u32_t op)
{
return __builtin_ffs(op);
}
/*******************************************************************/
/*
*------------------- k_delayed_work
*/
#define K_FOREVER (-1)
/**
* @brief Generate null timeout delay.
*
* This macro generates a timeout delay that that instructs a kernel API
* not to wait if the requested operation cannot be performed immediately.
*
* @return Timeout delay value.
*/
#define K_NO_WAIT 0
/**
* @brief Generate timeout delay from milliseconds.
*
* This macro generates a timeout delay that that instructs a kernel API
* to wait up to @a ms milliseconds to perform the requested operation.
*
* @param ms Duration in milliseconds.
*
* @return Timeout delay value.
*/
#define K_MSEC(ms) (ms)
/**
* @brief Generate timeout delay from seconds.
*
* This macro generates a timeout delay that that instructs a kernel API
* to wait up to @a s seconds to perform the requested operation.
*
* @param s Duration in seconds.
*
* @return Timeout delay value.
*/
#define K_SECONDS(s) K_MSEC((s) * MSEC_PER_SEC)
/**
* @brief Generate timeout delay from minutes.
*
* This macro generates a timeout delay that that instructs a kernel API
* to wait up to @a m minutes to perform the requested operation.
*
* @param m Duration in minutes.
*
* @return Timeout delay value.
*/
#define K_MINUTES(m) K_SECONDS((m) * 60)
/**
* @brief Generate timeout delay from hours.
*
* This macro generates a timeout delay that that instructs a kernel API
* to wait up to @a h hours to perform the requested operation.
*
* @param h Duration in hours.
*
* @return Timeout delay value.
*/
#define K_HOURS(h) K_MINUTES((h) * 60)
u32 k_uptime_get(void);
u32 k_uptime_get_32(void);
u32 k_delayed_work_remaining_get(struct k_delayed_work *timer);
void k_delayed_work_submit(struct k_delayed_work *timer, u32 timeout);
void k_delayed_work_cancel(struct k_delayed_work *timer);
void k_work_submit(struct k_work *work);
void k_delayed_work_init(struct k_delayed_work *timer, void *callback);
/*******************************************************************/
/*
*------------------- Ble core
*/
/** @brief Bluetooth UUID types */
enum {
BT_UUID_TYPE_16,
BT_UUID_TYPE_32,
BT_UUID_TYPE_128,
};
/** @brief This is a 'tentative' type and should be used as a pointer only */
struct bt_uuid {
u8_t type;
};
struct bt_uuid_16 {
struct bt_uuid uuid;
u16_t val;
};
struct bt_uuid_32 {
struct bt_uuid uuid;
u32_t val;
};
struct bt_uuid_128 {
struct bt_uuid uuid;
u8_t val[16];
};
/** Bluetooth Device Address */
typedef struct {
u8_t val[6];
} bt_addr_t;
/** Bluetooth LE Device Address */
typedef struct {
u8_t type;
bt_addr_t a;
} bt_addr_le_t;
/*******************************************************************/
/*
*------------------- utils
*/
#define bt_hex bt_hex_real
const char *bt_hex_real(const void *buf, size_t len);
const char *bt_uuid_str(const struct bt_uuid *uuid);
/*******************************************************************/
/*
*------------------- hci_core
*/
typedef void (*bt_dh_key_cb_t)(const u8_t key[32]);
struct bt_conn {
u16_t handle;
u16_t mtu;
atomic_tt ref;
};
struct bt_conn_cb {
/** @brief A new connection has been established.
*
* This callback notifies the application of a new connection.
* In case the err parameter is non-zero it means that the
* connection establishment failed.
*
* @param conn New connection object.
* @param err HCI error. Zero for success, non-zero otherwise.
*/
void (*connected)(struct bt_conn *conn, u8_t err);
/** @brief A connection has been disconnected.
*
* This callback notifies the application that a connection
* has been disconnected.
*
* @param conn Connection object.
* @param reason HCI reason for the disconnection.
*/
void (*disconnected)(struct bt_conn *conn, u8_t reason);
};
struct bt_pub_key_cb {
/** @brief Callback type for Public Key generation.
*
* Used to notify of the local public key or that the local key is not
* available (either because of a failure to read it or because it is
* being regenerated).
*
* @param key The local public key, or NULL in case of no key.
*/
void (*func)(const u8_t key[64]);
struct bt_pub_key_cb *_next;
};
const u8_t *bt_pub_key_get(void);
int bt_pub_key_gen(struct bt_pub_key_cb *new_cb);
int bt_dh_key_gen(const u8_t remote_pk[64], bt_dh_key_cb_t cb);
struct bt_conn *bt_conn_ref(struct bt_conn *conn);
void bt_conn_unref(struct bt_conn *conn);
void bt_conn_cb_register(struct bt_conn_cb *cb);
void hci_core_init(void);
/*******************************************************************/
/*
*------------------- adv_core
*/
/* Advertising types */
#define BT_LE_ADV_IND 0x00
#define BT_LE_ADV_DIRECT_IND 0x01
#define BT_LE_ADV_SCAN_IND 0x02
#define BT_LE_ADV_NONCONN_IND 0x03
#define BT_LE_ADV_DIRECT_IND_LOW_DUTY 0x04
/* Needed in advertising reports when getting info about */
#define BT_LE_ADV_SCAN_RSP 0x04
#define BT_DATA_URI 0x24 /* URI */
#define BT_DATA_MESH_PROV 0x29 /* Mesh Provisioning PDU */
#define BT_DATA_MESH_MESSAGE 0x2a /* Mesh Networking PDU */
#define BT_DATA_MESH_BEACON 0x2b /* Mesh Beacon */
void bt_mesh_adv_init(void);
/*******************************************************************/
/*
*------------------- scan_core
*/
typedef void bt_le_scan_cb_t(const bt_addr_le_t *addr, s8_t rssi,
u8_t adv_type, struct net_buf_simple *buf);
int bt_le_scan_start(bt_le_scan_cb_t cb);
int bt_le_scan_stop(void);
/*******************************************************************/
/*
*------------------- gatt_core
*/
#define BT_HCI_ERR_REMOTE_USER_TERM_CONN 0x13
#define BT_GATT_ERR(_att_err) (-(_att_err))
#define BT_ATT_ERR_INVALID_ATTRIBUTE_LEN 0x0d
#define BT_ATT_ERR_VALUE_NOT_ALLOWED 0x13
#define BT_GATT_CCC_NOTIFY 0x0001
u8 *get_server_data_addr(void);
void bt_gatt_service_register(u32 uuid);
void bt_gatt_service_unregister(u32 uuid);
int bt_gatt_notify(struct bt_conn *conn, const void *data, u16_t len);
u16 bt_gatt_get_mtu(struct bt_conn *conn);
void bt_conn_disconnect(struct bt_conn *conn, u8 reason);
void proxy_gatt_init(void);
#endif /* __ADAPTATION_H__ */