Skip to content

Commit 8431d52

Browse files
committed
Override mempool management and event queue init for newer esp's
Newer esp32 devices initialize mem pools and queues in the controller code but does not work with the NimBLE host as it does not create any memory buffers. This overrides the memorry allocation and queue creation to allow the NimBLE host to work with the Arduino controller.
1 parent bae9a64 commit 8431d52

File tree

3 files changed

+198
-0
lines changed

3 files changed

+198
-0
lines changed

src/nimble/porting/nimble/src/nimble_port.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ esp_err_t esp_nimble_init(void)
126126
#elif CONFIG_BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT
127127
hci_transport_deinit();
128128
na_hci_transport_init(HCI_TRANSPORT_VHCI);
129+
int na_npl_freertos_mempool_init(void);
130+
na_npl_freertos_mempool_init();
131+
ble_npl_eventq_init(&g_eventq_dflt);
129132
#endif
130133

131134
ble_transport_ll_init();

src/nimble/porting/npl/freertos/include/nimble/nimble_npl_os.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,12 @@ ble_npl_get_current_task_id(void)
162162
static inline void
163163
ble_npl_eventq_init(struct ble_npl_eventq *evq)
164164
{
165+
#if CONFIG_BT_LE_CONTROLLER_NPL_OS_PORTING_SUPPORT
166+
void na_npl_freertos_eventq_init(struct ble_npl_eventq *evq);
167+
na_npl_freertos_eventq_init(evq);
168+
#else
165169
return npl_funcs->p_ble_npl_eventq_init(evq);
170+
#endif
166171
}
167172

168173
static inline void

src/nimble/porting/npl/freertos/src/npl_os_freertos.c

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,4 +1409,194 @@ void npl_freertos_funcs_deinit(void)
14091409
npl_funcs = NULL;
14101410
}
14111411

