# Copyright (c) 2020 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

description: |
    Nordic nRF family RADIO peripheral.

    This controls the 2.4 GHz radio transceiver on nRF5x
    SoCs, which is available for use with Bluetooth, 802.15.4,
    and proprietary wireless protocols (not all of these
    protocols are available on all SoCs; consult the product
    specifications for details).

    This binding is not relevant to the nRF91x baseband radio.

    Front-End Module (FEM) support
    ------------------------------

    External front-end modules are range extenders used for boosting
    the link robustness and link budget of wireless SoCs. If your
    system includes an external FEM, set it up in the devicetree using
    this binding's 'fem' property, like this example:

      &radio {
              fem = <&nrf_radio_fem>;
      };

      nrf_radio_fem: my-fem {
              compatible = "...";
              ....
      };

    Currently supported "compatible" properties for the FEM node are:

      - generic-fem-two-ctrl-pins
      - nordic,nrf21540-fem

    Refer to the bindings for these compatibles for more information
    about how to configure the FEM.

    Direction Finding Extension
    ---------------------------

    Some radios support the Bluetooth Direction Finding Extension (DFE).
    The 'dfe-supported' property will be set when it is available.
    In this case, the 'dfegpio[n]-gpios' properties configure GPIO pins
    to use to drive antenna switching.

    Each dfegpio[n]-gpios property which is set is used to initialize the
    corresponding PSEL.DFEGPIO[n] register.

    None of the dfegpio[n]-gpios properties are marked 'required',
    since which PSEL.DFEGPIO[n] registers will be used to drive
    antenna switches depends on the use case. Nevertheless, at least two
    antennas must be available to use DFE.

    That in turn means that at least one dfegpio[n]-gpios
    property must be provided if DFE is used, to give the radio the
    possibility to switch between two antennas. To use 12 antennas,
    4 GPIOs must be provided (since 4 GPIO pins support switching up to
    16 antennas).

    GPIOs are used in order, following the indices of the dfegpio[n]-gpios
    properties. The order is important because it affects the mapping of
    antenna switch patterns to GPIOs.

    Antenna switching patterns
    --------------------------

    An antenna switching pattern is a binary number where each bit is
    applied to a particular antenna GPIO pin. For example, the pattern
    0x3 means that antenna GPIOs at indexes 0 and 1 will be set, while
    the following are left unset.

    The number of GPIOs specified with dfegpio[n]-gpios properties
    affects the allowed pattern values. For example, when using four
    GPIOs, the pattern count cannot be greater than 16, and the
    maximum allowed value is 15.

    Antenna switch patterns are stored in DFE internal memory by
    writes to the SWITCHPATTERN register. DFE handling code applies
    antenna switch patterns during Constant Tone Extension (CTE)
    receive (Angle of Arrival mode) or transmission (Angle of
    Departure mode) procedure.

    DFE States
    ----------

    There are four states of DFE operation:

    * Idle: in this state, PDU transmission happens.
      DFE uses SWITCHPATTERN[0] to select the antenna in this state.
      (The 'dfe-pdu-antenna' property value described below is stored
      in SWITCHPATTERN[0] by the radio controller code.)

    * Guard: in this state, DFE prepares for reception or transmission
      of CTE. For this state, DFE selects the antenna by applying
      SWITCHPATTERN[1].

    * Reference: in this state, DFE starts to receive or transmit CTE.
      In AoA mode, DFE collects reference IQ samples. The selected
      antenna is the same as in the guard state.

    * Switch-sample: in this state, actual antenna switching happens.
      DFE selects antennas by applying SWITCHPATTERN[2..N]. If the
      number of switch-sample periods is greater than the number of
      stored switching patterns, DFE loops back to SWITCHPATTERN[2].


compatible: "nordic,nrf-radio"

include: [base.yaml]

properties:
    reg:
      required: true

    interrupts:
      required: true

    fem:
      type: phandle
      description: |
        Phandle linking the RADIO node to its external front-end module.

    coex:
      type: phandle
      description: |
        Phandle linking the RADIO node to the external radio coexistence arbitrator.

    dfe-supported:
      type: boolean
      description: |
        If set, the radio hardware supports the Direction Finding Extension.
        This property should be treated as read-only and should not be overridden;
        the correct value is provided for your target's SoC already.

    dfe-antenna-num:
      type: int
      required: false
      description: |
        Number of available antennas for the Direction Finding Extension.

        This should only be set if dfe-supported is true. If you set this
        property, the value must be at least two.

    dfe-pdu-antenna:
      type: int
      required: false
      description: |
        Antenna switch pattern to be used for transmission of PDU before start
        of transmission of Constant Tone Extension.

        This should only be set if dfe-supported is true.

        This pattern is stored in SWITCHPATTERN[0] before actual antenna
        switching patterns. This pattern will also be used to drive GPIOs
        when the radio releases control of GPIOs used to switch antennas.

    dfegpio0-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 0. This should only be set if dfe-supported
        is true.

        For example, to use P0.2 on an nRF5x SoC:

          dfegpio1-gpios = <&gpio0 2 0>;

        To use P1.4:

          dfegpio1-gpios = <&gpio1 4 0>;

        Note the last 'flags' cell in the property is not used,
        and should be set to 0 as shown.

    dfegpio1-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 1. See description for dfegpio0-gpios.

    dfegpio2-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 2. See description for dfegpio0-gpios.

    dfegpio3-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 3. See description for dfegpio0-gpios.

    dfegpio4-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 4. See description for dfegpio0-gpios.

    dfegpio5-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 5. See description for dfegpio0-gpios.

    dfegpio6-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 6. See description for dfegpio0-gpios.

    dfegpio7-gpios:
      type: phandle-array
      required: false
      description: |
        Pin select for DFE pin 7. See description for dfegpio0-gpios.

    ieee802154-supported:
      type: boolean
      description: |
        If set, indicates that the radio hardware supports the IEEE 802.15.4
        mode.

    ble-2mbps-supported:
      type: boolean
      description: |
        If set, indicates that the radio hardware supports the 2 Mbps BLE mode.

    ble-coded-phy-supported:
      type: boolean
      description: |
        If set, indicates that the radio hardware supports coded BLE PHY.

    tx-high-power-supported:
      type: boolean
      description: |
        If set, indicates that the radio hardware supports high TX power
        settings.
