You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/03/17 10:50:21 UTC

[mynewt-nimble] 11/22: nimble/transport: Update emspi transport

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 1311466f04ec51b675ed23feda5abd05161c086a
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Mar 10 14:42:57 2022 +0100

    nimble/transport: Update emspi transport
---
 nimble/transport/emspi/src/ble_hci_emspi.c | 317 +++--------------------------
 nimble/transport/emspi/syscfg.yml          |  10 -
 nimble/transport/pkg.yml                   |   2 +
 nimble/transport/syscfg.yml                |   1 +
 4 files changed, 32 insertions(+), 298 deletions(-)

diff --git a/nimble/transport/emspi/src/ble_hci_emspi.c b/nimble/transport/emspi/src/ble_hci_emspi.c
index 61fe96b..e49d3d4 100644
--- a/nimble/transport/emspi/src/ble_hci_emspi.c
+++ b/nimble/transport/emspi/src/ble_hci_emspi.c
@@ -35,23 +35,12 @@
 #include "nimble/ble.h"
 #include "nimble/nimble_opt.h"
 #include "nimble/hci_common.h"
-#include "nimble/ble_hci_trans.h"
+#include "nimble/transport.h"
 
 #include "transport/emspi/ble_hci_emspi.h"
 
 #include "am_mcu_apollo.h"
 
-/***
- * NOTES:
- * The emspi HCI transport doesn't use event buffer priorities.  All incoming
- * and outgoing events use buffers from the same pool.
- *
- */
-
-#define BLE_HCI_EMSPI_PKT_EVT_COUNT         \
-    (MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT) + \
-     MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT))
-
 #define BLE_HCI_EMSPI_PKT_NONE          0x00
 #define BLE_HCI_EMSPI_PKT_CMD           0x01
 #define BLE_HCI_EMSPI_PKT_ACL           0x02
@@ -71,46 +60,6 @@ static struct os_eventq ble_hci_emspi_evq;
 static struct os_task ble_hci_emspi_task;
 static os_stack_t ble_hci_emspi_stack[MYNEWT_VAL(BLE_HCI_EMSPI_STACK_SIZE)];
 
-static ble_hci_trans_rx_cmd_fn *ble_hci_emspi_rx_cmd_cb;
-static void *ble_hci_emspi_rx_cmd_arg;
-
-static ble_hci_trans_rx_acl_fn *ble_hci_emspi_rx_acl_cb;
-static void *ble_hci_emspi_rx_acl_arg;
-
-static struct os_mempool ble_hci_emspi_evt_hi_pool;
-static os_membuf_t ble_hci_emspi_evt_hi_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                        MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-static struct os_mempool ble_hci_emspi_evt_lo_pool;
-static os_membuf_t ble_hci_emspi_evt_lo_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                        MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE))
-];
-
-static struct os_mempool ble_hci_emspi_cmd_pool;
-static os_membuf_t ble_hci_emspi_cmd_buf[
-        OS_MEMPOOL_SIZE(1, BLE_HCI_TRANS_CMD_SZ)
-];
-
-static struct os_mbuf_pool ble_hci_emspi_acl_mbuf_pool;
-static struct os_mempool_ext ble_hci_emspi_acl_pool;
-
-/*
- * The MBUF payload size must accommodate the HCI data header size plus the
- * maximum ACL data packet length. The ACL block size is the size of the
- * mbufs we will allocate.
- */
-#define ACL_BLOCK_SIZE  OS_ALIGN(MYNEWT_VAL(BLE_ACL_BUF_SIZE) \
-                                 + BLE_MBUF_MEMBLOCK_OVERHEAD \
-                                 + BLE_HCI_DATA_HDR_SZ, OS_ALIGNMENT)
-
-static os_membuf_t ble_hci_emspi_acl_buf[
-        OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                        ACL_BLOCK_SIZE)
-];
-
 /**
  * A packet to be sent over the EMSPI.  This can be a command, an event, or ACL
  * data.
@@ -124,8 +73,7 @@ STAILQ_HEAD(, ble_hci_emspi_pkt) ble_hci_emspi_tx_q;
 
 static struct os_mempool ble_hci_emspi_pkt_pool;
 static os_membuf_t ble_hci_emspi_pkt_buf[
-        OS_MEMPOOL_SIZE(BLE_HCI_EMSPI_PKT_EVT_COUNT + 1 +
-                        MYNEWT_VAL(BLE_HCI_ACL_OUT_COUNT),
+        OS_MEMPOOL_SIZE(1 + MYNEWT_VAL(BLE_TRANSPORT_ACL_FROM_HS_COUNT),
                         sizeof (struct ble_hci_emspi_pkt))
 ];
 
@@ -287,18 +235,6 @@ done:
 }
 
 /**
- * Allocates a buffer (mbuf) for ACL operation.
- *
- * @return                      The allocated buffer on success;
- *                              NULL on buffer exhaustion.
- */
-static struct os_mbuf *
-ble_hci_trans_acl_buf_alloc(void)
-{
-    return os_mbuf_get_pkthdr(&ble_hci_emspi_acl_mbuf_pool, 0);
-}
-
-/**
  * Transmits an ACL data packet to the controller.  The caller relinquishes the
  * specified mbuf, regardless of return status.
  */
