@@ -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