mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-07-30 06:37:55 +00:00
esp_nimble: Make changes to nimble code to make it compatible with IDF and VHCI
1) Modify a few porting functions for FreeRTOS. 2) Add freertos tasks for BLE host and mesh. 3) Keep a byte for packet type in transport buffers to make it compatible with ESP32 VHCI interface. 4) Modify host mutex lock functionality.
This commit is contained in:
committed by
Hrishikesh Dhayagude
parent
137efe3bc2
commit
4a78a2af26
@@ -49,6 +49,8 @@ static s32_t adv_int_min = ADV_INT_DEFAULT_MS;
|
||||
#define ADV_STACK_SIZE 768
|
||||
OS_TASK_STACK_DEFINE(g_blemesh_stack, ADV_STACK_SIZE);
|
||||
struct os_task adv_task;
|
||||
#else
|
||||
static TaskHandle_t adv_task_h;
|
||||
#endif
|
||||
|
||||
static struct ble_npl_eventq adv_queue;
|
||||
@@ -322,6 +324,9 @@ void bt_mesh_adv_init(void)
|
||||
os_task_init(&adv_task, "mesh_adv", mesh_adv_thread, NULL,
|
||||
MYNEWT_VAL(BLE_MESH_ADV_TASK_PRIO), OS_WAIT_FOREVER,
|
||||
g_blemesh_stack, ADV_STACK_SIZE);
|
||||
#else
|
||||
xTaskCreate(mesh_adv_thread, "mesh_adv", 2768,
|
||||
NULL, (configMAX_PRIORITIES - 4), &adv_task_h);
|
||||
#endif
|
||||
|
||||
/* For BT5 controllers we can have fast advertising interval */
|
||||
|
||||
@@ -85,6 +85,7 @@ uint16_t ble_hs_max_attrs;
|
||||
uint16_t ble_hs_max_services;
|
||||
uint16_t ble_hs_max_client_configs;
|
||||
|
||||
static uint8_t ble_hs_mutex_locked;
|
||||
#if MYNEWT_VAL(BLE_HS_DEBUG)
|
||||
static uint8_t ble_hs_dbg_mutex_locked;
|
||||
#endif
|
||||
@@ -130,7 +131,7 @@ ble_hs_locked_by_cur_task(void)
|
||||
owner = ble_hs_mutex.mu.mu_owner;
|
||||
return owner != NULL && owner == os_sched_get_current_task();
|
||||
#else
|
||||
return 1;
|
||||
return ble_hs_mutex_locked;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@@ -160,6 +161,7 @@ ble_hs_lock_nested(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
ble_hs_mutex_locked = 1;
|
||||
rc = ble_npl_mutex_pend(&ble_hs_mutex, 0xffffffff);
|
||||
BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED);
|
||||
}
|
||||
@@ -179,6 +181,7 @@ ble_hs_unlock_nested(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
ble_hs_mutex_locked = 0;
|
||||
rc = ble_npl_mutex_release(&ble_hs_mutex);
|
||||
BLE_HS_DBG_ASSERT_EVAL(rc == 0 || rc == OS_NOT_STARTED);
|
||||
}
|
||||
@@ -189,7 +192,7 @@ ble_hs_unlock_nested(void)
|
||||
void
|
||||
ble_hs_lock(void)
|
||||
{
|
||||
BLE_HS_DBG_ASSERT(!ble_hs_locked_by_cur_task());
|
||||
//BLE_HS_DBG_ASSERT(!ble_hs_locked_by_cur_task());
|
||||
#if MYNEWT_VAL(BLE_HS_DEBUG)
|
||||
if (!ble_npl_os_started()) {
|
||||
BLE_HS_DBG_ASSERT(!ble_hs_dbg_mutex_locked);
|
||||
|
||||
@@ -74,18 +74,21 @@ ble_hs_hci_cmd_send(uint16_t opcode, uint8_t len, const void *cmddata)
|
||||
buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD);
|
||||
BLE_HS_DBG_ASSERT(buf != NULL);
|
||||
|
||||
/* Hack for avoiding memcpy while handling tx pkt to VHCI,
|
||||
* keep one byte for type field*/
|
||||
buf++;
|
||||
put_le16(buf, opcode);
|
||||
buf[2] = len;
|
||||
if (len != 0) {
|
||||
memcpy(buf + BLE_HCI_CMD_HDR_LEN, cmddata, len);
|
||||
}
|
||||
|
||||
#if !BLE_MONITOR
|
||||
BLE_HS_LOG(DEBUG, "ble_hs_hci_cmd_send: ogf=0x%02x ocf=0x%04x len=%d\n",
|
||||
BLE_HCI_OGF(opcode), BLE_HCI_OCF(opcode), len);
|
||||
ble_hs_log_flat_buf(buf, len + BLE_HCI_CMD_HDR_LEN);
|
||||
BLE_HS_LOG(DEBUG, "\n");
|
||||
#endif
|
||||
buf--;
|
||||
|
||||
rc = ble_hs_hci_cmd_transport(buf);
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ ble_hs_mbuf_bare_pkt(void)
|
||||
struct os_mbuf *
|
||||
ble_hs_mbuf_acl_pkt(void)
|
||||
{
|
||||
return ble_hs_mbuf_gen_pkt(BLE_HCI_DATA_HDR_SZ);
|
||||
return ble_hs_mbuf_gen_pkt(BLE_HCI_DATA_HDR_SZ + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,7 +81,7 @@ ble_hs_mbuf_acl_pkt(void)
|
||||
struct os_mbuf *
|
||||
ble_hs_mbuf_l2cap_pkt(void)
|
||||
{
|
||||
return ble_hs_mbuf_gen_pkt(BLE_HCI_DATA_HDR_SZ + BLE_L2CAP_HDR_SZ);
|
||||
return ble_hs_mbuf_gen_pkt(BLE_HCI_DATA_HDR_SZ + BLE_L2CAP_HDR_SZ + 1);
|
||||
}
|
||||
|
||||
struct os_mbuf *
|
||||
|
||||
@@ -157,7 +157,7 @@ void ble_npl_time_delay(ble_npl_time_t ticks);
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
|
||||
void ble_npl_hw_set_isr(int irqn, void (*addr)(void));
|
||||
void ble_npl_hw_set_isr(int irqn, uint32_t addr);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* This file was generated by Apache Newt version: 1.4.0-dev
|
||||
* This file was generated by Apache Newt version: 1.4.1
|
||||
*/
|
||||
|
||||
#ifndef H_MYNEWT_SYSCFG_
|
||||
@@ -386,7 +386,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MAX_CONNECTIONS
|
||||
#define MYNEWT_VAL_BLE_MAX_CONNECTIONS (1)
|
||||
#define MYNEWT_VAL_BLE_MAX_CONNECTIONS (2)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MULTI_ADV_INSTANCES
|
||||
@@ -413,7 +413,171 @@
|
||||
#define MYNEWT_VAL_BLE_WHITELIST (1)
|
||||
#endif
|
||||
|
||||
/*** nimble/host */
|
||||
/*** @apache-mynewt-nimble/nimble/controller */
|
||||
#ifndef MYNEWT_VAL_BLE_DEVICE
|
||||
#define MYNEWT_VAL_BLE_DEVICE (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by @apache-mynewt-nimble/nimble/controller (defined by @apache-mynewt-nimble/nimble/controller) */
|
||||
#ifndef MYNEWT_VAL_BLE_HW_WHITELIST_ENABLE
|
||||
#define MYNEWT_VAL_BLE_HW_WHITELIST_ENABLE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_ADD_STRICT_SCHED_PERIODS
|
||||
#define MYNEWT_VAL_BLE_LL_ADD_STRICT_SCHED_PERIODS (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_CONN_PARAM_REQ
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_CONN_PARAM_REQ (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_DATA_LEN_EXT
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_DATA_LEN_EXT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_EXT_SCAN_FILT
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_EXT_SCAN_FILT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_2M_PHY
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_2M_PHY (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_CODED_PHY
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_CODED_PHY (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by @apache-mynewt-nimble/nimble/controller (defined by @apache-mynewt-nimble/nimble/controller) */
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_CSA2
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_CSA2 (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_ENCRYPTION
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_ENCRYPTION (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_PING
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_PING (MYNEWT_VAL_BLE_LL_CFG_FEAT_LE_ENCRYPTION)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_EXT_ADV
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_EXT_ADV (MYNEWT_VAL_BLE_EXT_ADV)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_PRIVACY
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_LL_PRIVACY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CFG_FEAT_SLAVE_INIT_FEAT_XCHG
|
||||
#define MYNEWT_VAL_BLE_LL_CFG_FEAT_SLAVE_INIT_FEAT_XCHG (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CONN_INIT_MAX_TX_BYTES
|
||||
#define MYNEWT_VAL_BLE_LL_CONN_INIT_MAX_TX_BYTES (27)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CONN_INIT_MIN_WIN_OFFSET
|
||||
#define MYNEWT_VAL_BLE_LL_CONN_INIT_MIN_WIN_OFFSET (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_CONN_INIT_SLOTS
|
||||
#define MYNEWT_VAL_BLE_LL_CONN_INIT_SLOTS (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_DIRECT_TEST_MODE
|
||||
#define MYNEWT_VAL_BLE_LL_DIRECT_TEST_MODE (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by @apache-mynewt-nimble/nimble/controller (defined by @apache-mynewt-nimble/nimble/controller) */
|
||||
#ifndef MYNEWT_VAL_BLE_LL_EXT_ADV_AUX_PTR_CNT
|
||||
#define MYNEWT_VAL_BLE_LL_EXT_ADV_AUX_PTR_CNT (5)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_MASTER_SCA
|
||||
#define MYNEWT_VAL_BLE_LL_MASTER_SCA (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_MAX_PKT_SIZE
|
||||
#define MYNEWT_VAL_BLE_LL_MAX_PKT_SIZE (251)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_MFRG_ID
|
||||
#define MYNEWT_VAL_BLE_LL_MFRG_ID (0xFFFF)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_NUM_SCAN_DUP_ADVS
|
||||
#define MYNEWT_VAL_BLE_LL_NUM_SCAN_DUP_ADVS (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_NUM_SCAN_RSP_ADVS
|
||||
#define MYNEWT_VAL_BLE_LL_NUM_SCAN_RSP_ADVS (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_OUR_SCA
|
||||
#define MYNEWT_VAL_BLE_LL_OUR_SCA (60)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_PRIO
|
||||
#define MYNEWT_VAL_BLE_LL_PRIO (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_RESOLV_LIST_SIZE
|
||||
#define MYNEWT_VAL_BLE_LL_RESOLV_LIST_SIZE (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_RNG_BUFSIZE
|
||||
#define MYNEWT_VAL_BLE_LL_RNG_BUFSIZE (32)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_STRICT_CONN_SCHEDULING
|
||||
#define MYNEWT_VAL_BLE_LL_STRICT_CONN_SCHEDULING (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_SUPP_MAX_RX_BYTES
|
||||
#define MYNEWT_VAL_BLE_LL_SUPP_MAX_RX_BYTES (MYNEWT_VAL_BLE_LL_MAX_PKT_SIZE)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_SUPP_MAX_TX_BYTES
|
||||
#define MYNEWT_VAL_BLE_LL_SUPP_MAX_TX_BYTES (MYNEWT_VAL_BLE_LL_MAX_PKT_SIZE)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_SYSVIEW
|
||||
#define MYNEWT_VAL_BLE_LL_SYSVIEW (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_TX_PWR_DBM
|
||||
#define MYNEWT_VAL_BLE_LL_TX_PWR_DBM (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_USECS_PER_PERIOD
|
||||
#define MYNEWT_VAL_BLE_LL_USECS_PER_PERIOD (3250)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_VND_EVENT_ON_ASSERT
|
||||
#define MYNEWT_VAL_BLE_LL_VND_EVENT_ON_ASSERT (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LL_WHITELIST_SIZE
|
||||
#define MYNEWT_VAL_BLE_LL_WHITELIST_SIZE (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_LP_CLOCK
|
||||
#define MYNEWT_VAL_BLE_LP_CLOCK (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_NUM_COMP_PKT_RATE
|
||||
#define MYNEWT_VAL_BLE_NUM_COMP_PKT_RATE ((2 * OS_TICKS_PER_SEC))
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_PUBLIC_DEV_ADDR
|
||||
#define MYNEWT_VAL_BLE_PUBLIC_DEV_ADDR ((uint8_t[6]){0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_XTAL_SETTLE_TIME
|
||||
#define MYNEWT_VAL_BLE_XTAL_SETTLE_TIME (0)
|
||||
#endif
|
||||
|
||||
/*** @apache-mynewt-nimble/nimble/host */
|
||||
#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU
|
||||
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (256)
|
||||
#endif
|
||||
@@ -575,7 +739,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_DEBUG
|
||||
#define MYNEWT_VAL_BLE_HS_DEBUG (0)
|
||||
#define MYNEWT_VAL_BLE_HS_DEBUG (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_HS_FLOW_CTRL
|
||||
@@ -623,7 +787,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH
|
||||
#define MYNEWT_VAL_BLE_MESH (0)
|
||||
#define MYNEWT_VAL_BLE_MESH (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MONITOR_CONSOLE_BUFFER_SIZE
|
||||
@@ -699,7 +863,7 @@
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_SC
|
||||
#define MYNEWT_VAL_BLE_SM_SC (0)
|
||||
#define MYNEWT_VAL_BLE_SM_SC (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SM_THEIR_KEY_DIST
|
||||
@@ -719,6 +883,7 @@
|
||||
#define MYNEWT_VAL_BLE_SVC_ANS_NEW_ALERT_CAT (0)
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT
|
||||
#define MYNEWT_VAL_BLE_SVC_ANS_UNR_ALERT_CAT (0)
|
||||
#endif
|
||||
@@ -731,8 +896,320 @@
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM
|
||||
#define MYNEWT_VAL_BLE_SVC_BAS_BATTERY_LEVEL_READ_PERM (0)
|
||||
#endif
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_ADV_TASK_PRIO
|
||||
#define MYNEWT_VAL_BLE_MESH_ADV_TASK_PRIO (9)
|
||||
#endif
|
||||
|
||||
/*** nimble/host/services/gap */
|
||||
|
||||
/*** @apache-mynewt-nimble/nimble/host/mesh */
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_ADV_BUF_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_ADV_BUF_COUNT (20)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_APP_KEY_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_APP_KEY_COUNT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_CFG_CLI
|
||||
#define MYNEWT_VAL_BLE_MESH_CFG_CLI (0)
|
||||
#endif
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_CRPL
|
||||
#define MYNEWT_VAL_BLE_MESH_CRPL (10)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_ACCESS
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_ACCESS (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_ADV
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_ADV (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_ACCESS
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_ACCESS (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_ADV
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_ADV (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_BEACON
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_BEACON (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_CRYPTO
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_CRYPTO (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_FRIEND
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_FRIEND (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_LOW_POWER
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_LOW_POWER (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_MODEL
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_MODEL (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_NET
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_NET (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_PROV
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_PROV (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_PROXY
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_PROXY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_SETTINGS
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_SETTINGS (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEBUG_TRANS
|
||||
#define MYNEWT_VAL_BLE_MESH_DEBUG_TRANS (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEVICE_NAME
|
||||
#define MYNEWT_VAL_BLE_MESH_DEVICE_NAME ("nimble-mesh-node")
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_DEV_UUID
|
||||
#define MYNEWT_VAL_BLE_MESH_DEV_UUID (((uint8_t[16]){0x11, 0x22, 0}))
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_LPN_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND_LPN_COUNT (2)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_QUEUE_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND_QUEUE_SIZE (16)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_RECV_WIN
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND_RECV_WIN (255)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_SEG_RX
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND_SEG_RX (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_FRIEND_SUB_LIST_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_FRIEND_SUB_LIST_SIZE (3)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_GATT_PROXY
|
||||
#define MYNEWT_VAL_BLE_MESH_GATT_PROXY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_HEALTH_CLI
|
||||
#define MYNEWT_VAL_BLE_MESH_HEALTH_CLI (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_IVU_DIVIDER
|
||||
#define MYNEWT_VAL_BLE_MESH_IVU_DIVIDER (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_IV_UPDATE_TEST
|
||||
#define MYNEWT_VAL_BLE_MESH_IV_UPDATE_TEST (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LABEL_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_LABEL_COUNT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LOW_POWER
|
||||
#define MYNEWT_VAL_BLE_MESH_LOW_POWER (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_AUTO
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_AUTO (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_AUTO_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_AUTO_TIMEOUT (15)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_ESTABLISHMENT
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_ESTABLISHMENT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_GROUPS
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_GROUPS (10)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_INIT_POLL_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_INIT_POLL_TIMEOUT (MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_MIN_QUEUE_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_MIN_QUEUE_SIZE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_POLL_TIMEOUT (300)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_RECV_DELAY
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_RECV_DELAY (100)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_RECV_WIN_FACTOR
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_RECV_WIN_FACTOR (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_RETRY_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_RETRY_TIMEOUT (8)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_RSSI_FACTOR
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_RSSI_FACTOR (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_LPN_SCAN_LATENCY
|
||||
#define MYNEWT_VAL_BLE_MESH_LPN_SCAN_LATENCY (10)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_MODEL_GROUP_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_MODEL_GROUP_COUNT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_MODEL_KEY_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_MODEL_KEY_COUNT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_MSG_CACHE_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_MSG_CACHE_SIZE (10)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_NODE_ID_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_NODE_ID_TIMEOUT (60)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_OOB_INPUT_ACTIONS
|
||||
#define MYNEWT_VAL_BLE_MESH_OOB_INPUT_ACTIONS (((BT_MESH_NO_INPUT)))
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_OOB_INPUT_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_OOB_INPUT_SIZE (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_OOB_OUTPUT_ACTIONS
|
||||
#define MYNEWT_VAL_BLE_MESH_OOB_OUTPUT_ACTIONS (((BT_MESH_DISPLAY_NUMBER)))
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_OOB_OUTPUT_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_OOB_OUTPUT_SIZE (4)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_PB_ADV
|
||||
#define MYNEWT_VAL_BLE_MESH_PB_ADV (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_PB_GATT
|
||||
#define MYNEWT_VAL_BLE_MESH_PB_GATT (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by @apache-mynewt-nimble/nimble/host/mesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_PROV
|
||||
#define MYNEWT_VAL_BLE_MESH_PROV (1)
|
||||
#endif
|
||||
|
||||
/* Overridden by @apache-mynewt-nimble/nimble/host/mesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_PROXY
|
||||
#define MYNEWT_VAL_BLE_MESH_PROXY (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_PROXY_FILTER_SIZE
|
||||
#define MYNEWT_VAL_BLE_MESH_PROXY_FILTER_SIZE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_RELAY
|
||||
#define MYNEWT_VAL_BLE_MESH_RELAY (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_RPL_STORE_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_RPL_STORE_TIMEOUT (5)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_RX_SDU_MAX
|
||||
#define MYNEWT_VAL_BLE_MESH_RX_SDU_MAX (72)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_RX_SEG_MSG_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_RX_SEG_MSG_COUNT (2)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_SEQ_STORE_RATE
|
||||
#define MYNEWT_VAL_BLE_MESH_SEQ_STORE_RATE (128)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_SETTINGS
|
||||
#define MYNEWT_VAL_BLE_MESH_SETTINGS (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_SHELL
|
||||
#define MYNEWT_VAL_BLE_MESH_SHELL (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_SHELL_MODELS
|
||||
#define MYNEWT_VAL_BLE_MESH_SHELL_MODELS (0)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_STORE_TIMEOUT
|
||||
#define MYNEWT_VAL_BLE_MESH_STORE_TIMEOUT (2)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_SUBNET_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_SUBNET_COUNT (1)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_TESTING
|
||||
#define MYNEWT_VAL_BLE_MESH_TESTING (0)
|
||||
#endif
|
||||
|
||||
/* Overridden by apps/blemesh (defined by @apache-mynewt-nimble/nimble/host/mesh) */
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_TX_SEG_MAX
|
||||
#define MYNEWT_VAL_BLE_MESH_TX_SEG_MAX (6)
|
||||
#endif
|
||||
|
||||
#ifndef MYNEWT_VAL_BLE_MESH_TX_SEG_MSG_COUNT
|
||||
#define MYNEWT_VAL_BLE_MESH_TX_SEG_MSG_COUNT (4)
|
||||
#endif
|
||||
|
||||
/*** @apache-mynewt-nimble/nimble/host/services/gap */
|
||||
#ifndef MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE
|
||||
#define MYNEWT_VAL_BLE_SVC_GAP_APPEARANCE (0)
|
||||
#endif
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
@@ -840,3 +840,4 @@ hal_timer_stop(struct hal_timer *timer)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "semphr.h"
|
||||
#include "task.h"
|
||||
#include "timers.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/queue.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/timers.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -272,23 +272,25 @@ ble_npl_time_delay(ble_npl_time_t ticks)
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
static inline void
|
||||
ble_npl_hw_set_isr(int irqn, void (*addr)(void))
|
||||
ble_npl_hw_set_isr(int irqn, uint32_t addr)
|
||||
{
|
||||
npl_freertos_hw_set_isr(irqn, addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
extern portMUX_TYPE ble_port_mutex;
|
||||
//critical section
|
||||
static inline uint32_t
|
||||
ble_npl_hw_enter_critical(void)
|
||||
{
|
||||
vPortEnterCritical();
|
||||
portENTER_CRITICAL(&ble_port_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
ble_npl_hw_exit_critical(uint32_t ctx)
|
||||
{
|
||||
vPortExitCritical();
|
||||
portEXIT_CRITICAL(&ble_port_mutex);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ ble_npl_error_t npl_freertos_time_ms_to_ticks(uint32_t ms,
|
||||
ble_npl_error_t npl_freertos_time_ticks_to_ms(ble_npl_time_t ticks,
|
||||
uint32_t *out_ms);
|
||||
|
||||
void npl_freertos_hw_set_isr(int irqn, void (*addr)(void));
|
||||
void npl_freertos_hw_set_isr(int irqn, uint32_t addr);
|
||||
|
||||
uint32_t npl_freertos_hw_enter_critical(void);
|
||||
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "nimble/nimble_port.h"
|
||||
|
||||
#if NIMBLE_CFG_CONTROLLER
|
||||
@@ -46,6 +46,6 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn)
|
||||
* have separate task for NimBLE host, but since something needs to handle
|
||||
* default queue it is just easier to make separate task which does this.
|
||||
*/
|
||||
xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 400,
|
||||
NULL, tskIDLE_PRIORITY + 1, &host_task_h);
|
||||
xTaskCreate(host_task_fn, "ble", 2048+400,
|
||||
NULL, (configMAX_PRIORITIES - 3), &host_task_h);
|
||||
}
|
||||
|
||||
@@ -21,12 +21,15 @@
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include "nimble/nimble_npl.h"
|
||||
#include "freertos/portable.h"
|
||||
|
||||
portMUX_TYPE ble_port_mutex = portMUX_INITIALIZER_UNLOCKED;
|
||||
|
||||
static inline bool
|
||||
in_isr(void)
|
||||
{
|
||||
/* XXX hw specific! */
|
||||
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
|
||||
return xPortInIsrContext() != 0;
|
||||
}
|
||||
|
||||
struct ble_npl_event *
|
||||
@@ -39,7 +42,9 @@ npl_freertos_eventq_get(struct ble_npl_eventq *evq, ble_npl_time_t tmo)
|
||||
if (in_isr()) {
|
||||
assert(tmo == 0);
|
||||
ret = xQueueReceiveFromISR(evq->q, &ev, &woken);
|
||||
portYIELD_FROM_ISR(woken);
|
||||
if( woken == pdTRUE ) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
ret = xQueueReceive(evq->q, &ev, tmo);
|
||||
}
|
||||
@@ -66,7 +71,9 @@ npl_freertos_eventq_put(struct ble_npl_eventq *evq, struct ble_npl_event *ev)
|
||||
|
||||
if (in_isr()) {
|
||||
ret = xQueueSendToBackFromISR(evq->q, &ev, &woken);
|
||||
portYIELD_FROM_ISR(woken);
|
||||
if( woken == pdTRUE ) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
ret = xQueueSendToBack(evq->q, &ev, portMAX_DELAY);
|
||||
}
|
||||
@@ -113,9 +120,12 @@ npl_freertos_eventq_remove(struct ble_npl_eventq *evq,
|
||||
woken |= woken2;
|
||||
}
|
||||
|
||||
portYIELD_FROM_ISR(woken);
|
||||
if( woken == pdTRUE ) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
vPortEnterCritical();
|
||||
portMUX_TYPE ble_npl_mut = portMUX_INITIALIZER_UNLOCKED;
|
||||
portENTER_CRITICAL(&ble_npl_mut);
|
||||
|
||||
count = uxQueueMessagesWaiting(evq->q);
|
||||
for (i = 0; i < count; i++) {
|
||||
@@ -130,7 +140,7 @@ npl_freertos_eventq_remove(struct ble_npl_eventq *evq,
|
||||
assert(ret == pdPASS);
|
||||
}
|
||||
|
||||
vPortExitCritical();
|
||||
portEXIT_CRITICAL(&ble_npl_mut);
|
||||
}
|
||||
|
||||
ev->queued = 0;
|
||||
@@ -218,7 +228,9 @@ npl_freertos_sem_pend(struct ble_npl_sem *sem, ble_npl_time_t timeout)
|
||||
if (in_isr()) {
|
||||
assert(timeout == 0);
|
||||
ret = xSemaphoreTakeFromISR(sem->handle, &woken);
|
||||
portYIELD_FROM_ISR(woken);
|
||||
if( woken == pdTRUE ) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
ret = xSemaphoreTake(sem->handle, timeout);
|
||||
}
|
||||
@@ -240,7 +252,10 @@ npl_freertos_sem_release(struct ble_npl_sem *sem)
|
||||
|
||||
if (in_isr()) {
|
||||
ret = xSemaphoreGiveFromISR(sem->handle, &woken);
|
||||
portYIELD_FROM_ISR(woken);
|
||||
|
||||
if( woken == pdTRUE ) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
ret = xSemaphoreGive(sem->handle);
|
||||
}
|
||||
@@ -292,7 +307,9 @@ npl_freertos_callout_reset(struct ble_npl_callout *co, ble_npl_time_t ticks)
|
||||
xTimerChangePeriodFromISR(co->handle, ticks, &woken2);
|
||||
xTimerResetFromISR(co->handle, &woken3);
|
||||
|
||||
portYIELD_FROM_ISR(woken1 || woken2 || woken3);
|
||||
if( woken1 == pdTRUE || woken2 == pdTRUE || woken3 == pdTRUE) {
|
||||
portYIELD_FROM_ISR();
|
||||
}
|
||||
} else {
|
||||
xTimerStop(co->handle, portMAX_DELAY);
|
||||
xTimerChangePeriod(co->handle, ticks, portMAX_DELAY);
|
||||
|
||||
Reference in New Issue
Block a user