@@ -344,7 +280,7 @@ ble_hci_emspi_cmdevt_tx(uint8_t *cmd_buf, uint8_t pkt_type)
 
     pkt = os_memblock_get(&ble_hci_emspi_pkt_pool);
     if (pkt == NULL) {
-        ble_hci_trans_buf_free(cmd_buf);
+        ble_transport_free(cmd_buf);
         return BLE_ERR_MEM_CAPACITY;
     }
 
@@ -449,7 +385,7 @@ ble_hci_emspi_tx_pkt(void)
     switch (pkt->type) {
     case BLE_HCI_EMSPI_PKT_CMD:
         rc = ble_hci_emspi_tx_cmd(pkt->data);
-        ble_hci_trans_buf_free(pkt->data);
+        ble_transport_free(pkt->data);
         break;
 
     case BLE_HCI_EMSPI_PKT_ACL:
@@ -477,7 +413,7 @@ ble_hci_emspi_rx_evt(void)
     /* XXX: we should not assert if host cannot allocate an event. Need
      * to determine what to do here.
      */
-    data = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_HI);
+    data = ble_transport_alloc_evt(0);
     assert(data != NULL);
 
     rc = ble_hci_emspi_rx(data, sizeof(struct ble_hci_ev));
@@ -493,8 +429,7 @@ ble_hci_emspi_rx_evt(void)
         }
     }
 
-    assert(ble_hci_emspi_rx_cmd_cb != NULL);
-    ble_hci_emspi_rx_cmd_cb(data, ble_hci_emspi_rx_cmd_arg);
+    rc = ble_transport_to_hs_evt(data);
     if (rc != 0) {
         goto err;
     }
@@ -502,7 +437,7 @@ ble_hci_emspi_rx_evt(void)
     return 0;
 
 err:
-    ble_hci_trans_buf_free(data);
+    ble_transport_free(data);
     return rc;
 }
 
@@ -516,7 +451,7 @@ ble_hci_emspi_rx_acl(void)
     /* XXX: we should not assert if host cannot allocate an mbuf. Need to
      * determine what to do here.
      */
-    om = ble_hci_trans_acl_buf_alloc();
+    om = ble_transport_alloc_acl_from_ll();
     assert(om != NULL);
 
     rc = ble_hci_emspi_rx(om->om_data, BLE_HCI_DATA_HDR_SZ);
@@ -525,7 +460,7 @@ ble_hci_emspi_rx_acl(void)
     }
 
     len = get_le16(om->om_data + 2);
