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 10958b3ec9ba6feeea5a68cc1dac282eac446ddd Author: Andrzej Kaczmarek <[email protected]> AuthorDate: Thu Mar 3 18:06:15 2022 +0100 nimble/transport: Update USB transport --- nimble/transport/nrf5340/syscfg.yml | 38 ------ nimble/transport/usb/pkg.yml | 3 - nimble/transport/usb/src/ble_hci_usb.c | 218 ++++++--------------------------- nimble/transport/usb/syscfg.yml | 18 --- 4 files changed, 35 insertions(+), 242 deletions(-) diff --git a/nimble/transport/nrf5340/syscfg.yml b/nimble/transport/nrf5340/syscfg.yml deleted file mode 100644 index a12e0c3..0000000 --- a/nimble/transport/nrf5340/syscfg.yml +++ /dev/null @@ -1,38 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -syscfg.defs: - BLE_TRANS_NRF5340_SYSINIT_STAGE: - description: > - Sysinit stage for the RAM BLE transport. - value: 100 - -syscfg.vals.'!BLE_HCI_BRIDGE: - BLE_HCI_EVT_HI_BUF_COUNT: 2 - BLE_HCI_EVT_LO_BUF_COUNT: 8 - BLE_ACL_BUF_COUNT: 4 - BLE_ACL_BUF_SIZE: 255 - -syscfg.vals.'!BLE_HCI_BRIDGE && !BLE_EXT_ADV': - BLE_HCI_EVT_BUF_SIZE: 70 - -syscfg.vals.'!BLE_HCI_BRIDGE && BLE_EXT_ADV': - BLE_HCI_EVT_BUF_SIZE: 257 - -syscfg.restrictions: - - '!(BLE_HOST && BLE_CONTROLLER)' diff --git a/nimble/transport/usb/pkg.yml b/nimble/transport/usb/pkg.yml index c4c314c..199afe6 100644 --- a/nimble/transport/usb/pkg.yml +++ b/nimble/transport/usb/pkg.yml @@ -35,6 +35,3 @@ pkg.deps: pkg.apis: - ble_transport - -pkg.init: - ble_hci_usb_init: 'MYNEWT_VAL(BLE_TRANS_USB_SYSINIT_STAGE)' diff --git a/nimble/transport/usb/src/ble_hci_usb.c b/nimble/transport/usb/src/ble_hci_usb.c index 8160536..6518cd9 100644 --- a/nimble/transport/usb/src/ble_hci_usb.c +++ b/nimble/transport/usb/src/ble_hci_usb.c @@ -25,78 +25,20 @@ #include "mem/mem.h" #include "nimble/ble.h" -#include "nimble/ble_hci_trans.h" #include "nimble/hci_common.h" +#include "nimble/transport.h" #include <class/bth/bth_device.h> -/* - * 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) - -struct usb_ble_hci_pool_cmd { - uint8_t cmd[BLE_HCI_TRANS_CMD_SZ]; - bool allocated; -}; - -/* (Pseudo)pool for HCI commands */ -static struct usb_ble_hci_pool_cmd usb_ble_hci_pool_cmd; - -static ble_hci_trans_rx_cmd_fn *ble_hci_usb_rx_cmd_ll_cb; -static void *ble_hci_usb_rx_cmd_ll_arg; - -static ble_hci_trans_rx_acl_fn *ble_hci_usb_rx_acl_ll_cb; -static void *ble_hci_usb_rx_acl_ll_arg; - -static struct os_mempool ble_hci_usb_evt_hi_pool; -static os_membuf_t ble_hci_usb_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_usb_evt_lo_pool; -static os_membuf_t ble_hci_usb_evt_lo_buf[ - OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE)) -]; - -static uint8_t ble_hci_pool_acl_mempool_buf[ - OS_MEMPOOL_BYTES(MYNEWT_VAL(BLE_ACL_BUF_COUNT), - ACL_BLOCK_SIZE)]; -static struct os_mempool ble_hci_pool_acl_mempool; -static struct os_mbuf_pool ble_hci_pool_acl_mbuf_pool; - static struct os_mbuf *incoming_acl_data; -static struct os_mbuf * -ble_hci_trans_acl_buf_alloc(void) -{ - struct os_mbuf *m; - - m = os_mbuf_get_pkthdr(&ble_hci_pool_acl_mbuf_pool, - sizeof(struct ble_mbuf_hdr)); - return m; -} +#define TX_Q_SIZE (MYNEWT_VAL(BLE_TRANSPORT_ACL_FROM_LL_COUNT) + \ + MYNEWT_VAL(BLE_TRANSPORT_EVT_COUNT) + \ + MYNEWT_VAL(BLE_TRANSPORT_EVT_DISCARDABLE_COUNT)) -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) -{ - ble_hci_usb_rx_cmd_ll_cb = cmd_cb; - ble_hci_usb_rx_cmd_ll_arg = cmd_arg; - ble_hci_usb_rx_acl_ll_cb = acl_cb; - ble_hci_usb_rx_acl_ll_arg = acl_arg; -} #define BLE_HCI_USB_EVT_COUNT \ - (MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT) + MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT)) + (MYNEWT_VAL(BLE_TRANSPORT_EVT_COUNT)) /** * A packet to be sent over the USB. This can be a command, an event, or ACL @@ -107,11 +49,9 @@ struct ble_hci_pkt { void *data; }; -static struct os_mempool ble_hci_pkt_pool; -static os_membuf_t ble_hci_pkt_buf[ - OS_MEMPOOL_SIZE(BLE_HCI_USB_EVT_COUNT + 1 + - MYNEWT_VAL(BLE_HCI_ACL_OUT_COUNT), - sizeof(struct ble_hci_pkt))]; +static struct os_mempool pool_tx_q; +static os_membuf_t pool_tx_q_buf[ OS_MEMPOOL_SIZE(TX_Q_SIZE, + sizeof(struct ble_hci_pkt)) ]; struct tx_queue { STAILQ_HEAD(, ble_hci_pkt) queue; @@ -151,7 +91,7 @@ tud_bt_acl_data_sent_cb(uint16_t sent_bytes) STAILQ_REMOVE_HEAD(&ble_hci_tx_acl_queue.queue, next); next_acl = STAILQ_FIRST(&ble_hci_tx_acl_queue.queue); OS_EXIT_CRITICAL(sr); - os_memblock_put(&ble_hci_pkt_pool, curr_acl); + os_memblock_put(&pool_tx_q, curr_acl); if (next_acl != NULL) { om = next_acl->data; } @@ -178,13 +118,13 @@ tud_bt_event_sent_cb(uint16_t sent_bytes) assert(hci_ev != NULL && hci_ev[1] + sizeof(struct ble_hci_ev) == sent_bytes); - ble_hci_trans_buf_free(hci_ev); + ble_transport_free(hci_ev); OS_ENTER_CRITICAL(sr); STAILQ_REMOVE_HEAD(&ble_hci_tx_evt_queue.queue, next); next_evt = STAILQ_FIRST(&ble_hci_tx_evt_queue.queue); OS_EXIT_CRITICAL(sr); - os_memblock_put(&ble_hci_pkt_pool, curr_evt); + os_memblock_put(&pool_tx_q, curr_evt); if (next_evt != NULL) { hci_ev = next_evt->data; @@ -201,10 +141,11 @@ tud_bt_acl_data_received_cb(void *acl_data, uint16_t data_len) int rc; if (om == NULL) { - om = ble_hci_trans_acl_buf_alloc(); + om = ble_transport_alloc_acl_from_hs(); assert(om != NULL); } - assert(om->om_len + data_len <= MYNEWT_VAL(BLE_ACL_BUF_SIZE) + BLE_HCI_DATA_HDR_SZ); + assert(om->om_len + data_len <= MYNEWT_VAL(BLE_TRANSPORT_ACL_SIZE) + + BLE_HCI_DATA_HDR_SZ); os_mbuf_append(om, acl_data, data_len); incoming_acl_data = om; @@ -213,7 +154,7 @@ tud_bt_acl_data_received_cb(void *acl_data, uint16_t data_len) len = data[2] + (data[3] << 8) + BLE_HCI_DATA_HDR_SZ; if (incoming_acl_data->om_len >= len) { incoming_acl_data = NULL; - rc = ble_hci_usb_rx_acl_ll_cb(om, ble_hci_usb_rx_acl_ll_arg); + rc = ble_transport_to_ll_acl(om); (void)rc; } } @@ -225,17 +166,14 @@ tud_bt_hci_cmd_cb(void *hci_cmd, size_t cmd_len) uint8_t *buf; int rc = -1; - assert(ble_hci_usb_rx_cmd_ll_cb); - if (ble_hci_usb_rx_cmd_ll_cb) { - buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD); - assert(buf != NULL); - memcpy(buf, hci_cmd, min(cmd_len, BLE_HCI_TRANS_CMD_SZ)); + buf = ble_transport_alloc_cmd(); + assert(buf != NULL); + memcpy(buf, hci_cmd, min(cmd_len, 258)); - rc = ble_hci_usb_rx_cmd_ll_cb(buf, ble_hci_usb_rx_cmd_ll_arg); - } + rc = ble_transport_to_ll_cmd(buf); if (rc != 0) { - ble_hci_trans_buf_free(buf); + ble_transport_free(buf); } } @@ -252,7 +190,7 @@ ble_hci_trans_ll_tx(struct tx_queue *queue, struct os_mbuf *om) return 0; } - pkt = os_memblock_get(&ble_hci_pkt_pool); + pkt = os_memblock_get(&pool_tx_q); if (pkt == NULL) { os_mbuf_free_chain(om); return BLE_ERR_MEM_CAPACITY; @@ -270,29 +208,24 @@ ble_hci_trans_ll_tx(struct tx_queue *queue, struct os_mbuf *om) return 0; } -int -ble_hci_trans_ll_acl_tx(struct os_mbuf *om) -{ - return ble_hci_trans_ll_tx(&ble_hci_tx_acl_queue, om); -} - -int -ble_hci_trans_ll_evt_tx(uint8_t *hci_ev) +static int +ble_hci_trans_ll_evt_tx(void *buf) { struct ble_hci_pkt *pkt; + uint8_t *hci_ev = buf; os_sr_t sr; bool first; assert(hci_ev != NULL); if (!tud_ready()) { - ble_hci_trans_buf_free(hci_ev); + ble_transport_free(hci_ev); return 0; } - pkt = os_memblock_get(&ble_hci_pkt_pool); + pkt = os_memblock_get(&pool_tx_q); if (pkt == NULL) { - ble_hci_trans_buf_free(hci_ev); + ble_transport_free(hci_ev); return BLE_ERR_MEM_CAPACITY; } @@ -308,108 +241,27 @@ ble_hci_trans_ll_evt_tx(uint8_t *hci_ev) return 0; } -uint8_t * -ble_hci_trans_buf_alloc(int type) -{ - uint8_t *buf; - - switch (type) { - case BLE_HCI_TRANS_BUF_CMD: - assert(!usb_ble_hci_pool_cmd.allocated); - usb_ble_hci_pool_cmd.allocated = 1; - buf = usb_ble_hci_pool_cmd.cmd; - break; - - case BLE_HCI_TRANS_BUF_EVT_HI: - buf = os_memblock_get(&ble_hci_usb_evt_hi_pool); - if (buf == NULL) { - /* If no high-priority event buffers remain, try to grab a - * low-priority one. - */ - buf = ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_EVT_LO); - } - break; - - case BLE_HCI_TRANS_BUF_EVT_LO: - buf = os_memblock_get(&ble_hci_usb_evt_lo_pool); - break; - - default: - assert(0); - buf = NULL; - } - - return buf; -} - -void -ble_hci_trans_buf_free(uint8_t *buf) +int +ble_transport_to_hs_acl(struct os_mbuf *om) { - int rc; - - /* XXX: this may look a bit odd, but the controller uses the command - * buffer to send back the command complete/status as an immediate - * response to the command. This was done to insure that the controller - * could always send back one of these events when a command was received. - * Thus, we check to see which pool the buffer came from so we can free - * it to the appropriate pool - */ - if (os_memblock_from(&ble_hci_usb_evt_hi_pool, buf)) { - rc = os_memblock_put(&ble_hci_usb_evt_hi_pool, buf); - assert(rc == 0); - } else if (os_memblock_from(&ble_hci_usb_evt_lo_pool, buf)) { - rc = os_memblock_put(&ble_hci_usb_evt_lo_pool, buf); - assert(rc == 0); - } else { - assert(usb_ble_hci_pool_cmd.allocated); - usb_ble_hci_pool_cmd.allocated = 0; - } - (void)rc; + return ble_hci_trans_ll_tx(&ble_hci_tx_acl_queue, om); } int -ble_hci_trans_reset(void) +ble_transport_to_hs_evt(void *buf) { - return 0; + return ble_hci_trans_ll_evt_tx(buf); } void -ble_hci_usb_init(void) +ble_transport_hs_init(void) { int rc; /* Ensure this function only gets called by sysinit. */ SYSINIT_ASSERT_ACTIVE(); - rc = mem_init_mbuf_pool(ble_hci_pool_acl_mempool_buf, &ble_hci_pool_acl_mempool, &ble_hci_pool_acl_mbuf_pool, - MYNEWT_VAL(BLE_ACL_BUF_COUNT), ACL_BLOCK_SIZE, "ble_hci_acl"); - SYSINIT_PANIC_ASSERT(rc == 0); - - rc = os_mempool_init(&ble_hci_usb_evt_hi_pool, - MYNEWT_VAL(BLE_HCI_EVT_HI_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE), - ble_hci_usb_evt_hi_buf, - "ble_hci_usb_evt_hi_pool"); - SYSINIT_PANIC_ASSERT(rc == 0); - - rc = os_mempool_init(&ble_hci_usb_evt_lo_pool, - MYNEWT_VAL(BLE_HCI_EVT_LO_BUF_COUNT), - MYNEWT_VAL(BLE_HCI_EVT_BUF_SIZE), - ble_hci_usb_evt_lo_buf, - "ble_hci_usb_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. - */ - rc = os_mempool_init(&ble_hci_pkt_pool, - BLE_HCI_USB_EVT_COUNT + 1 + - MYNEWT_VAL(BLE_HCI_ACL_OUT_COUNT), - sizeof (struct ble_hci_pkt), - ble_hci_pkt_buf, - "ble_hci_usb_pkt_pool"); + rc = os_mempool_init(&pool_tx_q, TX_Q_SIZE, sizeof(struct ble_hci_pkt), + pool_tx_q_buf, "ble_hci_usb_tx_q"); SYSINIT_PANIC_ASSERT(rc == 0); } diff --git a/nimble/transport/usb/syscfg.yml b/nimble/transport/usb/syscfg.yml index 38effde..17ef649 100644 --- a/nimble/transport/usb/syscfg.yml +++ b/nimble/transport/usb/syscfg.yml @@ -26,21 +26,3 @@ syscfg.defs: number of ACL buffers that the controller tells the host it has. value: 12 - - BLE_TRANS_USB_SYSINIT_STAGE: - description: > - Sysinit stage for the USB BLE transport. - value: 500 - -syscfg.vals.BLE_EXT_ADV: - BLE_HCI_EVT_BUF_SIZE: 257 - -syscfg.vals: - BLE_HCI_EVT_BUF_SIZE: 70 - BLE_HCI_EVT_HI_BUF_COUNT: 8 - BLE_HCI_EVT_LO_BUF_COUNT: 8 - BLE_ACL_BUF_COUNT: 12 - BLE_ACL_BUF_SIZE: 255 - -syscfg.restrictions: - - '!BLE_HOST'
