| .. _bluetooth-ctlr-arch: |
| |
| LE Controller |
| ############# |
| |
| Overview |
| ******** |
| |
| .. image:: img/ctlr_overview.png |
| |
| #. HCI |
| |
| * Host Controller Interface, Bluetooth standard |
| * Provides Zephyr Bluetooth HCI Driver |
| |
| #. HAL |
| |
| * Hardware Abstraction Layer |
| * Vendor Specific, and Zephyr Driver usage |
| |
| #. Ticker |
| |
| * Soft real time radio/resource scheduling |
| |
| #. LL_SW |
| |
| * Software-based Link Layer implementation |
| * States and roles, control procedures, packet controller |
| |
| #. Util |
| |
| * Bare metal memory pool management |
| * Queues of variable count, lockless usage |
| * FIFO of fixed count, lockless usage |
| * Mayfly concept based deferred ISR executions |
| |
| |
| Architecture |
| ************ |
| |
| Execution Overview |
| ================== |
| |
| .. image:: img/ctlr_exec_overview.png |
| |
| |
| Architecture Overview |
| ===================== |
| |
| .. image:: img/ctlr_arch_overview.png |
| |
| |
| Scheduling |
| ********** |
| |
| .. image:: img/ctlr_sched.png |
| |
| |
| Ticker |
| ====== |
| |
| .. image:: img/ctlr_sched_ticker.png |
| |
| |
| Upper Link Layer and Lower Link Layer |
| ===================================== |
| |
| .. image:: img/ctlr_sched_ull_lll.png |
| |
| |
| Scheduling Variants |
| =================== |
| |
| .. image:: img/ctlr_sched_variant.png |
| |
| |
| ULL and LLL Timing |
| ================== |
| |
| .. image:: img/ctlr_sched_ull_lll_timing.png |
| |
| |
| Event Handling |
| ************** |
| |
| .. image:: img/ctlr_sched_event_handling.png |
| |
| |
| Scheduling Closely Spaced Events |
| ================================ |
| |
| .. image:: img/ctlr_sched_msc_close_events.png |
| |
| |
| Aborting Active Event |
| ===================== |
| |
| .. image:: img/ctlr_sched_msc_event_abort.png |
| |
| |
| Cancelling Pending Event |
| ======================== |
| |
| .. image:: img/ctlr_sched_msc_event_cancel.png |
| |
| |
| Pre-emption of Active Event |
| =========================== |
| |
| .. image:: img/ctlr_sched_msc_event_preempt.png |
| |
| |
| Data Flow |
| ********* |
| |
| Transmit Data Flow |
| ================== |
| |
| .. image:: img/ctlr_dataflow_tx.png |
| |
| |
| Receive Data Flow |
| ================= |
| |
| .. image:: img/ctlr_dataflow_rx.png |
| |
| |
| Execution Priorities |
| ******************** |
| |
| .. image:: img/ctlr_exec_prio.png |
| |
| - Event handle (0, 1) < Event preparation (2, 3) < Event/Rx done (4) < Tx |
| request (5) < Role management (6) < Host (7). |
| |
| - LLL is vendor ISR, ULL is Mayfly ISR concept, Host is kernel thread. |
| |
| Link Layer Control Procedures |
| ***************************** |
| |
| Following is a brief fly in on the main concepts in the implementation of |
| control procedures handling in ULL. |
| |
| Three main execution contexts |
| ============================= |
| |
| - HCI/LLCP API |
| * Miscellaneous procedure initiation API |
| * From ull_llcp.c::ull_cp_<proc>() for initiating local procedures |
| * Interface with running procedures, local and remote |
| |
| - lll_prepare context to drive ull_cp_run() |
| * LLCP main state machine entry/tick'er |
| * From ull_peripheral.c/ull_central.c::ticker_cb via ull_conn_llcp() |
| |
| - rx_demux context to drive ull_cp_tx_ack() and ull_cp_rx() |
| * LLCP tx ack handling and PDU reception |
| * From ull_conn.c::ull_conn_rx() |
| * Handles passing PDUs into running procedures as well as possibly initiating remote procedures |
| |
| Data structures and PDU helpers |
| =============================== |
| |
| - struct llcp_struct |
| * Main LLCP data store |
| * Defined in ull_conn_types.h and declared as part of struct ll_conn |
| * Holds local and remote procedure request queues as well as conn specific LLCP data |
| * Basic conn-level abstraction |
| |
| - struct proc_ctx |
| * General procedure context data, contains miscellaneous procedure data and state as well as sys_snode_t for queueing |
| * Defined in ull_llcp_internal.h, declared/instantiated through ull_llcp.c::create_procedure() |
| * Also holds node references used in tx_ack as well as rx_node retention mechanisms |
| |
| - struct llcp_mem_pool |
| * Mem pool used to implement procedure contexts resource - instantiated in both a local and a remote version |
| * Used through ull_llcp.c::create_procedure() |
| |
| - Miscellaneous pdu gymnastics |
| * Encoding and decoding of control pdus done by ull_llcp_pdu.c::llcp_pdu_encode/decode_<PDU>() |
| * Miscellaneous pdu validation handled by ull_llcp.c::pdu_validate_<PDU>() via ull_llcp.c::pdu_is_valid() |
| |
| LLCP local and remote request/procedure state machines |
| ====================================================== |
| |
| - ull_llcp_local.c |
| * State machine handling local initiated procedures |
| * Naming concept: lr _<...> => local request machine |
| * Local procedure queue handling |
| * Local run/rx/tx_ack switch |
| |
| - ull_llcp_remote.c |
| * Remote versions of the above |
| * Naming concept: rr_<...> => remote request machine |
| * Also handling of remote procedure initiation by llcp_rx_new() |
| * Miscellaneous procedure collision handling (in rr_st_idle()) |
| |
| - ull_llcp_common/conn_upd/phy/enc/cc/chmu.c |
| * Individual procedure implementations (ull_llcp_common.c collects the simpler ones) |
| * Naming concept: lp_<...> => local initiated procedure, rp_<...> => remote initiated procedure |
| * Handling of procedure flow from init (possibly through instant) to completion and host notification if applicable |
| |
| Miscellaneous concepts |
| ====================== |
| |
| - Procedure collision handling |
| * See BT spec for explanation |
| * Basically some procedures can exist in parallel but some can't - for instance only one instant based at a time |
| * Spec states rules for how to handle/resolve collisions when they happen |
| |
| - Termination handling |
| * Specific rules apply re. how termination is handled. |
| * Since we have resource handling re. procedure contexts and terminate must always be available this is handled as a special case |
| * Note also - there are miscellaneous cases where connection termination is triggered on invalid peer behavior |
| |
| - New remote procedure handling |
| * Table new_proc_lut[] maps LLCP PDUs to procedures/roles used in llcp_rr_new() |
| * Note - for any given connection, there can only ever be ONE remote procedure in the remote procedure queue |
| |
| - Miscellaneous minors |
| * pause/resume concepts - there are two (see spec for details) |
| * procedure execution can be paused by the encryption procedure |
| * data TX can be paused by PHY, DLE and ENC procedure |
| * RX node retention - ensures no waiting for allocation of RX node when needed for notification |
| |
| |
| Miscellaneous unit test concepts |
| ================================ |
| |
| - Individual ZTEST unit test for each procedure |
| * zephyr/tests/bluetooth/controller/ctrl_<proc> |
| |
| - Rx node handling is mocked |
| * Different configs are handled by separate conf files (see ctrl_conn_update for example) |
| * ZTEST(periph_rem_no_param_req, test_conn_update_periph_rem_accept_no_param_req) |
| |
| - Emulated versions of rx_demux/prepare context used in unit tests - testing ONLY procedure PDU flow |
| * event_prepare()/event_done() helpers emulating LLL prepare/done flow |
| * lt_rx()/lt_tx() 'lower tester' emulation of rx/tx |
| * ut_rx_node() 'upper tester' emulation of notification flow handling |
| * Bunch of helpers to generate and parse PDUs, as well as miscellaneous mocked ull_stuff() |
| |
| |
| |
| |
| Lower Link Layer |
| **************** |
| |
| LLL Execution |
| ============= |
| |
| .. image:: img/ctlr_exec_lll.png |
| |
| |
| LLL Resume |
| ---------- |
| |
| .. image:: img/ctlr_exec_lll_resume_top.png |
| |
| .. image:: img/ctlr_exec_lll_resume_bottom.png |
| |
| |
| Bare metal utilities |
| ******************** |
| |
| Memory FIFO and Memory Queue |
| ============================ |
| |
| .. image:: img/ctlr_mfifo_memq.png |
| |
| Mayfly |
| ====== |
| |
| .. image:: img/ctlr_mayfly.png |
| |
| |
| * Mayfly are multi-instance scalable ISR execution contexts |
| * What a Work is to a Thread, Mayfly is to an ISR |
| * List of functions executing in ISRs |
| * Execution priorities map to IRQ priorities |
| * Facilitate cross execution context scheduling |
| * Race-to-idle execution |
| * Lock-less, bare metal |
| |
| Legacy Controller |
| ***************** |
| |
| .. image:: img/ctlr_legacy.png |
| |
| Bluetooth Low Energy Controller - Vendor Specific Details |
| ********************************************************* |
| |
| Hardware Requirements |
| ===================== |
| |
| Nordic Semiconductor |
| -------------------- |
| |
| The Nordic Semiconductor Bluetooth Low Energy Controller implementation |
| requires the following hardware peripherals. |
| |
| .. list-table:: SoC Peripheral Use |
| :header-rows: 1 |
| :widths: 15 15 15 10 50 |
| |
| * - Resource |
| - nRF Peripheral |
| - # instances |
| - Zephyr Driver Accessible |
| - Description |
| * - Clock |
| - NRF_CLOCK |
| - 1 |
| - Yes |
| - * A Low Frequency Clock (LFCLOCK) or sleep clock, for low power |
| consumption between Bluetooth radio events |
| * A High Frequency Clock (HFCLOCK) or active clock, for high precision |
| packet timing and software based transceiver state switching with |
| inter-frame space (tIFS) timing inside Bluetooth radio events |
| * - RTC [a]_ |
| - NRF_RTC0 |
| - 1 |
| - **No** |
| - * Uses 2 capture/compare registers |
| * - Timer |
| - NRF_TIMER0 or NRF_TIMER4 [1]_, and NRF_TIMER1 [0]_ |
| - 2 or 1 [1]_ |
| - **No** |
| - * 2 instances, one each for packet timing and tIFS software switching, |
| respectively |
| * 7 capture/compare registers (3 mandatory, 1 optional for ISR profiling, |
| 4 for single timer tIFS switching) on first instance |
| * 4 capture/compare registers for second instance, if single tIFS timer |
| is not used. |
| * - PPI [b]_ |
| - NRF_PPI |
| - 21 channels (20 [2]_), and 2 channel groups [3]_ |
| - Yes [4]_ |
| - * Used for radio mode switching to achieve tIFS timings, for PA/LNA |
| control |
| * - DPPI [c]_ |
| - NRF_DPPI |
| - 20 channels, and 2 channel groups [3]_ |
| - Yes [4]_ |
| - * Used for radio mode switching to achieve tIFS timings, for PA/LNA |
| control |
| * - SWI [d]_ |
| - NRF_SWI4 and NRF_SWI5, or NRF_SWI2 and NRF_SWI3 [5]_ |
| - 2 |
| - **No** |
| - * 2 instances, for Lower Link Layer and Upper Link Layer Low priority |
| execution context |
| * - Radio |
| - NRF_RADIO |
| - 1 |
| - **No** |
| - * 2.4 GHz radio transceiver with multiple radio standards such as 1 Mbps, |
| 2 Mbps and Coded PHY S2/S8 Long Range Bluetooth Low Energy technology |
| * - RNG [e]_ |
| - NRF_RNG |
| - 1 |
| - Yes |
| - |
| * - ECB [f]_ |
| - NRF_ECB |
| - 1 |
| - **No** |
| - |
| * - CBC-CCM [g]_ |
| - NRF_CCM |
| - 1 |
| - **No** |
| - |
| * - AAR [h]_ |
| - NRF_AAR |
| - 1 |
| - **No** |
| - |
| * - GPIO [i]_ |
| - NRF_GPIO |
| - 2 GPIO pins for PA and LNA, 1 each |
| - Yes |
| - * Additionally, 10 Debug GPIO pins (optional) |
| * - GPIOTE [j]_ |
| - NRF_GPIOTE |
| - 1 |
| - Yes |
| - * Used for PA/LNA |
| * - TEMP [k]_ |
| - NRF_TEMP |
| - 1 |
| - Yes |
| - * For RC sourced LFCLOCK calibration |
| * - UART [l]_ |
| - NRF_UART0 |
| - 1 |
| - Yes |
| - * For HCI interface in Controller only builds |
| * - IPC [m]_ |
| - NRF_IPC [5]_ |
| - 1 |
| - Yes |
| - * For HCI interface in Controller only builds |
| |
| |
| .. [a] Real Time Counter (RTC) |
| .. [b] Programmable Peripheral Interconnect (PPI) |
| .. [c] Distributed Programmable Peripheral Interconnect (DPPI) |
| .. [d] Software Interrupt (SWI) |
| .. [e] Random Number Generator (RNG) |
| .. [f] AES Electronic Codebook Mode Encryption (ECB) |
| .. [g] Cipher Block Chaining (CBC) - Message Authentication Code with Counter |
| Mode encryption (CCM) |
| .. [h] Accelerated Address Resolver (AAR) |
| .. [i] General Purpose Input Output (GPIO) |
| .. [j] GPIO tasks and events (GPIOTE) |
| .. [k] Temperature sensor (TEMP) |
| .. [l] Universal Asynchronous Receiver Transmitter (UART) |
| .. [m] Interprocess Communication peripheral (IPC) |
| |
| |
| .. [0] :kconfig:option:`CONFIG_BT_CTLR_TIFS_HW` ``=n`` |
| .. [1] :kconfig:option:`CONFIG_BT_CTLR_SW_SWITCH_SINGLE_TIMER` ``=y`` |
| .. [2] When not using pre-defined PPI channels |
| .. [3] For software-based tIFS switching |
| .. [4] Drivers that use nRFx interfaces |
| .. [5] For nRF53x Series |