-    if (len > MYNEWT_VAL(BLE_ACL_BUF_SIZE)) {
+    if (len > MYNEWT_VAL(BLE_TRANSPORT_ACL_SIZE)) {
         /*
          * Data portion cannot exceed data length of acl buffer. If it does
          * this is considered to be a loss of sync.
@@ -544,8 +479,7 @@ ble_hci_emspi_rx_acl(void)
     OS_MBUF_PKTLEN(om) = BLE_HCI_DATA_HDR_SZ + len;
     om->om_len = BLE_HCI_DATA_HDR_SZ + len;
 
-    assert(ble_hci_emspi_rx_cmd_cb != NULL);
-    rc = ble_hci_emspi_rx_acl_cb(om, ble_hci_emspi_rx_acl_arg);
+    rc = ble_transport_to_hs_acl(om);
     if (rc != 0) {
         goto err;
     }
@@ -587,18 +521,6 @@ ble_hci_emspi_rx_pkt(void)
 }
 
 static void
-ble_hci_emspi_set_rx_cbs(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                        void *cmd_arg,
-                        ble_hci_trans_rx_acl_fn *acl_cb,
-                        void *acl_arg)
-{
-    ble_hci_emspi_rx_cmd_cb = cmd_cb;
-    ble_hci_emspi_rx_cmd_arg = cmd_arg;
-    ble_hci_emspi_rx_acl_cb = acl_cb;
-    ble_hci_emspi_rx_acl_arg = acl_arg;
-}
-
-static void
 ble_hci_emspi_free_pkt(uint8_t type, uint8_t *cmdevt, struct os_mbuf *acl)
 {
     switch (type) {
@@ -607,7 +529,7 @@ ble_hci_emspi_free_pkt(uint8_t type, uint8_t *cmdevt, struct os_mbuf *acl)
 
     case BLE_HCI_EMSPI_PKT_CMD:
     case BLE_HCI_EMSPI_PKT_EVT:
-        ble_hci_trans_buf_free(cmdevt);
+        ble_transport_free(cmdevt);
         break;
 
     case BLE_HCI_EMSPI_PKT_ACL:
@@ -621,24 +543,6 @@ ble_hci_emspi_free_pkt(uint8_t type, uint8_t *cmdevt, struct os_mbuf *acl)
 }
 
 /**
- * Unsupported.  This is a host-only transport.
- */
-int
-ble_hci_trans_ll_evt_tx(uint8_t *cmd)
-{
-    return BLE_ERR_UNSUPPORTED;
-}
-
-/**
- * Unsupported.  This is a host-only transport.
- */
-int
-ble_hci_trans_ll_acl_tx(struct os_mbuf *om)
-{
-    return BLE_ERR_UNSUPPORTED;
-}
-
-/**
  * Sends an HCI command from the host to the controller.
  *
  * @param cmd                   The HCI command to send.  This buffer must be
@@ -674,134 +578,6 @@ ble_hci_trans_hs_acl_tx(struct os_mbuf *om)
 }
 
 /**
- * Configures the HCI transport to call the specified callback upon receiving
- * HCI packets from the controller.  This function should only be called by by
- * host.
- *
- * @param cmd_cb                The callback to execute upon receiving an HCI
- *                                  event.
- * @param cmd_arg               Optional argument to pass to the command
- *                                  callback.
- * @param acl_cb                The callback to execute upon receiving ACL
- *                                  data.
- * @param acl_arg               Optional argument to pass to the ACL
- *                                  callback.
- */
-void
-ble_hci_trans_cfg_hs(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                     void *cmd_arg,
-                     ble_hci_trans_rx_acl_fn *acl_cb,
-                     void *acl_arg)
-{
-    ble_hci_emspi_set_rx_cbs(cmd_cb, cmd_arg, acl_cb, acl_arg);
-}
-
-/**
- * Configures the HCI transport to operate with a host.  The transport will
- * execute specified callbacks upon receiving HCI packets from the controller.
- *
- * @param cmd_cb                The callback to execute upon receiving an HCI
- *                                  event.
- * @param cmd_arg               Optional argument to pass to the command
- *                                  callback.
- * @param acl_cb                The callback to execute upon receiving ACL
- *                                  data.
- * @param acl_arg               Optional argument to pass to the ACL
- *                                  callback.
- */
-void
-ble_hci_trans_cfg_ll(ble_hci_trans_rx_cmd_fn *cmd_cb,
-                     void *cmd_arg,
-                     ble_hci_trans_rx_acl_fn *acl_cb,
-                     void *acl_arg)
-{
-    /* Unsupported. */
-    assert(0);
-}
-
-/**
- * Allocates a flat buffer of the specified type.
- *
- * @param type                  The type of buffer to allocate; one of the
- *                                  BLE_HCI_TRANS_BUF_[...] constants.
- *
- * @return                      The allocated buffer on success;
- *                              NULL on buffer exhaustion.
- */
-uint8_t *
-ble_hci_trans_buf_alloc(int type)
-{
-    uint8_t *buf;
-
-    switch (type) {
-    case BLE_HCI_TRANS_BUF_CMD:
-        buf = os_memblock_get(&ble_hci_emspi_cmd_pool);
-        break;
-    case BLE_HCI_TRANS_BUF_EVT_HI:
-        buf = os_memblock_get(&ble_hci_emspi_evt_hi_pool);
-        if (buf == NULL) {
-            /* If no high-priority event buffers remain, try to grab a
-             * low-priority one.
-             */
-            buf = os_memblock_get(&ble_hci_emspi_evt_lo_pool);
-        }
-        break;
-
-    case BLE_HCI_TRANS_BUF_EVT_LO:
-        buf = os_memblock_get(&ble_hci_emspi_evt_lo_pool);
-        break;
-
-    default:
-        assert(0);
-        buf = NULL;
-    }
-
-    return buf;
-}
-
-/**
- * Frees the specified flat buffer.  The buffer must have been allocated via
- * ble_hci_trans_buf_alloc().
- *
- * @param buf                   The buffer to free.
- */
-void
-ble_hci_trans_buf_free(uint8_t *buf)
-{
-    int rc;
-
-    if (buf != NULL) {
-        if (os_memblock_from(&ble_hci_emspi_evt_hi_pool, buf)) {
-            rc = os_memblock_put(&ble_hci_emspi_evt_hi_pool, buf);
-            assert(rc == 0);
-        } else if (os_memblock_from(&ble_hci_emspi_evt_lo_pool, buf)) {
-            rc = os_memblock_put(&ble_hci_emspi_evt_lo_pool, buf);
-            assert(rc == 0);
-        } else {
-            assert(os_memblock_from(&ble_hci_emspi_cmd_pool, buf));
-            rc = os_memblock_put(&ble_hci_emspi_cmd_pool, buf);
-            assert(rc == 0);
-        }
-    }
-}
-
-/**
- * Configures a callback to get executed whenever an ACL data packet is freed.
- * The function is called in lieu of actually freeing the packet.
- *
- * @param cb                    The callback to configure.
- *
- * @return                      0 on success.
- */
-int
-ble_hci_trans_set_acl_free_cb(os_mempool_put_fn *cb, void *arg)
-{
-    ble_hci_emspi_acl_pool.mpe_put_cb = cb;
-    ble_hci_emspi_acl_pool.mpe_put_arg = arg;
-    return 0;
-}
-
-/**
  * Resets the HCI UART transport to a clean state.  Frees all buffers and
  * reconfigures the UART.
  *
@@ -875,69 +651,22 @@ ble_hci_emspi_init_hw(void)
     hal_gpio_write(MYNEWT_VAL(BLE_HCI_EMSPI_RESET_PIN), 1);
 }
 
-/**
- * Initializes the UART HCI transport module.
- *
- * @return                      0 on success;
- *                              A BLE_ERR_[...] error code on failure.
- */
 void
-ble_hci_emspi_init(void)
+ble_transport_ll_init(void)
 {
     int rc;
 
     /* Ensure this function only gets called by sysinit. */
     SYSINIT_ASSERT_ACTIVE();
 
-    rc = os_mempool_ext_init(&ble_hci_emspi_acl_pool,
-                             MYNEWT_VAL(BLE_ACL_BUF_COUNT),
-                             ACL_BLOCK_SIZE,
-                             ble_hci_emspi_acl_buf,
-                             "ble_hci_emspi_acl_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mbuf_pool_init(&ble_hci_emspi_acl_mbuf_pool,
-                           &ble_hci_emspi_acl_pool.mpe_mp,
-                           ACL_BLOCK_SIZE,
-                           MYNEWT_VAL(BLE_ACL_BUF_COUNT));
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    /*
-     * Create memory pool of HCI command buffers. NOTE: we currently dont
-     * allow this to be configured. The controller will only allow one
-     * outstanding command. We decided to keep this a pool in case we allow
-     * allow the controller to handle more than one outstanding command.
-     */
-    rc = os_mempool_init(&ble_hci_emspi_cmd_pool,
-                         1,
-                         BLE_HCI_TRANS_CMD_SZ,
-                         ble_hci_emspi_cmd_buf,
-                         "ble_hci_emspi_cmd_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_emspi_evt_hi_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         ble_hci_emspi_evt_hi_buf,
-                         "ble_hci_emspi_evt_hi_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
-    rc = os_mempool_init(&ble_hci_emspi_evt_lo_pool,
-                         MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT),
-                         MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE),
-                         ble_hci_emspi_evt_lo_buf,
-                         "ble_hci_emspi_evt_lo_pool");
-    SYSINIT_PANIC_ASSERT(rc == 0);
-
     /*
      * Create memory pool of packet list nodes. NOTE: the number of these
-     * buffers should be, at least, the total number of event buffers (hi
-     * and lo), the number of command buffers (currently 1) and the total
-     * number of buffers that the controller could possibly hand to the host.
+     * buffers should be, at least, the number of command buffers (currently 1)
+     * and the total number of buffers that the controller could possibly hand
+     * to the host.
      */
-    rc = os_mempool_init(&ble_hci_emspi_pkt_pool,
-                         BLE_HCI_EMSPI_PKT_EVT_COUNT + 1 +
-                         MYNEWT_VAL(BLE_HCI_ACL_OUT_COUNT),
+    rc = os_mempool_init(&ble_hci_emspi_pkt_pool, 1 +
+                         MYNEWT_VAL(BLE_TRANSPORT_ACL_FROM_HS_COUNT),
                          sizeof (struct ble_hci_emspi_pkt),
                          ble_hci_emspi_pkt_buf,
                          "ble_hci_emspi_pkt_pool");
@@ -955,3 +684,15 @@ ble_hci_emspi_init(void)
                       MYNEWT_VAL(BLE_HCI_EMSPI_STACK_SIZE));
     SYSINIT_PANIC_ASSERT(rc == 0);
 }
+
+int
+ble_transport_to_ll_cmd(void *buf)
+{
+    return ble_hci_emspi_cmdevt_tx(buf, BLE_HCI_EMSPI_PKT_CMD);
+}
+
+int
+ble_transport_to_ll_acl(struct os_mbuf *om)
+{
+    return ble_hci_emspi_acl_tx(om);
+}
\ No newline at end of file
diff --git a/nimble/transport/emspi/syscfg.yml b/nimble/transport/emspi/syscfg.yml
index 5011754..05e6e14 100644
--- a/nimble/transport/emspi/syscfg.yml
+++ b/nimble/transport/emspi/syscfg.yml
@@ -72,13 +72,3 @@ syscfg.defs:
         description: >
             Sysinit stage for the EMSPI BLE transport.
         value: 100
-
-syscfg.vals.'!BLE_HCI_BRIDGE && BLE_EXT_ADV':
-    BLE_HCI_EVT_BUF_SIZE: 257
-
-syscfg.vals.'!BLE_HCI_BRIDGE && !BLE_EXT_ADV':
-    BLE_HCI_EVT_HI_BUF_COUNT: 2
-    BLE_HCI_EVT_LO_BUF_COUNT: 8
-    BLE_HCI_EVT_BUF_SIZE: 70
-    BLE_ACL_BUF_COUNT: 4
-    BLE_ACL_BUF_SIZE: 255
diff --git a/nimble/transport/pkg.yml b/nimble/transport/pkg.yml
index e5dad56..bedcb16 100644
--- a/nimble/transport/pkg.yml
+++ b/nimble/transport/pkg.yml
@@ -32,6 +32,8 @@ pkg.deps.'BLE_TRANSPORT_HS == "native"':
     - nimble/host
 pkg.deps.'BLE_TRANSPORT_LL == "native"':
     - nimble/controller
+pkg.deps.'BLE_TRANSPORT_LL == "emspi"':
+    - nimble/transport/emspi
 pkg.deps.'BLE_TRANSPORT_HS == "dialog_cmac" || BLE_TRANSPORT_LL == "dialog_cmac"':
     - nimble/transport/dialog_cmac
 pkg.deps.'BLE_TRANSPORT_HS == "nrf5340" || BLE_TRANSPORT_LL == "nrf5340"':
diff --git a/nimble/transport/syscfg.yml b/nimble/transport/syscfg.yml
index cb9e07e..5f61a01 100644
--- a/nimble/transport/syscfg.yml
+++ b/nimble/transport/syscfg.yml
@@ -40,6 +40,7 @@ syscfg.defs:
         value: native
         choices:
             - native
+            - emspi
             - dialog_cmac
             - nrf5340
             - socket