mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-09-17 22:49:55 +00:00
nimble/doc: Add documentation for HCI transport
This commit is contained in:
@@ -0,0 +1,189 @@
|
|||||||
|
<!--
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
-->
|
||||||
|
|
||||||
|
# NimBLE HCI transport
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Transport is split into host (HS) and controller (LL) sides. Those do not
|
||||||
|
necessarily represent actual host/controller, they can be just interfaces to
|
||||||
|
external host (e.g. UART or USB) or controller (e.g.IPC to LL running on
|
||||||
|
another core).
|
||||||
|
|
||||||
|
```
|
||||||
|
+----------+ +----------+
|
||||||
|
| cmd pool | | evt pool |
|
||||||
|
+----------+ +----------+
|
||||||
|
| acl pool | | acl pool |
|
||||||
|
+----------+ +----------+
|
||||||
|
|| ||
|
||||||
|
+----+ +----+
|
||||||
|
| | <--- ble_transport_to_ll_acl ---- | |
|
||||||
|
| | <--- ble_transport_to_ll_evt ---- | |
|
||||||
|
| HS | | LL |
|
||||||
|
| | ---- ble_transport_to_ll_cmd ---> | |
|
||||||
|
| | ---- ble_transport_to_ll_acl ---> | |
|
||||||
|
+----+ +----+
|
||||||
|
```
|
||||||
|
|
||||||
|
HS side allocates buffers for HCI commands and ACL data from dedicated pools
|
||||||
|
using `ble_transport_alloc_cmd` and `ble_transport_alloc_acl_from_hs` calls
|
||||||
|
respectively, then sends them to LL side using `ble_transport_to_ll_cmd` and
|
||||||
|
`ble_transport_to_ll_acl`.
|
||||||
|
|
||||||
|
Similarly, LL side allocates buffers for HCI events and ACL data from dedicated
|
||||||
|
pools using `ble_transport_alloc_evt` and `ble_transport_alloc_acl_from_ll`
|
||||||
|
calls respectively, then sends them to HS side using `ble_transport_to_hs_evt`
|
||||||
|
and `ble_transport_to_hs_acl`.
|
||||||
|
|
||||||
|
Both HCI command and events buffers are freed using `ble_transport_free`, ACL
|
||||||
|
data are freed as regular `os_mbuf`.
|
||||||
|
|
||||||
|
Selecting `native` transport for either HS or LL side will use actual NimBLE
|
||||||
|
host or controller respectively directly instead of transport implementation.
|
||||||
|
Both NimBLE host and controller do not use decidated pools for ACL data and
|
||||||
|
allocate data directly from msys pool - relevant ACL pools will be disabled
|
||||||
|
automatically.
|
||||||
|
|
||||||
|
Actual transport implementation for each side can be set using `BLE_TRANSPORT_HS`
|
||||||
|
and `BLE_TRANSPORT_LL` syscfg for HS and LL sides respectively. Selecting
|
||||||
|
transport in either direction will automatically add dependencies to required
|
||||||
|
transport implementation packages, there's no need to do this manually.
|
||||||
|
Selecting `native` transport for HS and/or LL side will automatically add
|
||||||
|
dependencies to NimBLE host and/or controller packages.
|
||||||
|
|
||||||
|
The order of initialization is defined as follows:
|
||||||
|
- `ble_transport_init` - generic transport initialization
|
||||||
|
- `ble_transport_hs_init` - HS side initialization
|
||||||
|
- `ble_transport_ll_init` - LL side initialization
|
||||||
|
|
||||||
|
Initialization functions for HS and LL sides shall be implemented by transport
|
||||||
|
implementation. There's no need to define those functions as sysinit stages
|
||||||
|
since this is already done by generic transport implementation along with
|
||||||
|
proper dependencies.
|
||||||
|
|
||||||
|
|
||||||
|
## Application configuration
|
||||||
|
|
||||||
|
To ensure that application can be easily run on different BSPs, it's strongly
|
||||||
|
recommended not to put hard dependencies to any transport in `pkg.yml` and
|
||||||
|
use automatic dependencies instead. That means an application that uses NimBLE
|
||||||
|
host should only include `nimble/host` in its dependencies (i.e. no direct
|
||||||
|
dependency to `nimble/controler` or any transport implementation). This will
|
||||||
|
pull `nimble/transport` automatically, force `BLE_TRANSPORT_HS: native` and
|
||||||
|
allow changing LL side using `BLE_TRANSPORT_LL` to any supported controller.
|
||||||
|
|
||||||
|
|
||||||
|
## Multicore SoCs
|
||||||
|
|
||||||
|
On multicore SoCs with dedicated application and network cores (e.g. nRF5340,
|
||||||
|
DA1469x) NimBLE host and controller will run on different cores. In such setup
|
||||||
|
application core uses LL transport implementation instead of an actual NimBLE
|
||||||
|
controller and similarly network core uses HS transport implementation instead
|
||||||
|
of NimBLE host. Both sides of transport implementation are provided by the same
|
||||||
|
transport, e.g. `nrf5340` for nRF5340 or `dialog_cmac` for DA1469x, and exchange
|
||||||
|
data via IPC. This process is transparent from application point of view,
|
||||||
|
assuming it's properly configured (see above).
|
||||||
|
|
||||||
|
```
|
||||||
|
Application core | Network core
|
||||||
|
+----+ +----+ | +----+ +----+
|
||||||
|
| | | LL | | | HS | | |
|
||||||
|
| | <- acl/evt -- | | | | | <- acl/evt -- | |
|
||||||
|
| HS | | tr | <- ipc -> | tr | | LL |
|
||||||
|
| | -- cmd/acl -> | an | | | an | -- cmd/acl -> | |
|
||||||
|
| | | sp | | | sp | | |
|
||||||
|
+----+ +----+ | +----+ +----+
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Build configurations
|
||||||
|
|
||||||
|
### Combined build
|
||||||
|
|
||||||
|
This setup runs both NimBLE host and controller on the same core. It's a typical
|
||||||
|
configuration when running application on SoCs like nRF51 or nRF52.
|
||||||
|
|
||||||
|
Note: this is the default configuration, no need to set it explicitly.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: native
|
||||||
|
BLE_TRANSPORT_LL: native
|
||||||
|
```
|
||||||
|
|
||||||
|
### Controller-only build
|
||||||
|
|
||||||
|
This setup makes NimBLE controller accessible to external host connected via
|
||||||
|
e.g. UART or USB, so it can be used as an external Bluetooth LE controller.
|
||||||
|
The controller runs on the same core as external interface. It's typically
|
||||||
|
used with `blehci` application running on SoCs like nRF51 or nRF52.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: uart
|
||||||
|
BLE_TRANSPORT_LL: native
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Multicore build
|
||||||
|
|
||||||
|
This is a variant of combined build but with NimBLE host and controller running
|
||||||
|
on different cores, like e.g. nRF5340 or DA1469x. Application core can run
|
||||||
|
any application while network core runs `blehci`.
|
||||||
|
|
||||||
|
Note: BSPs for nRF5340 and DA1469x will automatically select proper transport
|
||||||
|
for LL side if NimBLE host or transport is included in build, so usually
|
||||||
|
there's no need to configure manually.
|
||||||
|
|
||||||
|
#### Application core
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: native
|
||||||
|
BLE_TRANSPORT_LL: dialog_cmac
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Network core
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: dialog_cmac
|
||||||
|
BLE_TRANSPORT_LL: native
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Bridge build
|
||||||
|
|
||||||
|
This is a variant of controller-only build but with NimBLE controller running
|
||||||
|
on different core than external interface used to access it, like e.g. nRF5340
|
||||||
|
or DA1469x. In this setup both cores run `blehci` application.
|
||||||
|
|
||||||
|
Note: BSPs for nRF5340 and DA1469x will automatically select proper transport
|
||||||
|
for LL side if NimBLE host or transport is included in build, so usually
|
||||||
|
there's only need to select required transport for external interface on
|
||||||
|
application core.
|
||||||
|
|
||||||
|
#### Application core
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: uart
|
||||||
|
BLE_TRANSPORT_LL: nrf5340
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Network core
|
||||||
|
```yaml
|
||||||
|
BLE_TRANSPORT_HS: nrf5340
|
||||||
|
BLE_TRANSPORT_LL: native
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user