1412+
#else
1413+
1414+
#include <assert.h>
1415+
#include <stddef.h>
1416+
#include <string.h>
1417+
#include <stdlib.h>
1418+
1419+
#include "nimble/esp_port/port/include/bt_osi_mem.h"
1420+
#include "nimble/porting/nimble/include/os/os_mempool.h"
1421+
#include "freertos/FreeRTOS.h"
1422+
#include "nimble/porting/nimble/include/os/queue.h"
1423+
#include "freertos/semphr.h"
1424+
#include "freertos/task.h"
1425+
#include "freertos/timers.h"
1426+
#include "freertos/portable.h"
1427+
#include "nimble/porting/npl/freertos/include/nimble/npl_freertos.h"
1428+
1429+
extern struct os_mempool ble_freertos_ev_pool;
1430+
static os_membuf_t *ble_freertos_ev_buf = NULL;
1431+
1432+
extern struct os_mempool ble_freertos_evq_pool;
1433+
static os_membuf_t *ble_freertos_evq_buf = NULL;
1434+
1435+
extern struct os_mempool ble_freertos_co_pool;
1436+
static os_membuf_t *ble_freertos_co_buf = NULL;
1437+
1438+
extern struct os_mempool ble_freertos_sem_pool;
1439+
static os_membuf_t *ble_freertos_sem_buf = NULL;
1440+
1441+
extern struct os_mempool ble_freertos_mutex_pool;
1442+
static os_membuf_t *ble_freertos_mutex_buf = NULL;
1443+
1444+
static uint16_t ble_freertos_total_event_cnt = 0;
1445+
1446+
int na_npl_freertos_mempool_init(void)
1447+
{
1448+
int rc = -1;
1449+
// These values taken from esp-idf: bt/nimble/porting/npl/freertos/src/npl_os_freertos.c
1450+
uint16_t ble_total_evt_count = 19;
1451+
uint16_t ble_total_co_count = 8;
1452+
uint16_t ble_total_evtq_count = 3;
1453+
uint16_t ble_total_sem_count = 10;
1454+
uint16_t ble_total_mutex_count = 4;
1455+
ble_freertos_total_event_cnt = ble_total_evt_count;
1456+
1457+
if (ble_total_evt_count) {
1458+
ble_freertos_ev_buf = bt_osi_mem_malloc_internal(OS_MEMPOOL_SIZE(ble_total_evt_count,
1459+
sizeof (struct ble_npl_event_freertos)) *
1460+
sizeof(os_membuf_t));
1461+
if (!ble_freertos_ev_buf) {
1462+
goto _error;
1463+
}
1464+
rc = os_mempool_init(&ble_freertos_ev_pool, ble_total_evt_count,
1465+
sizeof (struct ble_npl_event_freertos), ble_freertos_ev_buf,
1466+
"ble_freertos_ev_pool");
1467+
if (rc) {
1468+
goto _error;
1469+
}
1470+
}
1471+
1472+
if (ble_total_evtq_count) {
1473+
ble_freertos_evq_buf = bt_osi_mem_malloc_internal(OS_MEMPOOL_SIZE(ble_total_evtq_count,
1474+
sizeof (struct ble_npl_eventq_freertos)) *
1475+
sizeof(os_membuf_t));
1476+
if (!ble_freertos_evq_buf) {
1477+
goto _error;
1478+
}
1479+
rc = os_mempool_init(&ble_freertos_evq_pool, ble_total_evtq_count,
1480+
sizeof (struct ble_npl_eventq_freertos), ble_freertos_evq_buf,
1481+
"ble_freertos_evq_pool");
1482+
if (rc) {
1483+
goto _error;
1484+
}
1485+
}
1486+
1487+
if (ble_total_co_count) {
1488+
ble_freertos_co_buf = bt_osi_mem_malloc_internal(OS_MEMPOOL_SIZE(ble_total_co_count,
1489+
sizeof (struct ble_npl_callout_freertos)) *
1490+
sizeof(os_membuf_t));
1491+
if (!ble_freertos_co_buf) {
1492+
goto _error;
1493+
}
1494+
rc = os_mempool_init(&ble_freertos_co_pool, ble_total_co_count,
1495+
sizeof (struct ble_npl_callout_freertos), ble_freertos_co_buf,
1496+
"ble_freertos_co_pool");
1497+
if (rc) {
1498+
goto _error;
1499+
}
1500+
}
1501+
1502+
if (ble_total_sem_count) {
1503+
ble_freertos_sem_buf = bt_osi_mem_malloc_internal(OS_MEMPOOL_SIZE(ble_total_sem_count,
1504+
sizeof (struct ble_npl_sem_freertos)) *
1505+
sizeof(os_membuf_t));
1506+
if (!ble_freertos_sem_buf) {
1507+
goto _error;
1508+
}
1509+
rc = os_mempool_init(&ble_freertos_sem_pool, ble_total_sem_count,
1510+
sizeof (struct ble_npl_sem_freertos), ble_freertos_sem_buf,
1511+
"ble_freertos_sem_pool");
1512+
if (rc) {
1513+
goto _error;
1514+
}
1515+
}
1516+
1517+
if (ble_total_mutex_count) {
1518+
ble_freertos_mutex_buf = bt_osi_mem_malloc_internal(OS_MEMPOOL_SIZE(ble_total_mutex_count,
1519+
sizeof (struct ble_npl_mutex_freertos)) *
1520+
sizeof(os_membuf_t));
1521+
if (!ble_freertos_mutex_buf) {
1522+
goto _error;
1523+
}
1524+
rc = os_mempool_init(&ble_freertos_mutex_pool, ble_total_mutex_count,
1525+
sizeof (struct ble_npl_mutex_freertos), ble_freertos_mutex_buf,
1526+
"ble_freertos_mutex_pool");
1527+
if (rc) {
1528+
goto _error;
1529+
}
1530+
}
1531+
1532+
return 0;
1533+
_error:
1534+
if (ble_freertos_ev_buf) {
1535+
bt_osi_mem_free(ble_freertos_ev_buf);
1536+
ble_freertos_ev_buf = NULL;
1537+
}
1538+
1539+
if (ble_freertos_evq_buf) {
1540+
bt_osi_mem_free(ble_freertos_evq_buf);
1541+
ble_freertos_evq_buf = NULL;
1542+
}
1543+
1544+
if (ble_freertos_co_buf) {
1545+
bt_osi_mem_free(ble_freertos_co_buf);
1546+
ble_freertos_co_buf = NULL;
1547+
}
1548+
1549+
if (ble_freertos_sem_buf) {
1550+
bt_osi_mem_free(ble_freertos_sem_buf);
1551+
ble_freertos_sem_buf = NULL;
1552+
}
1553+
1554+
if (ble_freertos_mutex_buf) {
1555+
bt_osi_mem_free(ble_freertos_mutex_buf);
1556+
ble_freertos_mutex_buf = NULL;
1557+
}
1558+
return -1;
1559+
}
1560+
1561+
void na_npl_freertos_mempool_deinit(void)
1562+
{
1563+
if (ble_freertos_ev_buf) {
1564+
bt_osi_mem_free(ble_freertos_ev_buf);
1565+
ble_freertos_ev_buf = NULL;
1566+
}
1567+
if (ble_freertos_evq_buf) {
1568+
bt_osi_mem_free(ble_freertos_evq_buf);
1569+
ble_freertos_evq_buf = NULL;
1570+
}
1571+
if (ble_freertos_co_buf) {
1572+
bt_osi_mem_free(ble_freertos_co_buf);
1573+
ble_freertos_co_buf = NULL;
1574+
}
1575+
if (ble_freertos_sem_buf) {
1576+
bt_osi_mem_free(ble_freertos_sem_buf);
1577+
ble_freertos_sem_buf = NULL;
1578+
}
1579+
if (ble_freertos_mutex_buf) {
1580+
bt_osi_mem_free(ble_freertos_mutex_buf);
1581+
ble_freertos_mutex_buf = NULL;
1582+
}
1583+
}
1584+
1585+
void
1586+
na_npl_freertos_eventq_init(struct ble_npl_eventq *evq)
1587+
{
1588+
struct ble_npl_eventq_freertos *eventq = NULL;
1589+
if (!os_memblock_from(&ble_freertos_evq_pool,evq->eventq)) {
1590+
evq->eventq = os_memblock_get(&ble_freertos_evq_pool);
1591+
eventq = (struct ble_npl_eventq_freertos*)evq->eventq;
1592+
BLE_LL_ASSERT(eventq);
1593+
memset(eventq, 0, sizeof(*eventq));
1594+
eventq->q = xQueueCreate(ble_freertos_total_event_cnt, sizeof(struct ble_npl_eventq *));
1595+
BLE_LL_ASSERT(eventq->q);
1596+
} else {
1597+
eventq = (struct ble_npl_eventq_freertos*)evq->eventq;
1598+
xQueueReset(eventq->q);
1599+
}
1600+
}
1601+
14121602
#endif

0 commit comments

Comments
 (0)