Silicon Labs documentation on RAIL version 3.1.0.

Documentation source: https://docs.silabs.com/rail/3.1.0

# RAIL

## Developing with Silicon Labs RAIL

Silicon Labs RAIL (Radio Abstraction Interface Layer) provides an intuitive and easily-customizable radio interface that is designed to support proprietary or standards-based wireless protocols. RAIL allows customers to adopt the latest RF technology without sacrificing their previous development investment. It also future-proofs the code migration to future EFR32 ICs. The unified radio software API abstracts the significant number of hardware registers and complexity of the lower-level radio block, allowing customers to focus on their proprietary wireless application development instead of mastering device-specific details. RAIL is delivered through the Proprietary Flex SDK component of the Gecko SDK Suite (GSDK).

![rail block diagram](/rail-start/0.1/images/rail-block-diagram.png)

Silicon Labs RAIL is the lowest layer for all networking stacks in Silicon Labs GSDK. RAIL supports a diverse set of radio configurations and functionality and is one of the key underlying technologies of Silicon Labs wireless products. The content on these pages is intended for developers who need to control their device's radio interface and performance through their embedded application.

**For details about this release**: Links to release notes are available on the [silabs.com Gecko SDK page](https://www.silabs.com/developers/gecko-software-development-kit).

**For Silicon Labs' proprietary product information**: See the [product pages on silabs.com](https://www.silabs.com/wireless/proprietary).

**For background about RAIL**: [RAIL Fundamentals](/rail/3.1.0/rail-fundamentals)
is a good place to start.

**To get started with development**: See the [Getting Started section](/rail/3.1.0/rail-getting-started-overview) to get started working with example applications.

**If you are already in development**: See the [Developer's Guide](/rail/3.1.0/rail-developers-guide-overview) or the [PHY Development section](/rail/3.1.0/rail-phy-development-overview) for details or go directly to the [API Reference](/rail/3.1.0/rail-api).

## Release Notes

### RAIL SDK Version 3.1.0 - Release Notes (Jun 23, 2026)

The RAIL SDK is a complete software development suite for proprietary wireless applications. It was previously part of the Proprietary SDK. Starting with the RAIL SDK 2.18.0 release, Proprietary SDK is split into RAIL SDK and Connect SDK.

Silicon Labs RAIL (Radio Abstraction Interface Layer) is an intuitive and easily-customizable radio interface layer designed to support both proprietary and standards-based wireless protocols.

The RAIL SDK is supplied with extensive documentation and sample applications.

#### Release Summary

[Key Features](#key-features) | [API Changes](#api-changes) | [Bug Fixes](#bug-fixes) | [Chip Enablement](#chip-enablement)

##### Key Features

None.

##### API Changes

None.

##### Bug Fixes

None.

##### Chip Enablement

None.

#### Key Features

[New Features](#new-features) | [Enhancements](#enhancements) | [Removed Features](#removed-features) | [Deprecated Features](#deprecated-features)

##### New Features

None.

##### Enhancements

None.

##### Removed Features

None.

##### Deprecated Features

None.

#### API Changes

[New APIs](#new-ap-is) | [Modified APIs](#modified-ap-is) | [Removed APIs](#removed-ap-is) | [Deprecated APIs](#deprecated-ap-is)

##### New APIs

None.

##### Modified APIs

None.

##### Removed APIs

None.

##### Deprecated APIs

None.

#### Bug Fixes

None.

#### Chip Enablement

None.

#### Application Example Changes

[New Examples](#new-examples) | [Modified Examples](#modified-examples) | [Removed Examples](#removed-examples) | [Deprecated Examples](#deprecated-examples)

##### New Examples

None.

##### Modified Examples

None.

##### Removed Examples

None.

##### Deprecated Examples

None.

#### Impact of Release Changes

[Impact Statements](#impact-statements) | [Migration Guide](#migration-guide)

##### Impact Statements

None.

##### Migration Guide

Click [here](https://docs.silabs.com/rail/3.1.0/rail-sdk-services/md-mnt-raid-workspaces-ws-jprnpk-x-rl-overlay-gsdk-app-rail-documentation-suds-migration-guide) for the migration guide for deprecated, removed, and modified items.

#### Known Issues and Limitations

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Issue or Limitation Description</th>
            <th>GitHub / Salesforce Reference (if any)</th>
            <th>Workaround (if any)</th>
            <th>Affected Software Variants, Hardware, Modes, Host Interfaces</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                1268208
            </td>
            <td>
                The power consumption of DK2600 can't be optimized if the configuration time for EM2 and if UART are both being used, as the value of SL_IOSTREAM_USART_{instance}_BAUDRATE does not take effect. The default value used instead is 115200 bps. Typical use case is RAIL - SoC Wireless M-bus Meter with DK2600 board.
            </td>
            <td>
                None
            </td>
            <td>
                Update UART baud rate to 9600 bps at Simplicity Studio Admin Console. This is necessary for EM2.
            </td>
            <td>
                <ul>
                    <li>RAIL SDK sample applications</li>
                    <li>BRD2600A</li>
                    <li>SoC</li>
                    <li>UART interface</li>
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1274248
            </td>
            <td>
                Range Test DMP instabilities in case of LTO.
            </td>
            <td>
                None
            </td>
            <td>
                Do not use LTO.
            </td>
            <td>
                <ul>
                    <li>Range Test DMP sample applications</li>
                    <li>All supported boards</li>
                    <li>SoC</li>
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1375450
            </td>
            <td>
                Wi-SUN HAN phys aren't supported by Standard packet assembler and Packet Assistant components.
            </td>
            <td>
                None
            </td>
            <td>
                Do not use Wi-SUN HAN phys with RAIL SDK sample applications.
            </td>
            <td>
                <ul>
                    <li>RAIL SDK sample applications</li>
                    <li>All supported boards</li>
                    <li>SoC, NCP mode</li>
                    <li>UART, SPI interface</li>
                </ul>
            </td>
        </tr>
        <tr>
            <td>
            </td>
            <td>
                Updating the Baremetal sample applications to RTOS causes build errors.
            </td>
            <td>
                None
            </td>
            <td>
                <p>Follow the Platforms guide <a href="https://docs.silabs.com/gecko-platform/latest/platform-service-sl-main-baremetal-to-kernel-application-transition/">sl_main Baremetal to RTOS Application Transition</a>.</p>
            </td>
            <td>
                <ul>
                    <li>RAIL SDK Baremetal sample applications</li>
                    <li>All supported boards</li>
                    <li>SoC, NCP mode</li>
                    <li>UART, SPI interface</li>
                </ul>
            </td>
        </tr>
    </tbody>
</table>

#### Using This Release

[What's in the Release?](#what-s-in-the-release) | [Compatible Software](#compatible-software) | [Installation and Use](#installation-and-use) | [Help and Feedback](#help-and-feedback)

##### What's in the Release?

RAIL SDK showcasing the usage of the RAIL library

##### Compatible Software

None.

##### Installation and Use

To upgrade your existing software with this release, see instructions **[here](https://docs.silabs.com/rail/latest/rail-sdk-services/md-mnt-raid-workspaces-ws-jprnpk-x-rl-overlay-gsdk-app-rail-documentation-suds-migration-guide)**.

To run your first demo, see our [Getting Started Guides](https://docs.silabs.com/rail/latest/rail-getting-started-overview/).

To kick start your development, see our [Developer's Guide](https://docs.silabs.com/rail/latest/rail-examples/).

For information about Secure Vault Integration, see [Secure Vault](https://www.silabs.com/security/secure-vault).

To review Security and Software Advisory notifications and manage your notification preferences:

1. Go to [https://community.silabs.com/](https://community.silabs.com/).
2. Log in with your account credentials.
3. Click your profile icon in the upper-right corner of the page.
4. Select **Notifications** from the dropdown menu.
5. In the Notifications section, go to the **My Product Notifications** tab to review historical Security and Software Advisory notifications
6. To manage your preferences, use the **Manage Notifications** tab to customize which product updates and advisories you receive.

To learn more about the software in this release, dive into our [online documentation](https://docs.silabs.com/rail/latest/rail-examples/).

##### Help and Feedback

- Contact [Silicon Labs Support](https://www.silabs.com/support).
- To use our **Ask AI** tool to get answers, see the search field at the top of [this page](https://docs.silabs.com/).  
  > **Note:** **Ask AI** is experimental.
- Get help from our [developer community](https://community.silabs.com/s/?language=en_US).

#### SDK Release and Maintenance Policy

See our [SDK Release and Maintenance Policy](https://www.silabs.com/developer-tools/sdk-release-and-maintenance-policy).

### RAIL Library Version 3.1.0 - Release Notes (Jun 23, 2026)

Silicon Labs RAIL (Radio Abstraction Interface Layer) provides an intuitive and easily-customizable radio interface that is designed to support proprietary or standards-based wireless protocols.

Click [here](https://docs.silabs.com/sisdk-release-notes/2025.12.3/sisdk-rail-lib-release-notes/) for earlier releases.

#### Release Summary

[Key Features](#key-features) | [API Changes](#api-changes) | [Bug Fixes](#bug-fixes) | [Chip Enablement](#chip-enablement)

##### Key Features

None.

##### API Changes

This release includes API updates for event/config visibility, RF sensing and multiprotocol timing support, plus a TX PA interface refresh with migration toward newer power-table APIs.

##### Bug Fixes

Minor improvements.

##### Chip Enablement

None.

#### Key Features

[New Features](#new-features) | [Enhancements](#enhancements) | [Removed Features](#removed-features) | [Deprecated Features](#deprecated-features)

##### New Features

Added RX computation of sl_rail_packet_time_stamp_t::packet_duration_us for non-BLE PHYs on all supported platforms except EFR32xG21. This duration can be used for timestamp adjustment by setting sl_rail_packet_time_stamp_t::total_packet_bytes to SL_RAIL_RX_STARTED_BYTES.

##### Enhancements

- Changed IR calibration behavior for 2.4 GHz PHY configurations: RAIL now applies the quick IR calibration automatically when these PHYs are configured, so SL_RAIL_EVENT_CAL_NEEDED is no longer raised for BLE and IEEE 802.15.4 2.4 GHz PHYs. Stacks such as Zigbee, Thread, and BLE no longer need to call sl_rail_calibrate_ir(), sl_rail_ieee802154_calibrate_ir_2p4_ghz(), or sl_rail_ble_calibrate_ir() for these PHYs. Sub-GHz PHYs are unchanged and still raise SL_RAIL_EVENT_CAL_NEEDED when IR calibration is needed.
- Added new sl_rail_get_events_config() API returning the current set of enabled events.
- Updated setEventConfig and printEvents commands in sl_rail_test to display enabled events and use a more readable low/high 32-bit event mask format. For example:  
  ```c  
  > seteventconfig 0x10 0 0x1000 0x1000.  
  {{(seteventconfig)}{EnabLH:0xfff3ffef 0x004c123f}{PrevLH:0xfff3ffff 0x004c023f}}.  
  > printevents 0x10 0x1000.  
  {{(printevents)}{printLH:0x00000010 0x00001000}{enabLH:0xfff3ffef 0x004c123f}}.  
  > printevents.  
  #{{(printevents)}{shift}{maskLH}{print}{enabled}{name}}.  
  {{ 0}{0x00000001 0x00000000}{     }{on}{SL_RAIL_EVENT_RSSI_AVERAGE_DONE}}.  
  {{ 1}{0x00000002 0x00000000}{     }{on}{SL_RAIL_EVENT_RX_ACK_TIMEOUT}}.  
  {{ 2}{0x00000004 0x00000000}{     }{on}{SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL}}.  
  {{ 3}{0x00000008 0x00000000}{     }{on}{SL_RAIL_EVENT_RX_PACKET_RECEIVED}}.  
  {{ 4}{0x00000010 0x00000000}{print}{  }{SL_RAIL_EVENT_RX_PREAMBLE_LOST}}.  
  ```

##### Removed Features

None.

##### Deprecated Features

None.

#### API Changes

[New APIs](#new-apis) | [Modified APIs](#modified-apis) | [Removed APIs](#removed-apis) | [Deprecated APIs](#deprecated-apis)

##### New APIs

For all the new APIs that are added in this release, please refer [New APIs](https://docs.silabs.com/rail/3.1.0/rail-api/api-changes#added).

##### Modified APIs

For all the new APIs that are modified in this release, please refer [Modified APIs](https://docs.silabs.com/rail/3.1.0/rail-api/api-changes#modified).

##### Removed APIs

None.

##### Deprecated APIs

None.

#### Bug Fixes

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Issue Description</th>
            <th>GitHub / Salesforce Reference (if any)</th>
            <th>Affected Software Variants, Hardware, Modes, Host Interfaces</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                1435640
            </td>
            <td>
                Fixed an issue were changing radio configurations while frame detection is disabled due to RX overflow or SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION would silently re-enable frame detection.
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1506276
            </td>
            <td>
                Reduced host flash/RAM alignment requirements for RAIL RISC-V sequencer and Soft Modem image data on EFR32xG25 and Series 3 devices.
            </td>
            <td>
            </td>
            <td>
                <ul>
                    <li>EFR32xG25</li>
                    <li>SixG301</li>
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1529962
            </td>
            <td>
                <ul>
                    <li>Fixed an issue where enabling Coex PHY Select on non-Series 1 devices could build without reporting the unsupported configuration. The build now fails with an error because Coex PHY Select is supported only on Series 1 devices.</li>
                    <li>Fixed issue where railtest and sl_rail_test could silently ignore attempts to select coexistence optimized PHY configurations on non-Series 1 devices. These CLI commands now report a runtime error for unsupported devices.</li>
                </ul>
            </td>
            <td>
            </td>
            <td>
                <ul>
                    All chips
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1569271
            </td>
            <td>
                Fixed an issue on the SixG301 part where SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND was not generated for the IEEE 802.15.4 stack when Fast Channel Switching is enabled.
            </td>
            <td>
            </td>
            <td>
                SixG301
            </td>
        </tr>
        <tr>
            <td>
                1570638
            </td>
            <td>
                Fixed an issue on the EFR32xG25 where writing to an empty TX FIFO during a transmit could cause data corruption, with the first added byte sent twice. This was more likely to occur with OFDM or SUN OQPSK PHYs.
            </td>
            <td>
            </td>
            <td>
                EFR32xG25
            </td>
        </tr>
        <tr>
            <td>
                1577029
            </td>
            <td>
                Fixed sl_rail_idle() SL_RAIL_IDLE_ABORT behavior when SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES is enabled so an active receive is aborted immediately instead of being allowed to complete and potentially transmit an Auto-ACK.
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1579758
            </td>
            <td>
                <ul>
                    <li>Fixed an issue where a short-backoff CSMA/LBT transmit could incorrectly report channel busy when started while the radio was still transitioning back to receive after a prior transmit.</li>
                    <li>Changed sl_rail_test repeated transmit behavior so a transmit using wait-for-ACK does not schedule the next transmit until the ACK is received or times out. The previous behavior can be restored with the new optional setTxDelay parameter to schedule on transmit completion.</li>
                </ul>
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1604104
            </td>
            <td>
                Fixed an issue with sl_rail_start_scheduled_cca_csma_tx() / sl_rail_start_scheduled_cca_lbt_tx() where the CSMA/LBT operation would commence approximately 100us before the scheduled time.
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1616076
            </td>
            <td>
                Fixed a timing issue with delayed or missing first SL_RAIL_EVENT_TX_CCA_ACTIVATED when using sl_rail_start_scheduled_cca_csma_tx() or sl_rail_start_scheduled_cca_lbt_tx().
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1625060
            </td>
            <td>
                Fixed a race condition that could cause a channel-hopping packet received soon after a transmit to report an incorrect sl_rail_rx_packet_details_t::channel_hopping_channel_index (while sl_rail_rx_packet_details_t::channel is correct).
            </td>
            <td>
            </td>
            <td>
                All chips
            </td>
        </tr>
        <tr>
            <td>
                1626321
            </td>
            <td>
                Fixed an issue with timestamp adjustment where SUN OQPSK RX frame duration computation on the EFR32xG25 could be incorrect, and TX timestamps could use the wrong delay value for TX start or end timestamps.
            </td>
            <td>
            </td>
            <td>
                EFR32xG25
            </td>
        </tr>
        <tr>
            <td>
                1629183
            </td>
            <td>
                Fixed a Z-Wave TX power adjustment compliance issue by providing Sub-GHz PA auto-mode curves in rail_util_pa and PA auto-mode power mapping tables in sl_rail_util_pa_tables for EFR32xG23, EFR32xG28, and EFR32xG2D devices.
            </td>
            <td>
            </td>
            <td>
                <ul>
                    <li>EFR32xG23</li>
                    <li>EFR32xG28</li>
                    <li>EFR32xG2D</li>
                </ul>
            </td>
        </tr>
    </tbody>
</table>

#### Chip Enablement

None.

#### Application Example Changes

[New Examples](#new-examples) | [Modified Examples](#modified-examples) | [Removed Examples](#removed-examples) | [Deprecated Examples](#deprecated-examples)

##### New Examples

None.

##### Modified Examples

None.

##### Removed Examples

None.

##### Deprecated Examples

None.

#### Known Issues and Limitations

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Issue or Limitation Description</th>
            <th>GitHub / Salesforce Reference (if any)</th>
            <th>Workaround (if any)</th>
            <th>Affected Software Variants, Hardware, Modes, Host Interfaces</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>
                1660009
            </td>
            <td>
                There is a known issue on SixG301 when using IEEE 802.15.4 HDR FCS standard PHYs (IEEE802154_2P4_MODE_FCS_2MBPS and IEEE802154_2P4_MODE_FCS_1MBPS_FEC) to utilize the HDR PHY functionality, where the receiver may stop receiving standard packets on both FCS channels.
            </td>
            <td>
                None
            </td>
            <td>
                None
            </td>
            <td>
                <ul>
                    SixG301
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1581310
            </td>
            <td>
                There is a known issue on the EFR32xG24 part with a BLE sleepy app using AoX antenna switching where a transmit completion event isn't generated for a packet that contains AoA connectionless CTE. This locks up BLE.
            </td>
            <td>
                None
            </td>
            <td>
                The current workaround is to configure the app not to sleep lower than EM1.
            </td>
            <td>
                <ul>
                    EFR32xG24
                </ul>
            </td>
        </tr>
        <tr>
            <td>
                1458845
            </td>
            <td>
                When running Channel Sounding RTT with a non-BG24 CS device, RTT has an error of +/- 12.5 ns depending on CS role. Precision is not affected. BG24 to BG24 RTT is not affected.
            </td>
            <td>
                None
            </td>
            <td>
                None
            </td>
            <td>
                <ul>
                    <li>non-BG24 CS devices</li>
                    <li>Channel Sounding RTT</li>
                </ul>
            </td>
        </tr>
    </tbody>
</table>

#### Impact of Release Changes

[Impact Statements](#impact-statements) | [Migration Guide](#migration-guide)

##### Impact Statements

None.

##### Migration Guide

RAIL APIs have been updated to 3.0 bringing several improvements in the areas of RAIL initialization, RX FIFOs and companion Packet Queues, TX FIFOs, and TX power management. Refer to [RAIL 3.0 Migration guide](https://docs.silabs.com/rail/3.0.0/rail-3-migration-guide/) for more details.

#### Using This Release

[What's in the Release?](#what-s-in-the-release) | [Compatible Software](#compatible-software) | [Installation and Use](#installation-and-use) | [Help and Feedback](#help-and-feedback)

##### What's in the Release?

RAIL Library packages and plugins

##### Compatible Software

None.

##### Installation and Use

For information about Secure Vault Integration, see [Secure Vault](https://www.silabs.com/security/secure-vault).

To review Security and Software Advisory notifications and manage your notification preferences, complete the following steps:

1. Go to [https://community.silabs.com/](https://community.silabs.com/).
2. Sign in with your account credentials.
3. Click on your profile icon in the upper-right corner of the page.
4. Select **Notifications** from the dropdown menu.
5. In the Notifications section, go to the **My Product Notifications** tab to review historical Security and Software Advisory notifications.
6. To manage your preferences, use the **Manage Notifications** tab to customize which product updates and advisories you receive.

##### Help and Feedback

- Contact [Silicon Labs Support](https://www.silabs.com/support).
- To try our **Ask AI** tool to get answers, use the search field at the top of the [Silicon Labs Developer Documentation](https://docs.silabs.com/) page.  
  > **Note:** **Ask AI** is experimental.
- Get help from our [developer community](https://community.silabs.com/s/?language=en_US).

##### Unsupported Features

None.

#### SDK Release and Maintenance Policy

See our [SDK Release and Maintenance Policy](https://www.silabs.com/developer-tools/sdk-release-and-maintenance-policy).

## Getting Started

### Getting Started with RAIL - Overview

To get started, download the Simplicity Studio® 5 (SSv5) Development environment
as described in the [Simplicity Studio 5 User's Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-getting-started/).

This will also prompt you to install the Gecko SDK (GSDK). The Radio Configurator tool and the RAIL library are installed with the GSDK as part of the Proprietary Flex package. The GSDK combines Silicon Labs wireless software development kits (SDKs) and Gecko Platform into a single, integrated package. The GSDK is your primary tool for developing in the Silicon Labs IoT Software ecosystem. All of Silicon Labs' stacks are written in-house to provide a seamless experience from silicon to tools, allowing you to unlock powerful features with ease, including:

- Abstraction of complex requirements like multiprotocol and pre-certification
- Industry-leading ability to support a large number of nodes
- Ultra-low power consumption
- Strong network reliability

Silicon Labs also helps future-proof your devices with over-the-air software and security updates, helping to minimize maintenance cost and improve your end user product experience.

Once you have downloaded Simplicity Studio and the GSDK, detailed instructions for using the RAIL examples and configuration tools are provided in the [**Proprietary Flex Quick-Start Guide**](/rail/3.1.0/proprietary-flex-sdk-v3x-quick-start-guide).

Information about the distinguishing features of different EFR32 families that are most relevant to porting proprietary wireless applications between them is provided in [**EFR32 Migration Guide for Proprietary Applications**](/rail/3.1.0/efr32-migration-guide-for-proprietary-apps). This is also helpful when selecting an initial target platform for proprietary wireless solutions.

Note: The recommended method to get started with the GSDK is to first install Simplicity Studio 5, which will set up your development environment and walk you through the GSDK installation. Alternatively, GSDK and other required tools may be installed manually from the [GitHub GSDK site](https://github.com/SiliconLabs/gecko_sdk/#README.MD).

#### Development Tools

As well as Simplicity Studio, Silicon Labs provides the following development tools.

**Network Analyzer**: SSv5's Network Analyzer enables debugging of complex wireless systems. This tool captures a trace of wireless network activity that can be examined in detail live or at a later time. See the [Network Analyzer section](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-tools-network-analyzer/) of the Simplicity Studio 5 User's Guide for more information.

**Wireshark**: Is this of interest to RAIL? Wireshark is the recommended network protocol analyzer for use with **for example, Wi-SUN**. Download instructions are provided for [Windows/Mac users](https://www.wireshark.org/download.html) or [Linux users](https://www.wireshark.org/docs/wsug_html_chunked/ChBuildInstallUnixInstallBins.html). Simplicity Studio® 5 supports [live interaction](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-testing-and-debugging/using-wireshark) between the application running on a Silicon Labs device and Wireshark.

**Energy Profiler**: SSv5's Energy Profiler enables you to visualize the energy consumption of individual devices, multiple devices on one target system, or a network of interacting wireless devices to analyze and improve the power performance of these systems. Real-time information on current consumption is correlated with the program counter providing advanced energy software monitoring capabilities. It also provides a basic level of integration with the Network Analyzer network analysis tool. See the [Energy Profiler section](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-tools-energy-profiler/) of the Simplicity Studio 5 User's Guide for more information.

**Simplicity Commander**: Simplicity Commander is a single, all-purpose tool to be used in a production environment. It is invoked using a simple Command Line Interface (CLI) that is also scriptable. Simplicity Commander enables customers to complete essential tasks such as configuring and building applications and bootloaders and flashing images to their devices. Simplicity Commander is available through SSv5 or can be downloaded through [system-specific installers](https://www.silabs.com/developers/mcu-programming-options#programming). The [**Simplicity Commander User's Guide**](https://docs.silabs.com/simplicity-commander/latest/simplicity-commander-start/) provides more information.

**Silicon Labs Configurator (SLC)**: SLC offers command-line access to application configuration and generation functions. [**Software Project Generation and Configuration with SLC-CLI**](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-tools-slc-cli/) provides instructions on downloading and using the SLC-CLI tool.

### Proprietary Flex SDK v3.x Quick Start Guide

#### Proprietary Flex SDK v3.x Quick-Start Guide

> **Note: This section replaces _QSG168: Proprietary Flex SDK v3.x Quick Start Guide_. Further updates to this quick start guide note will be provided here**.

This quick start guide provides basic information on configuring, building, and installing applications for the EFR32 using the Silicon Labs Flex Software Development Kit (SDK) v3.x with Simplicity Studio® 5. The Flex SDK provides two paths to application development. The first begins with Silicon Labs RAIL (Radio Abstraction Interface Layer), which is an intuitive, versatile radio interface layer that is designed to support the implementation of arbitrary wireless protocols.

The second uses the Silicon Labs Connect protocol stack, which provides a fully-featured, easily-customizable wireless networking solution optimized for devices that require low power consumption and are used in a simple network topology.

This guide is designed for developers who are new to the Silicon Labs Flex SDK, the Simplicity Studio development environment, and Silicon Labs development hardware. It provides instructions to get started using both the Connect and RAIL examples provided with the Flex SDK used on the EFR32.

Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

##### Key Points

- Product overview
- Setting up the development environment
- Discovering the SDK
- Working with example applications.
- Using the Pin Tool

#### Proprietary Flex SDK Product Overview

The Silicon Labs Proprietary Flex SDK supports developers who wish to take advantage of configurable protocol functionality provided in Silicon Labs Connect and the underlying RAIL library, as well as those who wish to start application development on top of RAIL to develop custom lower-level radio control, and network protocols.

This section covers:

- Background information on RAIL, Connect, and the example applications included with the Flex SDK
- Background information on the Gecko Bootloader
- Prerequisites for application development using the Flex SDK
- Support
- Documentation

##### About Connect and RAIL

The Flex SDK provides two paths to application development. The first begins with Silicon Labs RAIL (Radio Abstraction Interface Layer), which is an intuitive, versatile radio interface layer that is designed to support the implementation of arbitrary wireless protocols. The second uses Silicon Labs Connect protocol stack, which provides a fully-featured, easily-customizable wireless networking solution optimized for devices that require low power consumption and are used in a simple network topology. Connect example functionality is provided through easily-configurable components that can be turned on or off as desired.

Whether you begin development with Connect or RAIL is determined by the example application you select as a starting point in Simplicity Studio. Silicon Labs recommends that you start from a Connect example if you want to include the following functions without further development:

- MAC layer functionality including frequency hopping and security
- Network formation and, for star networks, routing support
- Application-level functionality, including diagnostics, I/O, mailbox, and sleepy end device management
- Bootloading, including serial and Broadcast or Unicast OTA (over-the-air)

The following sections provide additional detail on Connect and RAIL, including brief descriptions of the example applications. When you create a project based on an example, the Project Details on the Simplicity Studio IDE Overview tab provides additional detail about the example and interfacing with it.

###### Silicon Labs Connect

Silicon Labs Connect functionality for the EFR32 is implemented on top of the RAIL library. Silicon Labs Connect supports many combinations of radio modulation, frequency and data rates. The stack includes all MAC layer functions such as scanning and joining, setting up of a point-to-point or star network, device types such as sleepy end nodes, routers or coordinators, radio configuration, frequency hopping and LBT (Listen Before Talk) protocols required for regulatory compliance in each geographical region, and PHY configuration for each of these regions. With all this functionality already implemented in the stack, developers can focus on their application development and not worry about the lower-level radio and network details.

The Flex SDK includes a number of Connect example applications including the following.

**Connect SoC - Empty**: A minimal Connect project structure, used as a starting point for custom applications.

**Connect SoC - Direct mode Device**: Demonstrates direct communication between nodes in range. The network parameters are commissioned by the application.

**Connect SoC - MAC Mode Device**: Demonstrates direct MAC mode communication between nodes in range.

**Connect SoC - Sensor** and **Connect SoC - Sink**: The sensor and sink applications demonstrate how to set up a star network topology in which communication occurs in both directions between the sink and the sensor(s) nodes.

**Connect – SoC ECDH Key Exchange**: Illustrates how to share the network key between multiple devices in a secure way (using Elliptic-curve Diffie-Hellman (ECDH) key agreement protocol).

**Connect – SoC Switch**: In combination with the **Connect Bluetooth DMP – SoC Light** example, demonstrates a simple wireless communication between two or more boards using the Connect SDK.

**Connect Bluetooth DMP – SoC Empty**: An RTOS-based project that provides a skeleton for Connect, with the only function being a Bluetooth LE Task with a basic CLI interface.

**Connect Bluetooth DMP – SoC Light**: In combination with the **Connect – SoC Switch** example, demonstrates a simple wireless communication between two or more boards using the Connect SDK.

**Connect – NCP**: A Co-Processor Communication secondary implementation of the Connect API. It can be used with the CPC daemon and the Connect host library and example applications. All can be found on github. See the readme of the application or [Network Co-Processor Applications with Silicon Labs Connect v3.x](https://docs.silabs.com/connect-stack/latest/network-co-processor-applications-connect-v3x) for further information.

###### Silicon Labs RAIL

Silicon Labs RAIL provides an intuitive, versatile radio interface layer designed to support proprietary or standards-based wireless protocols. RAIL is delivered as a library that you can link to your applications. A description of library functions is provided in the development environment. The RAIL API is documented in an online API reference available through Simplicity Studio and online at [https://docs.silabs.com/](https://docs.silabs.com/).

RAIL:

- Implements commonly-used radio functionality, so that it does not have to be written in the application or stack.
- Eliminates the need for developers to become expert in RF register details of complex wireless SoCs.
- Simplifies code migration to new wireless ICs and the development of new stacks by providing a common radio interface layer.
- Allows lab evaluation in addition to application code development.

The RAIL library supports APIs for:

- General Radio Operation
- Channel definition and selection
- Output power configuration
- Transmit
- Clear Channel Assessment before Transmit
- Scheduled Transmit
- Energy Detection
- Receive
- Packet Filtering
- Calibration
- CW (Carrier Wave) Transmission
- Modulated Transmission
- RFSense configuration as wake source

The Flex SDK includes example RAIL application code to demonstrate the capabilities of the device and the RAIL library. These examples are provided as source code to offer a starting point for application development. The following examples, among others, are included in the current release.

**RAIL – SoC RAILtest**

RAILtest is a general test tool for the RAIL library. RAILtest is developed by the core engineering team working on the RAIL library. As each RAIL library feature is implemented, a RAILtest serial command is added to allow scripted testing and ad hoc experimentation. Many of the RAILtest serial commands can be used for lab evaluation.

RAILtest includes commands to:

- Transmit and receive packets.
- Schedule transmits at a specific time in the RAIL timebase.
- Configure RAIL address filtering to receive only specific packets.
- Enable CCA mechanisms (CSMA/LBT) to validate that a channel is clear before transmit.
- Set a timer callback in the RAIL timebase to see how the RAIL timer API works.
- Change the transmit channel within the current configuration's band.
- Change the transmit power level.
- Enable RF energy sensing of specified duration across the 2.4 GHz and/or Sub-GHz bands, and sleep to wake on this event.
- Output a continuous unmodulated tone for debugging.
- Output a continuous modulated PN9 stream for debugging.
- Enter into direct mode where data can be sent and received using asynchronous GPIOs as input and output.

**RAIL – SoC Range Test**

The Range Test examples enable over-the-air range testing between two devices customized with user-defined parameters. Range Test is designed to be run on Silicon Labs hardware without the need for commands from a host computer. This capability allows for mobility during range testing activities.

**RAIL – SoC Range Test BLE and IEEEE80215.4**

The Range Test examples enable over-the-air range testing between two devices customized with user-defined parameters. Five predefined PHYs can be used: BLE: 125kbps, BLE: 500kbps, BLE: 1Mbps, BLE: 2Mbps, IEEE80215.4: 250kbps.

**RAIL – SoC Switch**: Demonstrates the simplest exchange of transmit and receive operation between a light and a switch.

**RAIL – SoC Light**: Demonstrates the simplest exchange of transmit and receive operation between a RAIL light and a RAIL switch. The light is capable of periodically and on change reporting its status back to the switch. This is not the dynamic multiprotocol light example application.

**RAIL – SoC Mode Switch**: Demonstrates an exchange of transmit and receive operations between two (or more) nodes expanded by the Wi-SUN Mode Switching features implemented in RAIL.

**RAIL – SoC Simple TRX Multi-PHY**: Demonstrates the use of multiple PHYs selectable by channels. By default, channel 0 is configured to 2.4 GHz, 250 kbps, and channel 1 is configured to 915 MHz, 500 kbps (both packets are receivable by a single-PHY application using the correct pre-configured PHY). For details see AN971: EFR32 Radio Configurator Guide.

**RAIL – SoC Simple TRX**: Demonstrates the simplest transmit and receive functions based on RAIL.

**RAIL – SoC Simple TRX Standards**: Demonstrates the simplest transmit and receive functions based on RAIL based on IEEE Std. 802.15.4.

**RAIL – SoC Simple TRX with Auto-ACK**: Demonstrates the simplest exchange transmit and ack operation between two nodes, based on RAIL.

**RAIL – NCP Simple TRX with CPC Support**: Same as _RAIL – SoC Simple TRX_, but implements a Co-Processor Communication endpoint, so the device can be controlled through CPCd from a Linux computer, using UART interface.

**RAIL – NCP Simple TRX with CPC Support (SPI)**: Same as _RAIL – SoC Simple TRX with CPC Support_, but uses SPI interface to communicate with CPCd.

**RAIL – SoC Long Preamble Duty Cycle**: Demonstrates how Rx duty cycling can be implemented using a long preamble.

**RAIL – SoC Burst Duty Cycle**: Demonstrates how Rx duty cycle can be implemented using repeated transmissions

**RAIL – SoC Energy Mode**: Demonstrates the low power modes (EM0-Active, EM1-Sleep, EM2-Deep Sleep). of the EFR32.

**RAIL – SoC Empty**: A minimal RAIL project structure, used as a starting point for custom applications.

**RAIL Bluetooth DMP – SoC Range Test**: Range Test with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL.

**RAIL Bluetooth DMP – SoC Range Test BLE and IEEE802.15.4**: Range Test BLE and IEEE802.15.4 with Bluetooth connectivity. It runs on top of Micrium OS RTOS and multiprotocol RAIL.

**RAIL - SoC Wireless M-bus Meter**: Implements a Wireless M-Bus meter application. For details, see [Using RAIL for Wireless M-Bus Applications with EFR32](https://docs.silabs.com/rail/latest/rail-wmbus-apps-with-efr32/). Uses the multi-PHY configurator and is capable of limited multi-PHY features, like asymmetric bidirectional modes. For details, see [Proprietary Radio Configurator Guide](https://docs.silabs.com/rail/latest/proprietary-radio-configurator-guide/).

**RAIL - SoC Wireless M-bus Collector**: Implements a Wireless M-Bus collector application. For details, see [Using RAIL for Wireless M-Bus Applications with EFR32](https://docs.silabs.com/rail/latest/rail-wmbus-apps-with-efr32/). Uses the multi-PHY configurator. For details, see [Proprietary Radio Configurator Guide](https://docs.silabs.com/rail/latest/proprietary-radio-configurator-guide/)*.

###### Project Structure

Projects always include the following parts:

- **autogen** folder: Only the autogen folder includes generated code. It includes the PHY configuration (_rail_config.c_), init code, the linker script, and other generated code used by components, like the command descriptors for the CLI interface.
- **config** folder: Component configuration headers are located in this folder. These can be edited with the Simplicity IDE Component Editor, but directly editing the header file is also possible. The Component Editor is available through the Project Configurator’s **Configure** control, available only for configurable components.
- **gecko_sdk** folder (with version number): Contains source and binary files added by components.
- **files in the root folder**: Only the application specific files should be in the root folder, including source files, the project configurator (_.slcp_) file and the Pin Tool (_.pintool_) file.

![Files in the root folder](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image1.png)

All projects include _main.c_, which is not recommended to modify. Instead, add the initialization code to _app_init.c_, and implement the main loop in _app_process.c_. This way, the System components can initialize components, and call the "process" function of the components that require it. Additionally, enabling an RTOS will convert _app_process_'s main loop into an RTOS task.

These files are also available in Connect projects, and can be used for example for init and process tasks that are independent of the stack running or not. However, it is still recommended to use emberAfInitCallback() and emberAfTickCallback(), so the Connect stack could prioritize urgent stack operations above the application.

##### The Gecko Bootloader

A bootloader is a program stored in reserved flash memory that can initialize a device, update firmware images, and possibly perform some integrity checks. Silicon Labs networking devices use bootloaders that perform firmware updates in two different modes: standalone (also called standalone bootloaders) and application (also called application bootloaders). An application bootloader performs a firmware image update by reprogramming the flash with an update image stored in internal or external memory. For more information about bootloaders see [Bootloader Fundamentals](https://docs.silabs.com/mcu-bootloader/latest/bootloader-fundamentals/).

The Gecko Bootloader is a code library configurable through Simplicity Studio’s IDE to generate bootloaders that can be used with a variety of Silicon Labs protocol stacks. The bootloaders work with specialized firmware update image formats. The Gecko Bootloader update images has the extension .gbl.

Examples provided for the EFR32 parts include Silicon Labs Gecko Bootloader examples. Examples are provided for all compatible Simplicity Studio SDKs. For more information on using the Gecko Bootloader see _UG266: Silicon Labs Gecko Bootloader User’s Guide in GSDK 3.2 and Lower_ and [Silicon Labs Gecko Bootloader User's Guide for GSDK 4.0 and Higher](https://docs.silabs.com/mcu-bootloader/latest/bootloader-user-guide-gsdk-4/).

> **Note**: When working with the Gecko Bootloader, you must use Simplicity Commander to enable some configuration options such as security features.

##### Gecko Platform

The Gecko Platform is a set of drivers and other lower layer features that interact directly with Silicon Labs chips and modules. Gecko Platform components include EMLIB, EMDRV, RAIL Library, NVM3, and mbedTLS. For more information about Gecko Platform, see release notes that can be found in Simplicity Studio’s Documentation tab.

##### Prerequisites

Before following the procedures in this guide you must have:

- Purchased one of the Wireless Gecko (EFR32) Portfolio Wireless Kits.
- Installed the Flex SDK. The Flex SDK is provided as part of the Gecko SDK (GSDK), the suite of Silicon Labs SDKs. To quickly get started with the GSDK, install [Simplicity Studio 5](https://www.silabs.com/simplicity), which will set up your development environment and walk you through GSDK installation. Simplicity Studio 5 includes everything needed for IoT product development with Silicon Labs devices, including a resource and project launcher, software configuration tools, full IDE with GNU toolchain, and analysis tools. Installation instructions are provided in the online [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/). Alternatively, Gecko SDK may be installed manually by downloading or cloning the latest from GitHub. See [https://github.com/SiliconLabs/gecko_sdk](https://github.com/SiliconLabs/gecko_sdk) for more information.

See the Flex SDK v3.x release notes for version restrictions and compatibility constraints for Connect and RAIL and these components.

Simplicity Commander is installed along with Simplicity Studio. An application with limited functionality can be accessed through Simplicity Studio’s Tools menu. Most functions are accessible through a CLI invoked by opening a command prompt in the Simplicity Commander directory. See [Simplicity Commander Reference Guide](https://docs.silabs.com/simplicity-commander/latest/simplicity-commander-start/) for more information.

- (optional) Installed IAR Embedded Workbench for ARM (IAR EWARM). See the Release Notes for the IAR version supported by this version of the Flex SDK. This can be used as a compiler in the Simplicity Studio development environment as an alternative to GCC (The GNU Compiler Collection), which is provided with Simplicity Studio. Download the supported version from the Silicon Labs Support Portal, as described below. Refer to the “QuickStart Installation Information” section of the IAR installer for additional information about the installation process and how to configure your license.

To get a 30-day evaluation license for IAR:

- Go to the Silicon Labs support portal at [https://www.silabs.com/support](https://www.silabs.com/support).
- Scroll down to  the bottom of the page, and click **Contact Support**
- If you are not already signed in, sign in.
- Click the Software Releases tab. In the View list select **Development Tools**. Click **Go**. In the results is a link to the IAR-EWARM version named in the release notes.
- Download the IAR package (takes approximately 1 hour).
- Install IAR.
- In the IAR License Wizard, click **Register with IAR Systems to get an evaluation license**.
- Complete the registration and IAR will provide a 30-day evaluation license.
- Once IAR-EWARM is installed, the next time Simplicity Studio starts it will automatically detect and configure the IDE to use IAR-EWARM.

##### Technical Support

You can access the Silicon Labs support portal at [https://www.silabs.com/support](https://www.silabs.com/support)  through Simplicity Studio 5’s Welcome view under Learn and Support. Use the support portal to contact Customer Support for any technical questions you might have during the development process.

![Contact customer support](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image2.png)

##### Documentation

Hardware-specific documentation may be accessed through links on the part OVERVIEW tab in Simplicity Studio 5.

![Hardware-specific documentation](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image3.png)

SDK documentation and other references are available through the Documentation tab.

![SDK documentation and other references](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image4.png)

#### Getting Started with Simplicity Studio 5 and the Proprietary Flex SDK

Simplicity Studio 5 (SSv5) is a free Eclipse-based Integrated Development Environment (IDE) and a collection of value-add tools provided by Silicon Labs. Developers can use SSv5 to develop, debug and analyze their Flex and other Silicon Labs SDK-based applications. Its main goal is to reduce development time so that you can focus on your application instead of researching the hardware reference manuals.

The online [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/) provides both a summary overview of SSv5 functions and how to use it with Flex SDK, as well as detailed references to the various SSv5 tools and perspectives.

This guide assumes that you have downloaded SSv5 and the Gecko SDK, which includes the Flex SDK, and are familiar with the features of the SSv5 Launcher perspective.

You should have your mainboard connected.

> **Note**: For best performance in Simplicity Studio 5, be sure that the power switch on your mainboard is in the Advanced Energy Monitoring or “AEM” position, as shown in the following figure.

![Power switch on your mainboard](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image5.png)

#### Working with Example Applications

This section offers instructions on working with RAIL and Connect SoC examples.

Simplicity Studio offers a variety of ways to begin a project using an example application. The [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/) describes them all. This guide uses the File > New > Silicon Labs Project Wizard method, because it takes you through all three of the Project Creation Dialogs.

Regardless of how you begin, when working with example applications in Simplicity Studio, you will execute the following steps:

- Select an example application and create a project
- Modify and generate radio configuration.
- Modify code if necessary
- Compile and flash the application to the radio board.

These steps are described in the following sections. Note: Your SDK version may be later than the version shown in the procedure illustrations.

##### Creating a Project Based on an Example

1. Open SSv5’s File menu and select **New > Silicon Labs Project Wizard**. The Target, SDK, and Toolchain Selection dialog opens. If you want to change the toolchain from the default GCC to IAR, do so here. Click **NEXT**.  
   ![Change the toolchain](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image6.png)
2. The Example Project Selection dialog opens. A variety of filters are available to help you find a specific example, such as ‘railt’ and Technology Type: Proprietary in the following figure. Select the example, in this case **RAIL – SoC RAILtest**. Select it and click **NEXT**.  
   ![Find a specific example](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image7.png)
3. The Project Configuration dialog opens. Here you can rename your project, change the default project file location, and determine if you will link to or copy project files. Note that if you change any linked resource, it is changed for any other project that references it. Click **FINISH** and project generation will start.  
   ![Change any linked resource](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image8.png)
4. The new project opens in the Simplicity IDE Perspective with the Radio Configurator tab (_radio_settings.radioconf_) selected. The Project Configurator tab (_<projectname>.slcp_) and a description of the project (_readme.md_) are also available.  
   ![The new project opens in the Simplicity IDE Perspective with the Radio Configurator tab](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image9.png)

##### Component Configuration

Click the <projectname>.slcp tab to open the Project Configurator. The default configuration settings will work on the connected development board so, when first experimenting with a development kit, keeping them unchanged and going straight to compiling and flashing is recommended.

![Open the Project Configurator](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image10.png)

Flex SDK v3.x projects incorporate a Gecko Platform component-based architecture. Software features and functions can be installed and configured through the Component Library. The installation process will:

1. Copy the corresponding SDK files from the SDK folder into the project folder.
2. Copy all the dependencies of the given component into the project folder.
3. Add new include directories to the project settings.
4. Copy the configurations files into the _/config_ folder.
5. Modify the corresponding auto-generated files to integrate the component into the application.

Additionally, “init” type software components will implement the initialization code for a given component, utilizing their corresponding configuration file as input.

Some software components (like Parent support) will fully integrate into the application to perform a specific task without the need of any additional code, while other components provide an API to be used in the application.

To see the component library, go to the SOFTWARE COMPONENTS tab.

![Go to the SOFTWARE COMPONENTS tab](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image11.png)

The project is configured by installing and uninstalling components, and configuring installed components. Installed components are checked. Configurable components have a gear symbol. Select a component to see information about it. A number of filters as well as a keyword search are available to help you explore the various component categories. Note that components for all installed SDKs are presented. See the online _Simplicity Studio 5 User’s Guide_ for details about the functionality available through the Simplicity IDE perspective and the Project Configurator.

If the component is configurable, click **CONFIGURE** to open the Component Editor.

![Open the Component Editor](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image12.png)

Any changes you make in the Component Editor are autosaved.

![Autosaved](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image13.png)

As you install and otherwise make changes in the Project Configurator, project files are autogenerated. Progress is shown in the lower right corner of the Simplicity IDE perspective.

![Progress](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image33.png)

##### Radio Configuration

If the _radio_settings.radioconf_ tab is not present, click the Project Configurator CONFIGURATION TOOLS tab. Click **Open** next to the Radio Configurator. It will open the _radio_settings.radioconf_ file of the **/config/rai**l folder in the Radio Configurator.

![Open config file](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image15.png)

Select a radio profile, and a pre-defined radio PHY of the selected profile. You can then customize the PHY by turning on **Customized**. Changes made in the Radio Configurator are not autosaved. When saving the changes to _radio_settings.radioconf_, the radio configuration will be autogenerated and saved in the _/autogen/rail_config.h_ and _/autogen/rail_config.c_ files. See [Proprietary Radio Configurator Guide](https://docs.silabs.com/rail/latest/proprietary-radio-configurator-guide/) for more information on using the Radio Configurator.

![Customize the PHY](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image16.png)

##### Pin Tool

On the CONFIGURATION TOOLS tab, click **Open** next to Pin Tool. This will open the file _<project>.pintool_ of the project in the Pin Tool, which allows you to easily configure new peripherals or change the properties of existing ones. You can also double-click the file _<project>.pintool_ in the Project Explorer view to open it.

![Configure new peripherals or change the properties of existing ones](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image17.png)

Double-click a Software Component to open the Component Editor and configure that function. Pin Tool does not autosave.

##### Compiling and Flashing the Application

You can either compile and flash the application automatically, or manually compile it and then flash it.

###### Automatically Compile and Flash

You can automatically compile and flash the application to your connected development hardware in the Simplicity IDE. Click the **Debug** control.

![Automatically compile and flash the application](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image18.png)

Progress is displayed in the console and a progress bar in the lower right.

![Progress](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image19.png)

When building and flashing are complete, a Debug perspective is displayed. Click the **Resume** control to start the application running on the device.

![Start the application running on the device](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image20.png)

Next to the **Resume** control are **Suspend**, **Disconnect**, **Reconnect**, and **stepping** controls. Click **Disconnect** when you are ready to exit Debug mode.

![Exit Debug mode](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image21.png)

###### Manually Compile and Flash

After you generate the project files, instead of clicking **Debug** in the Simplicity IDE, click the **Build** control (hammer icon) in the top tool bar.

The sample application will compile based on its build configuration. You can change the build configuration at any time by right-clicking the project directory in Project Explorer view and opening **Build Configurations > Set Active**.

You can also build your application directly in IAR-EWARM by opening IAR-EWARM and opening the generated project file inside IAR. To generate the file for IAR EWARM, go to the OVERVIEW tab of the Project Configurator, scroll down, and click **Change Target/SDK/Generators** on the Target and Tool Settings card, drop down the list under CHANGE PROJECT GENERATORES, and include IAR EMBEDDED WORKBENCH PROJECT. The .eww file is created after you save the change.

![Build your application](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image22.png)

1. Open IAR-EWARM.
2. Select **File > Open > Workspace** and navigate to the location you selected for your sample application.
3. Select the application _.eww_ file and click **Open**.
4. Select **Project > Make** or press F7. If the application builds without errors, you are ready to install the image on a device.

You can load the binary image through Project Explorer view. Locate the <project>.bin, .hex, or .s37 file in the **Binaries** subdirectory.

![Load the binary image](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image23.png)

Right-click the file and select **Flash Programmer**. The Flash Programmer opens with the file path populated. Click **Program.**

![The flash programmer](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image24.png)

##### Interacting with Examples

Depending on the example application, you may be able to interact with it through buttons, LEDs and the LCD of the mainboard and through your development environment’s Console interface using a CLI (command line interpreter).

To launch the Console interface, in the Simplicity IDE perspective right-click on the debug adapter in the Debug Adapters view. Choose **Launch Console**. Alternatively, from the Tools icon in the Simplicity IDE toolbar, or on the COMPATIBLE TOOLS tab in the Launcher perspective, select **Device Console**. Select the Serial 1 tab and click Enter to get a prompt from the sample app CLI.

![Launch the Console interface](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image25.png)

In the RAILtest application the console interface allows testing of any RAIL feature. Enter “help” to get a list of the available CLI commands.

For a simple radio functionality test flash the same RAILtest binary on two radio boards and open a console for each of them. Make sure an antenna is connected to each radio board if applicable. RAILtest starts in RX state on both boards.

Type tx 1 in the first console window. The first radio node will transmit one packet and then return to RX state. A received packet will be reported in the second console window by the second radio node.

Type tx 1 in the second console window. The second radio node will transmit one packet and then return to RX state. A received packet will be reported in the first console window by the first radio node.

The following figure shows the consoles at the end of the procedure.

![Shows the consoles](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image26.png)

##### Working with Custom Boards

When working with custom boards, two methods are available, depending on your needs:

- Create an example on the mainboard, then remove the mainboard on the Project Configurator OVERVIEW tab using the **Change Target/SDK** control. This way, the wiring of the kit is kept, but you can change it using the Pin Tool.
- Create an example with just the part, no mainboard, and set up the wiring for all required peripherals of the example (like buttons or pins) using the Pin Tool.

Note that a mainboard can also depend on components (typically peripheral init components) that are removed if you remove the mainboard from the project.

#### Next Steps

##### Multi-Node Energy Profiler

Multi-Node Energy profiler is an add-on tool, with which you can measure the energy consumption of your device in runtime. You can easily find peak and average consumption, and check for sleep mode current.

To profile the current project, drop down the Profile as menu in the Simplicity IDE perspective and select **Profile as / Simplicity Energy Profiler target**. This automatically builds your project, uploads it to the device, and starts Energy Profiler. A new Energy Profiler perspective appears, shown in the following figure.

![Profile the current project](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image27.png)

See _UG343: Multi-Node Energy Profiler User’s Guide_ for details on how to use this tool. You can switch easily between Simplicity IDE and Energy Profiler perspectives using the Perspective buttons in the upper right corner of your current perspective.

![Switch between Simplicity IDE and Energy Profiler perspectives](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image28.png)

You can see peaks in the energy consumption diagram. Pause profiling by clicking the green Play button, click one of the peaks, and zoom in with time axis (y-axis) zoom until you see sufficient details. These usually represent packet transmissions . You can also see the  corresponding Tx events in the Rx/Tx bar below, provided that you enabled Rx/Tx view in the upper right corner. Note that the maximum consumption may now be greater than it appeared on the diagram before you zoomed in. This is because in zoomed-out mode, the displayed values are averaged. If you need exact values, always zoom in. To measure average consumption, click and drag your mouse over a time interval. A new window appears in the upper right corner showing consumption information for the given interval.. Overall average is measured as well, but this is influenced by transient events.

![Zooming into Energy Peaks](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image29.png)

Multi-node Energy Profiler is also able to simultaneously measure the consumption of multiple devices. To start measuring a new device click the Quick Access menu (upper left corner) and select **Start Energy Capture**. To stop measuring, click the Quick Access menu, and select **End/Save session**.

![Start measuring a new device](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image30.png)

To learn more about how to use this tool, see _UG343: Multi-Node Energy Profiler User’s Guide_.

##### Network Analyzer

Silicon Labs Network Analyzer is a packet capture and debugging tool that can be used to debug connectivity between Wireless Geckos and other devices. It significantly accelerates the network and application development process with graphical views of network traffic, activity, and duration.

The Packet Trace application captures the packets directly from the Packet Trace Interface (PTI) available on the Wireless Gecko SoCs and modules. It therefore provides a more accurate capture of the packets compared to air-based capture.

![Connect Traffic Capture with Packet Trace](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image31.png)

##### Simplicity Commander

Simplicity Commander is a simple flashing tool, which can be used to flash firmware images, erase flash, lock and unlock debug access, and write-protect flash pages via the J-Link interface. Both GUI and CLI (Command Line Interface) are available. See [Simplicity Commander Reference Guide](https://docs.silabs.com/simplicity-commander/latest/simplicity-commander-start/) for more information.

![Simplicity Commander](/proprietary-flex-sdk-v3x-quick-start-guide/0.1/images/sld796-image32.png)

### EFR32 Migration Guide for Proprietary Applications

#### EFR32 Migration Guide for Proprietary Applications

**This section replaces _AN1244: EFR32 Migration Guide for Proprietary Applications_. Further updates to this application note will be provided here.**

This application note presents a high-level collection of elements that differentiate Wireless MCU EFR32 generations from each other, as well as more detailed descriptions of features exclusive to the newest EFR32 generations. This information is designed to support those considering migrating proprietary applications from one EFR32 generation to another.

Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

##### Introduction

This application note uses the following terms to classify devices in accordance with the EFR32 device datasheets:

- Device Configuration: EFR32xG1, EFR32xGx1, EFR32xGx2, EFR32xGx3, EFR32xGx4, and EFR32xGx5 devices
- Series: EFR32xG1x (including EFR32xG1 devices) and EFR32xG2x devices
- Device Family: EFR32MGxx, EFR32BGxx, EFR32FGxx, and EFR32ZGxx devices

Device generations are defined as the combinations of the device configuration and series. The complete list of EFR32 device generations is: EFR32xG1, EFR32xG12, EFR32xG13, EFR32xG14, EFR32xG21, EFR32xG22, EFR32xG23, EFR32xG24, and EFR32xG25.

For more information on the existing combinations of EFR32 generations and families, visit [silabs.com](https://www.silabs.com/).

This application note discusses differences among the Series 1 and Series 2 EFR32 Wireless MCU generations that are relevant to proprietary wireless applications. "Proprietary" refers to applications based on RAIL (Radio Abstraction Interface Layer) or Connect, and typically implementing a **custom** radio configuration not defined by any wireless protocol standard. The target audience for this perspective consists of developers who are migrating existing EFR32 proprietary wireless applications to alternative EFR32 devices. This insight is also of interest to developers of new EFR32 proprietary solutions. However, this document is not intended to guide the migration of existing proprietary applications from non-EFR32 Silicon Labs wireless devices (EZRadioPRO, Si10xx, EZR32xG, and so on).

For developers migrating from EFR32 Series 1 to Series 2, [AN918.2: Series 1 to Wireless Gecko Series 2 Compatibility and Migration Guide](https://www.silabs.com/documents/public/application-notes/an0918.2-efm32-to-efr32xg2x-migration-guide.pdf) offers essential and extensive guidance for this endeavor from a platform perspective. Proprietary wireless applications (on any EFR32 device) additionally rely on RAIL or Connect as well as the Radio Configurator (a tool within Simplicity Studio) to manage and initially configure the integrated radio transceiver.

At a high level, RAIL and the Radio Configurator abstract away most differences that exist between EFR32 devices. The Connect stack and application framework leverage RAIL implicitly, and as such also benefit from (and further extend) abstraction to the application from most variation across potential target EFR32 devices. However, some device capabilities vary enough - or some features are unique enough - that they cannot simply be normalized "under the hood" of RAIL and/or the Radio Configurator. In these cases, customers must consider the impact of these generation-specific differences when planning a migration path for EFR32 proprietary wireless applications. Often, these distinguishing characteristics may in fact be enhancements that invite the porting of existing proprietary applications to new, more capable, EFR32 devices. More information on these differences relevant to proprietary wireless applications is presented in the following sections:

- [Minor Differences between EFR32 Generations](02-minor-differences-between-efr32-generations)
- [RF Sense on EFR32xG22](03-rf-sense-on-efr32xg22)
- [EM1P](04-em1p-on-efr32xg22)

> **Note**: This application note focuses on device-specific variations and where to find information on how RAIL accommodates them. As stated above, Connect abstracts most of these differences away. In the few cases where it is appropriate, they will be highlighted in this document.

#### Minor Differences between EFR32 Generations

This section presents a brief collection of generation-specific EFR32 differences that can impact proprietary wireless applications. Specific references for further reading are provided in each section. For more detailed information, see the [RAIL API Reference](/rail/3.1.0/rail-api) as well as the reference manual and datasheet for your device.

##### RAIL (Radio) Configuration Compatibility

RAIL configures the radio on EFR32 devices with a desired PHY using one of two techniques:

- Load a static radio configuration generated for your project by the Simplicity Studio wireless application workflow.
- Load a RAIL embedded PHY using one of the protocol-specific APIs.

Static RAIL configurations are compatible across EFR32 families. All device families in a single generation share a common radio, but the static configurations are not compatible across EFR32 generations. In other words, for example, EFR32MG12 and EFR32FG12 share the same radio and therefore the same RAIL radio configuration, but a radio configuration generated for EFR32xG12 is not compatible with an EFR32xG14 device. When using the embedded PHYs, RAIL abstracts away most underlying differences, but in some cases, generation-specific limitations remain, as described in the following sections.

Connect may use the same static configuration files, hence it has the same compatibility limitations. The embedded RAIL configurations are available from Gecko SDK Suite version 3.1 onwards when using Connect.

> **Note**: Static radio configurations are not currently supported on the EFR32xG21 platform. Hence, migrating to EFR32xG21 is only currently viable for applications using the embedded PHYs.

For more information on static radio configurations, see [Radio Configuration](/rail/3.1.0/rail-api/radio-configuration), and on embedded configuration routines, see [Protocol Specific](/rail/3.1.0/rail-api/protocol-specific) in RAIL.

##### Power Amplifier (PA)

Some PAs might not be available on certain parts. For example, devices with limited TX power might not have the high-power PA, or "sub-GHz only" parts won't have 2.4 GHz PAs. Beyond these OPN-specific limitations, PA options differ by EFR32 generation as follows:

- Sub-GHz PAs are only available on EFR32xG1, xG12, xG13, xG14, and xG23 generations.
- The EFR32xG1, xG12, xG13, xG14, and xG22 generations have both low-power and high-power 2.4 GHz PAs (the number of power levels per PA varies in xG22 vs xG1x).
- EFR32xG21 devices have low-power, mid-power, and high-power 2.4GHz PAs.
- EFR32xG23 devices have either a mid-power (14 dBm) or a high-power (20 dBm) sub-GHz PA, based on the device’s OPN.
- EFR32xG24 devices have either a mid-power (10 dBm) or a high-power (19.5 dBm) 2.4 GHz PAs, based on the device’s OPN.
- EFR32xG25 devices have a high-linearity PA dedicated for OFDM modulation, and a high-efficiency PA, both operating only on sub-GHz with a maximum power of 16 dBm.

For more info on EFR32 Power Amplifier (PA) Initialization, see [EFR32](/rail/3.1.0/rail-api/efr32-main), on Power Amplifier treatment in RAIL, see [Power Amplifier](/rail/3.1.0/rail-api/pa), and on the available PAs, see the device's datasheet.

##### Antenna Switch

- EFR32xG21 has an integrated antenna switch supporting two RF paths.
- All other EFR32 devices have a single RF path, though external RF switches can be used.

For more information on antenna control in RAIL, see [Antenna Control](/rail/3.1.0/rail-api/antenna-control).

##### RAIL Time Base

- The EFR32xG1 time base tick is 2 μs.
- For all other EFR32 generations, the time base tick is 0.5 μs.

For more information about the EFR32 RAIL timebase, see [EFR32](/rail/3.1.0/rail-api/efr32-main), and about system timing in RAIL, see [System Timing](/rail/3.1.0/rail-api/system-timing).

##### Low-Frequency Timer Dependencies

RAIL does not use any low-frequency clocks by default, but LF clocks and a PRS channel are required when timer sync is enabled through `RAIL_ConfigSleep()`.

- EFR32xG1, EFR32xG12: An RTCC compare channel is required for RAIL when timer sync is used. This is channel 0 by default, but it can be customized in the application.
- All other EFR32 generations: The radio has a dedicated RTC timer for timer sync.

For more information on RAIL usage of EFR32 low-frequency clocks, see [EFR32](/rail/3.1.0/rail-api/efr32-main), and on the PRS and RTCC channel customization, see [Sleep](/rail/3.1.0/rail-api/sleep).

##### Buffer Handling

- Beginning with EFR32xG22, the RX and TX buffers must be word-aligned.

For more information on EFR32 Receive and Transmit FIFO Buffers in RAIL, see [EFR32](/rail/3.1.0/rail-api/efr32-main).

##### IEEE 802.15.4 Options

- EFR32xG1 has limited 15.4g/e support compared to newer parts:  
  - 4B CRC is not supported.  
  - Only whitened packets are supported in 15.4g mode.  
  - Enhanced ACKs are not supported.  
  - Cannot receive MultiPurpose frame types.

For more information on IEEE 802.15.4 support in RAIL, see [IEEE 802.15.4](/rail/3.1.0/rail-api/ieee802-15-4).

##### Calibrations

- EFR32xG1 performs temperature (VCO) calibration when crossing 0oC (with 5oC hysteresis).

For more information on EFR32 radio calibration support, see [EFR32](/rail/3.1.0/rail-api/efr32-main), and on radio calibrations in RAIL, see [Calibration](/rail/3.1.0/rail-api/calibration).

##### Listen Before Talk (LBT)

- EFR32xG1 always averages RSSI during Clear Channel Assessment (CCA).
- All other parts can select between RSSI averaging and peak measurement.

For more information on the relevant RAIL option, see [Transmit](/rail/3.1.0/rail-api/transmit) in the online RAIL documentation.

##### DMP Transition Time

In a Dynamic Multiprotocol (DMP) application, the time required for the radio to switch protocols varies as follows:

- Series 1 devices use 430 μs transition time by default.
- Series 2 devices use 510 μs transition time by default except EFR32xG21, which uses 500 μs.

For more information on understanding the protocol switch time, see [RAIL Multiprotocol](/rail/3.1.0/rail-api/rail-multiprotocol).

##### Direct Mode

TX and RX Direct Modes are available for 2-level modulations on most EFR32 Wireless MCU devices, except on EFR32xG21 and EFR32xG22.

- EFR32xG23 introduces direct to buffer mode.
- EFR32 Series 1 devices have better sensitivity results in packet mode compared to the direct mode when OOK modulation is used.

##### Wi-SUN Capabilities

EFR32xG25 devices are the first EFR32 Wireless MCU devices that support OFDM PHYs defined by the Wi-SUN FAN 1.1 standard, and SUN-OQPSK (also known as MR-OQPSK) defined by IEEE 802.15.4. The transceiver has a software-defined modem running on RISC-V architecture supporting OFDM modulation.

The Wi-SUN FAN 1.0 is supported by EFR32xG25, EFR32xG12, and EFR32xG23 device generations. However, only EFR32FG25 and EFR32MG12 support the Wi-SUN stack provided by Silicon Laboratories.

The radio has a dedicated Power Amplifier module optimized for Wi-SUN OFDM.

> **Note**: Concurrent listening on EFR32xG25 devices for FSK and OFDM signals is supported, but once a signal is detected, only one can be demodulated.

##### RFFPLL on EFR32xG25

EFR32xG25 device generation introduces a new clock source module called Radio Frequency Friendly Phase Locked Loop (RFFPLL). RFFPLL generates a roughly 100 MHz clock from the XO frequency which is then used for driving the radio to avoid clock spurs in the RF chain. The actual configuration depends on the radio frequency band and the XO frequency.

RFFPLL settings are controlled via the Device Init: RFFPLL component, and can be set via the `CMU_RFFPLLInit()` API. RFFPLL must be configured during the initialization and cannot be changed at runtime. When creating a radio PHY, the RFFPLL band selection (**RF Frequency Planning** field) and the HFXO frequency must match the configuration applied via the platform code. If a PHY is assuming a certain RFFPLL band but the RFFPLL is configured differently, a RAIL assert error will be generated.

> **Note**: RFFPLL can be optionally used as the system clock.

#### RF Sense on EFR32xG22

RF Sense is a low-power feature available on EFR32 Wireless MCU devices, except on EFR32xG23. With it, the radio can sense the presence of RF energy and "wake up" an MCU from EM2 (or any other) power mode. In practice, RF Sense provides an ultra-low power interrupt source that runs on the ULFRCO clock.

Since the RFSENSE block implements a wide band circuit, it can detect energy in a broad frequency range between 100MHz and 5GHz - filtered only by the matching network of the RF front end. On one hand this is an advantage, as there is no need for additional PCB components to support the feature. However, there is a drawback: the wake-on-RF capability is responsive to any unfiltered interferer signals.

EFR32xG22 devices include an enhanced RF Sense module, which improves performance as compared to the EFR32 Series 1 implementation in multiple ways:

- RF Sense works below 0oC.
- RF Sense works even when voltage is scaled down.
- In addition to legacy behavior, the EFR32xG22 introduces "Selective Mode" RF Sense.

##### Legacy Mode

In Legacy (Energy Detection) mode, EFR32xG22 RF Sense is fully compatible with the feature in Series 1 devices. This means that if the RF Sense module detects energy for a configured duration, it generates an interrupt.

##### Selective Mode

Selective mode mitigates the unfiltered nature of RF Sense. Instead of simply detecting energy for a given time period, it detects "a pattern of energy" - which is essentially an On-Off Keying (OOK) packet. The packet is Manchester-coded and uses a fixed 1 kbps bitrate, 1 B preamble, and 1-4 B sync word (no payload is added, see additional details below). This packet can be transmitted by any 2.4 GHz OOK-capable device, including most EFR32 wireless MCUs.

###### Setting Up Selective RF Sense

Selective RF Sense can be started with the API `RAIL_StartSelectiveOokRfSense()` instead of the legacy `RAIL_StartRfSense()`. The API takes a `config` parameter of type `RAIL_RfSenseSelectiveOokConfig_t` that sets up the desired RFSENSE Selective mode sync word configuration. After this function is called, the interrupt is enabled and the device can enter sleep mode.

On the transmit side, calling `RAIL_ConfigRfSenseSelectiveOokWakeupPhy()` switches the radio config to the special wakeup PHY. Next, configure the wakeup packet using `RAIL_SetRfSenseSelectiveOokWakeupPayload()` so that it matches the configuration on the RX side. Finally, use `RAIL_StartTx()` (or any other TX API) to send the wakeup packet. See [Selective Mode Transmit Example Without Using API](#selective-mode-transmit-example-without-using-api) for an illustration.

Selective RF Sense (RX and TX) can be performed in RAILtest as well, see [RAILtest User’s Guide](/rail/3.1.0/railtest-users-guide) for details.

> **Note**: On EFR32xG21 devices, you cannot transmit the Wakeup Packet due to the lack of OOK support.

###### The Wakeup Packet

The wakeup packet is a fixed-configuration OOK packet with the following settings:

- Starts with a 1 B preamble (always 0x55).
- Followed by a 1-4 B sync word.
- No payload required.
- Both the preamble and sync word are transmitted LSB first.
- 1 kcps chiprate (Manchester coded)/500 bps bitrate (useful data rate).
- Recommended carrier is 2.45 GHz (EFR32 radios use this frequency).

###### Selective Mode Transmit Example Without Using API

Assume you select `0xb16e` as your sync word, and you want to transmit it with only a signal generator (or a simple radio with MSB-first byte handling and no Manchester coder).

First, flip the endianness of both preamble and sync word: `0x55` becomes `0xaa` and `0xb16e` becomes `0x768d`.

The full packet is then `0xaa768d`, which after Manchester coding becomes `0x99996a6995a6`.

Configuring this encoded packet and transmitting on 2.45 GHz with high enough TX power should wake up a device configured for selective RF Sense with the `0xb16e` sync word.

#### EM1P

Beyond the energy modes available on prior devices, EFR32xG22 introduces **EM1P**, a new method to reduce energy consumption while using the radio. In this (intermediate) mode, the HF crystal oscillator (HFXO) is kept running (and the radio remains active) if the following conditions are met:

- The radio state is anything other than idle (for example RX or TX), and
- Power Manager or the application software requests to enter EM2.

This sequence puts the Cortex-M33 into sleep mode, and clocks to the core, and all high-speed peripherals are disabled (peripherals and oscillators capable of EM2, EM3, or EM4 operation remain available).

On earlier EFR32 devices, entering EM2 mode would unconditionally shut down the radio, regardless of the operation in progress. Doing so during certain radio activities would potentially incur undesirable side effects (for example, FIFO corruption).

##### Comparison of EM1P and Other Energy Modes

EM1P is not technically a standalone energy mode (like EM1, EM2, and so on). Rather, it is an operating condition where most of the EFR32 enters EM2 Deep Sleep, but the radio (and its requisite HFXO clock source) are retained. As such, EM1P can be (perhaps confusingly) viewed as "EM2 with Radio".

This combination results in lower current consumption than EM1 mode, and higher consumption than full EM2. The following table depicts some observations of these influences on energy usage taken on a single device. Current consumption was measured initially at EM0, when the radio was idle and in RX. After transitioning into EM1/EM2, current was again measured. The cell in the bottom-right corner represents the EM1P measurement result (radio was in RX, device then transitioned to EM2).

|Radio State|Initial (EM0) Current|Final Energy Mode|Resulting Current|
|---|---|---|---|
|Idle|2.36 mA|EM1|1.60 mA|
|"|"|EM2|1.56 μA|
|RX|5.92 mA|EM1|5.15 mA|
|"|"|EM2|4.85 mA|

> **Note**: The values above are **not** guaranteed, and will vary across devices and scenarios due to numerous factors. They are presented here as a single illustrative example of the general performance trends among these different modes of operation. Consult your device datasheet for all definitive guidance regarding specifications and performance.

##### Scheduled Radio Operations

EM1P mode does not impact scheduled RX and scheduled TX operations, as in those cases the radio is in the idle state when the firmware enters EM2.

## RAIL Fundamentals

### RAIL Fundamentals

**NOTE: This section replaces _UG103.13: RAIL Fundamentals_. Further updates to this user guide will be provided here.**

The Silicon Labs RAIL (Radio Abstraction Interface Layer) library provides an intuitive, easily-customizable radio interface layer that supports proprietary or standards-based wireless protocols. RAIL is designed to simplify and shorten the development process. Developers no longer have to deal with hundreds of registers across multiple products, but can instead rely on a unified software API. RAIL, delivered through the Silicon Labs Flex SDK (Software Development Kit), also makes applications portable across Silicon Labs wireless products.

Silicon Labs’ _Fundamentals_ series covers topics that project managers, application designers, and developers should understand before beginning to work on an embedded networking solution using Silicon Labs chips, networking stacks such as EmberZNet PRO or Silicon Labs Bluetooth, and associated development tools. These guides can be used as a starting place for anyone needing an introduction to developing wireless networking applications, or who is new to the Silicon Labs development environment. Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

Even with the many wireless standards available, proprietary wireless is still the only option to communicate with legacy, proprietary networks. Also, using a wireless standard is always a compromise—a protocol designed for the application can be much better optimized for energy consumption, data throughput, or range.

However, the flexibility of proprietary protocols comes with a price. It is usually more difficult to develop such protocols, and they are usually incompatible with newer infrastructures. Security design is especially difficult and this must be considered when designing a proprietary protocol.

To develop a proprietary protocol, you need direct control over the radio hardware. However, a general purpose, multiprotocol capable radio, like the Wireless Gecko (EFR32™) is very complex, and would take months to understand. To shorten this process, Silicon Labs provides:

- Radio Configurator, a tool that can generate a radio configuration from a few input parameters like frequency and bitrate.
- RAIL (Radio Abstraction Interface Layer), a C library, which provides a much simpler interface to control the radio from the application code.

Silicon Labs RAIL is the lowest layer for all networking stacks developed internally by Silicon Labs, as well as by the company’s customers and third-party partners. RAIL supports a diverse set of radio configurations and functionality and is one of the key underlying technologies of Silicon Labs wireless products.

To make software portability as simple as possible, RAIL was developed with the following goals:

- RAIL API should be backward compatible within major versions. A code developed for RAIL 2.0 should run with the newest version of the RAIL 2.x release cycle.
- RAIL API should be compatible between supported parts as much as possible. Although there are a few APIs that are not available on all parts, general usage—like receive, transmit and state transitions —should be the same.

### RAIL Overview

The RAIL library itself is delivered through the Gecko SDK Suite, but the supporting tools and example applications are also part of the Flex SDK. In the Flex SDK developers can develop protocols that work directly with RAIL, or configure applications based on the Silicon Labs Connect stack. The Silicon Lab Connect stack provides a fully-featured, easily-customizable wireless networking solution optimized for devices that require low power consumption and are used in a simple network topology. For more information, see [Silicon Labs Connect Fundamentals](https://docs.silabs.com/connect/latest/connect-fundamentals/).

RAIL components in the Flex SDK are:

- The RAIL library: Provides a programming interface to radio functionality, as shown in the following figure.
- The Radio Configurator: Part of Simplicity Studio, a calculator and interface that allows developers to configure static parameters of the radio physical layer. For details, see _AN971: EFR32 Radio Configurator Guide for RAIL in Simplicity Studio v4_ or [EFR32 Radio Configurator Guide for Simplicity Studio v5](https://docs.silabs.com/connect-stack/latest/connect-v3x-low-power-networks/).
- RAILtest, a sample application that includes a serial command for each RAIL library feature, to allow scripted testing and ad hoc experimentation. RAILtest can be built with any PHY, including 802.15.4 and Bluetooth Smart. Many of the RAILtest serial commands can be used for lab evaluation. RAILTest is also a good starting point for testing various RAIL features and can be used as a reference implementation of many APIs.
- Other example applications: Can be used as is for evaluation and also serve as a starting point for application development.
- Documentation, delivered through Simplicity Studio.
- Components built on top of RAIL, that provide basic functionality, like initialization, transmit or receive.

For more information about using the example applications in the Flex SDK to begin development with RAIL, see _QSG138: Proprietary Flex SDK v2.x Quick Start Guide_ or [Proprietary Flex SDK v3.x Quick Start Guide](/rail/3.1.0/proprietary-flex-sdk-v3x-quick-start-guide).

Although the RAIL library supports the complete EFR32 portfolio, the radio configurator and the Flex SDK examples are only available on EFR32FG devices and other EFR devices with Proprietary support. Check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported.

![RAIL-based Stack Structure](/rail-fundamentals/0.2/images/rail-based-stack-structure.png)

### RAIL Library

RAIL functionality is delivered as a library that is linked to the developer’s application. The RAIL library implements the core features and runtime APIs needed to configure and control the radio.

The RAIL library works by taking intuitive and easy-to-use commands from the RAIL API and translating them into register-level code used to control radio and communications functions. The API commands remain constant across ICs. The changes in the underlying code are transparent to the developer or system tester. This also allows developers to create multiple stacks for different products quickly, as they are always presented with a similar software radio interface. RAIL provides the foundation upon which developers can implement their own MAC layer and network layer functionality.

Where possible, all features currently implemented for the EFR32 will be implemented for future ICs, allowing for easy migration of all RAIL-based applications. The main differences between EFR32 generations are highlighted in [EFR32 Migration Guide for Proprietary Applications](/rail/3.1.0/efr32-migration-guide-for-proprietary-apps).

The RAIL API is built up from commands and events. Commands can be used to initiate something from the software, while events are generated by the hardware (usually from an interrupt) to let the software know of something, like a received frame.

RAIL is built to support multiple protocol stacks at the same time. The Silicon Labs Dynamic Multiprotocol solution is implemented with the Radio Scheduler, a preemptive, priority scheduler, which can schedule the radio hardware between protocols. The API is the same for single-protocol and multiprotocol RAIL, but multiprotocol RAIL applications should be implemented somewhat differently. See the [Dynamic Multiprotocol User’s Guide](https://docs.silabs.com/connect/latest/multiprotocol-dynamic-ug/) for more information.

The library supports GCC and IAR compilers for ARM.

### RAIL Features

RAIL includes the following features in software, as well as many others. This table reflects the most recent version of RAIL. If you are interested in when a particular feature became available, see the RAIL changelog.

|RAIL Highlights|Description|
|---|---|
|Simple Transmit and Receive|Both transmit and receive can be started with a single API. Finished transmission and received packets are signaled with RAIL events.|
|Automatic State Transitions|Configurable transitions to go from one state to the next based on successful or unsuccessful transmit and receive operations. These support an optional delay as well to allow for consistent timings from one state to the next.|
|Frame Buffering|Two configurable size frame buffers—one for receive and one for transmit—are available. Both can hold multiple frames.|
|Timekeeping, Timestamping, and Timers|RAIL automatically maintains a RAIL timebase with µsec granularity. It can be used for:|
|"|Timestamping packets (enabled by default) at different packet positions|
|"|Scheduling receive and transmit operations|
|"|One general purpose timer with optional timer virtualization in RAIL (called MultiTimer)|
|"|Optional synchronization with RTC, to keep time and make scheduling possible from EM2 sleep mode|
|Scheduled Transmit|Transmit at an absolute or relative time in the future.|
|Scheduled  Receive|Start receiving at an absolute or relative time in the future with an optional timeout after that start time.|
|CCA (Clear Channel Assessment) with Retransmission|Supports two common medium access methodologies, which delays transmission until the channel is clear:|
|"|CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance) -- based on IEEE 802.15.4 specification.|
|"|LBT (Listen Before Talk) -- based on ETSI EN 300 220-1 specification.|
|RSSI (Received Signal Strength Indicator) Read|Ability to read instantaneous and average RSSI values from hardware. RSSI and Link Quality Indicator (LQI) measurements for each received frame is also available.|
|Address Filtering|Two address fields are supported (with fixed location), both maximum four bytes long. Each field can filter for four addresses (for example, unicast and broadcast address). Addresses can be enabled and configured at runtime. For IEEE 802.15.4, this is handled specially, since it uses addresses with the location configured with the frame type.|
|Auto ACK|Automatic transmission of a response packet after some delay to every successful receive. This can be a constant payload or dynamically loaded by the user any time before the transmission is supposed to begin.  For IEEE 802.15.4 this is handled automatically to improve performance.|
|IEEE 802.15.4 Helper Features|These features include:|
|"|Address filtering (supporting three short address, long address and PAN ID)|
|"|Auto ACK|
|"|Event on Data Request command to set the frame pending bit|
|"|Note: To implement IEEE 802.15.4-based protocols, Silicon Labs recommends using the Connect stack’s MAC mode, which is a full IEEE 802.15.4 MAC layer implementation. For more information, see [Architecture of the Silicon Labs Connect Stack v3.x](/connect-stack/3.1.0/architecture-of-connect-v3x).|
|Bluetooth LE and Z-Wave Helper APIs|Helpers for implementing a Bluetooth LE or Z-Wave  networking stack. These provide special modes and optimizations in hardware for these specific modes.|
|Multi-PHY Support|The PHY configuration can be changed runtime. Also, RAIL can load PHY.|
|Multiprotocol Support|Separate version of the RAIL library with a radio scheduler that can manage requests from different radio configurations on the same chip:|
|"|Supports time-slicing N different radio configurations where N >= 2.|
|"|Allows for different priority tasks from the different configurations and manages them so the highest priority is always completed.|
|"|Allows for tasks to be moved around if the timing isn't critical, for most robust network.|
|Calibration Support|Chip-specific calibrations. Commonly these include recalibrating for large temperature changes while in receive and image rejection calibration for increased sensitivity.|
|Stream Generation for RF Testing|RAIL can generate Continuous Wave and PN9 pseudo-random modulated streams with any PHY for RF testing.|
|Receive Antenna Diversity|Allows toggling between two antennas in receive mode and selecting the one with the stronger signal to improve sensitivity. Note that this is only supported on certain chips and PHY configurations.|
|RAIL API to Get Entropy from Radio|Radio can be used to collect entropy from receive chain noise.|
|Power Manager Support|When enabled, notifies the power manager component when the radio is on to prevent Energy Mode 2 (EM2) sleep.|

### Major Updates to RAIL

RAIL 2.x added many new features, including Dynamic Multiprotocol, and provided a cleaner, more understandable API compared to RAIL 1.x. For more information, see [AN1113: Porting RAIL Applications to RAIL Version 2.x](https://www.silabs.com/documents/public/application-notes/an1113-porting-rail-applications-to-rail-version2.pdf).

Gecko SDK 3.x still includes RAIL 2.x so the API remains backwards-compatible. The new framework simplifies project migration and provides many more reusable components for general tasks such as initialization. However, the RAIL API itself did not change; it only added a few new features. For more information, see _AN1254: Transitioning from the v2.x to the v3.x Proprietary Flex SDK_.

### Next Steps

See _QSG138: Proprietary Flex SDK v2.x Quick Start Guide_ or [Proprietary Flex SDK v3.x Quick Start Guide](/rail/3.1.0/proprietary-flex-sdk-v3x-quick-start-guide) for instructions on how to install Simplicity Studio and get started using RAIL from the Flex SDK.

To get more familiar with software development in RAIL, see the [API documentation](https://docs.silabs.com/rail/latest/rail-api) and the Silicon Labs [RAIL tutorials](https://docs.silabs.com/rail/latest/rail-training/).

## Developer's Guide

### RAIL Developers Guide

These pages provide details for developers who wish to include RAIL functionality in their applications. The focus of these pages is the firmware development, including basic usage, optimizing for timing and/or power consumption, and debugging techniques.

Content includes:

- [**Using RAIL for IEEE 802.15.4 Applications with EFR32**](/rail/3.1.0/using-rail-for-802-15-4-applications-with-efr32): Describes using the Flex SDK for 802.15.4 development on EFR32 Wireless parts.
- [**Power Amplifier Power Conversion Functions in RAIL 2.x and Higher**](/rail/3.1.0/power-amplifier-power-conversion-functions-in-rail-v2x): Outlines how to account for the variation in output characteristics across custom boards and applications for the Silicon Labs EFR32 family of chips.
- [**Detailed Timing Test Results for RAIL (AN1392)**](https://www.silabs.com/documents/public/application-notes/an1392-rail-timing-test.pdf): Provides information about various timing measurements that may be of interest when using RAIL to develop an application.
- [**Direct Mode**](/rail/3.1.0/rail-developers-guide-direct-mode): Outlines the Rx Direct Mode feature of the EFR32 Wireless Gecko family.

### RAIL 3.0 Migration Guide

This document provides a comprehensive guide for migrating from RAIL 2.x to RAIL 3.0,
covering both API-level and feature-level changes. The guide is formatted with tabular
references similar to [AN1113: Porting RAIL Applications to RAIL Version 2.x](https://www.silabs.com/documents/public/application-notes/an1113-porting-rail-applications-to-rail-version2.pdf) for easy lookup and comparison.

#### Table of Contents

1. [Overview](#overview)
2. [API Function Name Changes](#api-function-name-changes)
3. [Type Name Changes](#type-name-changes)
4. [Consolidating Radio Configurations](#consolidating-radio-configurations)
5. [Struct Field Name Changes](#struct-field-name-changes)
6. [Enum Value Changes](#enum-value-changes)
7. [Constant Name Changes](#constant-name-changes)
8. [Header File Changes](#header-file-changes)
9. [Component Changes](#component-changes)
10. [Behavioral Changes Summary](#behavioral-changes-summary)
11. [Migration Priority Checklist](#migration-priority-checklist)
12. [Quick Reference: Common Migration Patterns](#quick-reference-common-migration-patterns)
13. [Feature-Level Changes](#feature-level-changes)
14. [Power Amplifier (PA) Migration](#power-amplifier-pa-migration)
15. [Behavioral Changes](#behavioral-changes)
16. [Migration Tips](#migration-tips)
17. [Compatibility Notes](#compatibility-notes)

---

#### Overview

RAIL 3.0 introduces significant API improvements with a consistent naming convention
(`sl_rail_` prefix), more flexible FIFO management, and better initialization control.
While the migration requires updating function and type names, the compatibility layer can
ease the transition. Key behavioral changes focus on channel configuration, FIFO management,
and scheduled receive events.

##### Key Changes Summary

- **Naming Convention**: All APIs use `sl_rail_` prefix instead of `RAIL_`
- **PA Plugin**: New plugin architecture (`sl_rail_util_pa`) - **not compatible**  
  with RAIL 2.x PA plugin `rail_util_pa`
- **PA Automode**: PA automode APIs such as `RAIL_EnablePaAutoMode()` are no longer supported in RAIL 3.0. Equivalent functionality can be  
  achieved using RAIL 3 PA tables.
- **PA APIs**: `RAIL_ConfigTxPower()` needn't be used and PA initialization is done using `sl_rail_set_tx_power_dbm()`
- **PA Power Tables**: Now supported on all platforms (previously only EFR32xG25 and SixG301)
- **Channel Configuration**: No longer auto-prepares the first channel
- **FIFO Management**: More flexible, can be configured at initialization

---

#### API Function Name Changes

##### Core RAIL Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_GetRadioState()`|`sl_rail_get_radio_state()`|`sl_rail_radio_state_t`|Same functionality|
|`RAIL_GetRadioStateDetail()`|`sl_rail_get_radio_state_detail()`|`sl_rail_radio_state_detail_t`|Same functionality|
|`RAIL_GetVersion()`|`sl_rail_get_version()`|`sl_rail_status_t`|Parameter removed: 'verbose';|
|`RAIL_Idle()`|`sl_rail_idle()`|`sl_rail_status_t`|Same functionality|
|`RAIL_Init()`|`sl_rail_init()`|`sl_rail_status_t`|Parameter order and return type changed: `sl_rail_handle_t *p_rail_handle` (output)|
|`RAIL_YieldRadio()`|`sl_rail_yield_radio()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsInitialized()`|`sl_rail_is_initialized()`|`bool`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_UseDma()`|`sl_rail_use_dma()`|`sl_rail_status_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle` (first parameter)|
|`RAIL_CopyDeviceInfo()`|`sl_rail_copy_device_info()`|`sl_rail_status_t`|Same functionality|
|`RAIL_DelayUs()`|`sl_rail_delay_us()`|`void`|Same functionality|

##### Timer Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_CancelTimer()`|`sl_rail_cancel_timer()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetTime()`|`sl_rail_get_time()`|`sl_rail_time_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_GetTimer()`|`sl_rail_get_timer()`|`sl_rail_time_t`|Same functionality|
|`RAIL_IsTimerExpired()`|`sl_rail_is_timer_expired()`|`bool`|Same functionality|
|`RAIL_IsTimerRunning()`|`sl_rail_is_timer_running()`|`bool`|Same functionality|
|`RAIL_SetTime()`|`sl_rail_set_time()`|`sl_rail_status_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle` (first parameter)|
|`RAIL_SetTimer()`|`sl_rail_set_timer()`|`sl_rail_status_t`|Same functionality|

##### MultiTimer Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_CancelMultiTimer()`|`sl_rail_cancel_multi_timer()`|`sl_rail_status_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`, return type changed from `bool`|
|`RAIL_ConfigMultiTimer()`|`sl_rail_config_multi_timer()`|`sl_rail_status_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_GetMultiTimer()`|`sl_rail_get_multi_timer()`|`sl_rail_time_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_IsMultiTimerExpired()`|`sl_rail_is_multi_timer_expired()`|`bool`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_IsMultiTimerRunning()`|`sl_rail_is_multi_timer_running()`|`bool`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_SetMultiTimer()`|`sl_rail_set_multi_timer()`|`sl_rail_status_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle` (first parameter)|

##### Transmit Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_EnableTxHoldOff()`|`sl_rail_enable_tx_hold_off()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetTxFifoThreshold()`|`sl_rail_get_tx_fifo_threshold()`|`uint16_t`|Same functionality|
|`RAIL_GetTxPacketDetailsAlt2()`|`sl_rail_get_tx_packet_details()`|`sl_rail_status_t`|Function renamed|
|`RAIL_GetTxPacketsRemaining()`|`sl_rail_get_tx_packets_remaining()`|`uint16_t`|Same functionality|
|`RAIL_GetTxTimeFrameEndAlt()`|`sl_rail_get_tx_time_frame_end()`|`sl_rail_time_t`|Function renamed|
|`RAIL_GetTxTimePreambleStartAlt()`|`sl_rail_get_tx_time_preamble_start()`|`sl_rail_time_t`|Function renamed|
|`RAIL_GetTxTimeSyncWordEndAlt()`|`sl_rail_get_tx_time_sync_word_end()`|`sl_rail_time_t`|Function renamed|
|`RAIL_IsNextCcaNow()`|`sl_rail_is_next_cca_now()`|`bool`|Same functionality|
|`RAIL_IsTxHoldOffEnabled()`|`sl_rail_is_tx_hold_off_enabled()`|`bool`|Same functionality|
|`RAIL_SetCcaThreshold()`|`sl_rail_set_cca_threshold()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetNextTxRepeat()`|`sl_rail_set_next_tx_repeat()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTxAltPreambleLength()`|`sl_rail_set_tx_alt_preamble_length()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTxFifoThreshold()`|`sl_rail_set_tx_fifo_threshold()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartCcaCsmaTx()`|`sl_rail_start_cca_csma_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartCcaLbtTx()`|`sl_rail_start_cca_lbt_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartScheduledCcaCsmaTx()`|`sl_rail_start_scheduled_cca_csma_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartScheduledCcaLbtTx()`|`sl_rail_start_scheduled_cca_lbt_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartScheduledTx()`|`sl_rail_start_scheduled_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartTx()`|`sl_rail_start_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartTxStreamAlt()`|`sl_rail_start_tx_stream()`|`sl_rail_status_t`|Stream mode transmit|
|`RAIL_StopInfinitePreambleTx()`|`sl_rail_stop_infinite_preamble_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StopTx()`|`sl_rail_stop_tx()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StopTxStream()`|`sl_rail_stop_tx_stream()`|`sl_rail_status_t`|Same functionality|

##### Receive Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigRxDutyCycle()`|`sl_rail_config_rx_duty_cycle()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConfigRxOptions()`|`sl_rail_config_rx_options()`|`sl_rail_status_t`|Same functionality|
|`RAIL_CopyRxPacket()`|`sl_rail_copy_rx_packet()`|`void`|⚠️ Parameter added: `sl_rail_handle_t rail_handle` (first parameter)|
|`RAIL_EnableRxDutyCycle()`|`sl_rail_enable_rx_duty_cycle()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetAverageRssi()`|`sl_rail_get_average_rssi()`|`int16_t`|Same functionality|
|`RAIL_GetDefaultRxDutyCycleConfig()`|`sl_rail_get_default_rx_duty_cycle_config()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRssiAlt()`|`sl_rail_get_rssi()`|`int16_t`|Function renamed|
|`RAIL_GetRssiDetectThreshold()`|`sl_rail_get_rssi_detect_threshold()`|`int16_t`|Same functionality|
|`RAIL_GetRssiOffset()`|`sl_rail_get_rssi_offset()`|`int16_t`|Same functionality|
|`RAIL_GetRxFifoThreshold()`|`sl_rail_get_rx_fifo_threshold()`|`uint16_t`|Same functionality|
|`RAIL_GetRxFreqOffset()`|`sl_rail_get_rx_freq_offset()`|`int32_t`|Same functionality|
|`RAIL_GetRxIncomingPacketInfo()`|`sl_rail_get_rx_incoming_packet_info()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRxIncomingPacketRssi()`|`sl_rail_get_rx_incoming_packet_rssi()`|`int16_t`|Same functionality|
|`RAIL_GetRxPacketDetailsAlt()`|`sl_rail_get_rx_packet_details()`|`sl_rail_status_t`|Function renamed|
|`RAIL_GetRxPacketInfo()`|`sl_rail_get_rx_packet_info()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRxTimeFrameEndAlt()`|`sl_rail_get_rx_time_frame_end()`|`sl_rail_time_t`|Function renamed|
|`RAIL_GetRxTimePreambleStartAlt()`|`sl_rail_get_rx_time_preamble_start()`|`sl_rail_time_t`|Function renamed|
|`RAIL_GetRxTimeSyncWordEndAlt()`|`sl_rail_get_rx_time_sync_word_end()`|`sl_rail_time_t`|Function renamed|
|`RAIL_HoldRxPacket()`|`sl_rail_hold_rx_packet()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsAverageRssiReady()`|`sl_rail_is_average_rssi_ready()`|`bool`|Same functionality|
|`RAIL_PeekRxPacket()`|`sl_rail_peek_rx_packet()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ReleaseRxPacket()`|`sl_rail_release_rx_packet()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ScheduleRx()`|`sl_rail_start_scheduled_rx()`|`sl_rail_status_t`|Function renamed|
|`RAIL_SetFreqOffset()`|`sl_rail_set_freq_offset()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetRssiDetectThreshold()`|`sl_rail_set_rssi_detect_threshold()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetRssiOffset()`|`sl_rail_set_rssi_offset()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetRxFifoThreshold()`|`sl_rail_set_rx_fifo_threshold()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartAverageRssi()`|`sl_rail_start_average_rssi()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartRx()`|`sl_rail_start_rx()`|`sl_rail_status_t`|Same functionality|

##### Channel Configuration Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigChannels()`|`sl_rail_config_channels()`|`sl_rail_status_t`|⚠️ **Behavior change**: Does not auto-prepare channel|
|`RAIL_ConfigChannelsAlt()`|`sl_rail_config_channels()`|`sl_rail_status_t`|Function renamed|
|`RAIL_ConfigRxChannelHopping()`|`sl_rail_config_rx_channel_hopping()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableRxChannelHopping()`|`sl_rail_enable_rx_channel_hopping()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetBitRate()`|`sl_rail_get_bit_rate()`|`uint32_t`|Same functionality|
|`RAIL_GetChannel()`|`sl_rail_get_channel()`|`uint16_t`|Same functionality|
|`RAIL_GetChannelAlt()`|`sl_rail_get_tuned_channel()`|`uint16_t`|Function renamed|
|`RAIL_GetChannelHoppingRssi()`|`sl_rail_get_channel_hopping_rssi()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetChannelMetadata()`|`sl_rail_get_channel_metadata()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetSymbolRate()`|`sl_rail_get_symbol_rate()`|`uint32_t`|Same functionality|
|`RAIL_IsValidChannel()`|`sl_rail_is_valid_channel()`|`bool`|Same functionality|
|`RAIL_PrepareChannel()`|`sl_rail_prepare_channel()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TriggerRxChannelHop()`|`sl_rail_trigger_rx_channel_hop()`|`sl_rail_status_t`|Same functionality|

##### Radio Configuration Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ChangedDcdc()`|`sl_rail_changed_dcdc()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConfigTxPower()`|`sl_rail_config_tx_power()`|`sl_rail_status_t`|Struct field names changed|
|`RAIL_GetDebugMode()`|`sl_rail_get_debug_mode()`|`sl_rail_debug_mode_t`|Same functionality|
|`RAIL_GetRadioClockFreqHz()`|`sl_rail_get_radio_clock_freq_hz()`|`uint32_t`|Same functionality|
|`RAIL_GetRadioEntropy()`|`sl_rail_get_radio_entropy()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRfPath()`|`sl_rail_get_rf_path()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetTemperature()`|`sl_rail_get_temperature()`|`int32_t`|Same functionality|
|`RAIL_GetTune()`|`sl_rail_get_tune()`|`int16_t`|Same functionality|
|`RAIL_GetTuneDelta()`|`sl_rail_get_tune_delta()`|`int16_t`|Same functionality|
|`RAIL_GetTxPowerDbm()`|`sl_rail_get_tx_power_dbm()`|`sl_rail_tx_power_t`|Same functionality|
|`RAIL_SetDebugMode()`|`sl_rail_set_debug_mode()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTune()`|`sl_rail_set_tune()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTuneDelta()`|`sl_rail_set_tune_delta()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTxPowerDbm()`|`sl_rail_set_tx_power_dbm()`|`sl_rail_status_t`|Same functionality|
|`RAIL_VerifyTxPowerCurves()`|`sl_rail_verify_tx_power_conversion()`|`sl_rail_status_t`|Function renamed|

##### FIFO Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_GetRxFifoBytesAvailable()`|`sl_rail_get_rx_fifo_bytes_available()`|`uint16_t`|Same functionality|
|`RAIL_GetTxFifoSpaceAvailable()`|`sl_rail_get_tx_fifo_space_available()`|`uint16_t`|Same functionality|
|`RAIL_ReadRxFifo()`|`sl_rail_read_rx_fifo()`|`uint16_t`|Same functionality|
|`RAIL_ResetFifo()`|`sl_rail_reset_fifo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetMfmPingPongFifo()`|`sl_rail_set_mfm_ping_pong_fifo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetRxFifo()`|`sl_rail_set_rx_fifo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTxFifo()`|`sl_rail_set_tx_fifo()`|`sl_rail_status_t`|⚠️ **Behavior change**: Allows smaller FIFOs|
|`RAIL_WriteTxFifo()`|`sl_rail_write_tx_fifo()`|`uint16_t`|Same functionality|

##### Sleep/Timer Sync Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigSleepAlt()`|`sl_rail_config_sleep()`|`sl_rail_status_t`|Function renamed|
|`RAIL_DeinitPowerManager()`|`sl_rail_deinit_power_manager()`|`sl_rail_status_t`|Same functionality|
|`RAIL_InitPowerManager()`|`sl_rail_init_power_manager()`|`sl_rail_status_t`|Same functionality|
|`RAIL_Sleep()`|`sl_rail_sleep()`|`sl_rail_status_t`|Same functionality|
|`RAIL_Wake()`|`sl_rail_wake()`|`sl_rail_status_t`|Same functionality|

##### Scheduler Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_GetSchedulerStatusAlt()`|`sl_rail_get_scheduler_status()`|`sl_rail_scheduler_status_t`|Function renamed|
|`RAIL_SetTaskPriority()`|`sl_rail_set_task_priority()`|`sl_rail_status_t`|Same functionality|

##### Calibration Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ApplyIrCalibrationAlt()`|`sl_rail_apply_ir_calibration()`|`sl_rail_status_t`|Function renamed|
|`RAIL_Calibrate()`|`sl_rail_calibrate()`|`sl_rail_status_t`|Same functionality|
|`RAIL_CalibrateHFXO()`|`sl_rail_calibrate_hfxo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_CalibrateIrAlt()`|`sl_rail_calibrate_ir()`|`sl_rail_status_t`|Function renamed|
|`RAIL_CalibrateTemp()`|`sl_rail_calibrate_temp()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConfigCal()`|`sl_rail_config_cal()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableCacheSynthCal()`|`sl_rail_enable_cache_synth_cal()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnablePaCal()`|`sl_rail_enable_pa_cal()`|`void`|⚠️ Parameter added: `sl_rail_handle_t rail_handle` (first parameter)|
|`RAIL_GetPendingCal()`|`sl_rail_get_pending_cal()`|`sl_rail_status_t`|Same functionality|

##### State Timing Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigRetimeOptions()`|`sl_rail_config_retime_options()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRetimeOptions()`|`sl_rail_get_retime_options()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetRxTransitions()`|`sl_rail_get_rx_transitions()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetTransitionTime()`|`sl_rail_get_transition_time()`|`sl_rail_time_t`|⚠️ Parameter added: `sl_rail_handle_t rail_handle`|
|`RAIL_GetTxTransitions()`|`sl_rail_get_tx_transitions()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetRxTransitions()`|`sl_rail_set_rx_transitions()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetStateTiming()`|`sl_rail_set_state_timing()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTransitionTime()`|`sl_rail_set_transition_time()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetTxTransitions()`|`sl_rail_set_tx_transitions()`|`sl_rail_status_t`|Same functionality|

##### PTI Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigPti()`|`sl_rail_config_pti()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnablePti()`|`sl_rail_enable_pti()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetPtiConfig()`|`sl_rail_get_pti_config()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetPtiProtocol()`|`sl_rail_get_pti_protocol()`|`sl_rail_protocol_t`|Same functionality|
|`RAIL_SetPtiProtocol()`|`sl_rail_set_pti_protocol()`|`sl_rail_status_t`|Same functionality|

##### Feature Query Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_Supports2p4GHzBand()`|`sl_rail_supports_2p4_ghz_band()`|`bool`|Same functionality|
|`RAIL_SupportsAddrFilterAddressBitMask()`|`sl_rail_supports_addr_filter_address_bit_mask()`|`bool`|Same functionality|
|`RAIL_SupportsAddrFilterMask()`|`sl_rail_supports_addr_filter_mask()`|`bool`|Same functionality|
|`RAIL_SupportsAlternateTxPower()`|`sl_rail_supports_alternate_tx_power()`|`bool`|Same functionality|
|`RAIL_SupportsAntennaDiversity()`|`sl_rail_supports_antenna_diversity()`|`bool`|Same functionality|
|`RAIL_SupportsAuxAdc()`|`sl_rail_supports_aux_adc()`|`bool`|Same functionality|
|`RAIL_SupportsChannelHopping()`|`sl_rail_supports_channel_hopping()`|`bool`|Same functionality|
|`RAIL_SupportsCollisionDetection()`|`sl_rail_supports_collision_detection()`|`bool`|Same functionality|
|`RAIL_SupportsDirectMode()`|`sl_rail_supports_direct_mode()`|`bool`|Same functionality|
|`RAIL_SupportsDualBand()`|`sl_rail_supports_dual_band()`|`bool`|Same functionality|
|`RAIL_SupportsDualSyncWords()`|`sl_rail_supports_dual_sync_words()`|`bool`|Same functionality|
|`RAIL_SupportsExternalThermistor()`|`sl_rail_supports_external_thermistor()`|`bool`|Same functionality|
|`RAIL_SupportsFastRx2Rx()`|`sl_rail_supports_fast_rx_to_rx()`|`bool`|Same functionality|
|`RAIL_SupportsHFXOCompensation()`|`sl_rail_supports_hfxo_compensation()`|`bool`|Same functionality|
|`RAIL_SupportsIEEE802154Band2P4()`|`sl_rail_ieee802154_supports_2p4_ghz_band()`|`bool`|Function renamed|
|`RAIL_SupportsMfm()`|`sl_rail_supports_mfm()`|`bool`|Same functionality|
|`RAIL_SupportsOFDMPA()`|`sl_rail_supports_ofdm_pa()`|`bool`|Same functionality|
|`RAIL_SupportsPathDiversity()`|`sl_rail_supports_path_diversity()`|`bool`|Same functionality|
|`RAIL_SupportsPrecisionLFRCO()`|`sl_rail_supports_precision_lfrco()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolBLE()`|`sl_rail_supports_protocol_ble()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolBTC()`|`sl_rail_supports_protocol_btc()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolIEEE802154()`|`sl_rail_supports_protocol_ieee802154()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolSidewalk()`|`sl_rail_supports_protocol_sidewalk()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolWiSUN()`|`sl_rail_supports_protocol_wi_sun()`|`bool`|Same functionality|
|`RAIL_SupportsProtocolZWave()`|`sl_rail_supports_protocol_zwave()`|`bool`|Same functionality|
|`RAIL_SupportsPrsLnaBypass()`|`sl_rail_supports_prs_lna_bypass()`|`bool`|Same functionality|
|`RAIL_SupportsRadioEntropy()`|`sl_rail_supports_radio_entropy()`|`bool`|Same functionality|
|`RAIL_SupportsRfSenseEnergyDetection()`|`sl_rail_supports_rf_sense_energy_detection()`|`bool`|Same functionality|
|`RAIL_SupportsRfSenseSelectiveOok()`|`sl_rail_supports_rf_sense_selective_ook()`|`bool`|Same functionality|
|`RAIL_SupportsRssiDetectThreshold()`|`sl_rail_supports_rssi_detect_threshold()`|`bool`|Same functionality|
|`RAIL_SupportsRxDirectModeDataToFifo()`|`sl_rail_supports_rx_direct_mode_data_to_fifo()`|`bool`|Same functionality|
|`RAIL_SupportsRxRawData()`|`sl_rail_supports_rx_raw_data()`|`bool`|Same functionality|
|`RAIL_SupportsSQPhy()`|`sl_rail_supports_sq_phy()`|`bool`|Same functionality|
|`RAIL_SupportsSubGHzBand()`|`sl_rail_supports_sub_ghz_band()`|`bool`|Same functionality|
|`RAIL_SupportsThermalProtection()`|`sl_rail_supports_thermal_protection()`|`bool`|Same functionality|
|`RAIL_SupportsTrustZoneSecurePeripherals()`|`sl_rail_supports_trustzone_secure_peripherals()`|`bool`|Same functionality|
|`RAIL_SupportsTxRepeatStartToStart()`|`sl_rail_supports_tx_repeat_start_to_start()`|`bool`|Same functionality|
|`RAIL_SupportsTxToTx()`|`sl_rail_supports_tx_to_tx()`|`bool`|Same functionality|
|`RAIL_SupportsUserSequencer()`|`sl_rail_supports_sequencer_user()`|`bool`|Same functionality|
|`RAIL_SupportsVdet()`|`sl_rail_supports_vdet()`|`bool`|Same functionality|

##### Address Filter Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigAddressFilter()`|`sl_rail_config_address_filter()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableAddressFilter()`|`sl_rail_enable_address_filter()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableAddressFilterAddress()`|`sl_rail_enable_address_filter_address()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsAddressFilterEnabled()`|`sl_rail_is_address_filter_enabled()`|`bool`|Same functionality|
|`RAIL_ResetAddressFilter()`|`sl_rail_reset_address_filter()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetAddressFilterAddress()`|`sl_rail_set_address_filter_address()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetAddressFilterAddressMask()`|`sl_rail_set_address_filter_address_mask()`|`sl_rail_status_t`|Same functionality|

##### Antenna Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigAntenna()`|`sl_rail_config_antenna()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnablePrsLnaBypass()`|`sl_rail_enable_prs_lna_bypass()`|`sl_rail_status_t`|Same functionality|

##### Auto Acknowledgment Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_CancelAutoAck()`|`sl_rail_cancel_auto_ack()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConfigAutoAck()`|`sl_rail_config_auto_ack()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetAutoAckFifo()`|`sl_rail_get_auto_ack_fifo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsAutoAckEnabled()`|`sl_rail_is_auto_ack_enabled()`|`bool`|Same functionality|
|`RAIL_IsAutoAckWaitingForAck()`|`sl_rail_is_auto_ack_waiting_for_ack()`|`bool`|Same functionality|
|`RAIL_IsRxAutoAckPaused()`|`sl_rail_is_rx_auto_ack_paused()`|`bool`|Same functionality|
|`RAIL_IsTxAutoAckPaused()`|`sl_rail_is_tx_auto_ack_paused()`|`bool`|Same functionality|
|`RAIL_PauseRxAutoAck()`|`sl_rail_pause_rx_auto_ack()`|`sl_rail_status_t`|Same functionality|
|`RAIL_PauseTxAutoAck()`|`sl_rail_pause_tx_auto_ack()`|`sl_rail_status_t`|Same functionality|
|`RAIL_UseTxFifoForAutoAck()`|`sl_rail_use_tx_fifo_for_auto_ack()`|`sl_rail_status_t`|Same functionality|
|`RAIL_WriteAutoAckFifo()`|`sl_rail_write_auto_ack_fifo()`|`sl_rail_status_t`|Same functionality|

##### Direct Mode Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigDirectMode()`|`sl_rail_config_direct_mode()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableDirectModeAlt()`|`sl_rail_enable_direct_mode()`|`sl_rail_status_t`|Function renamed|

##### Event Configuration Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigEvents()`|`sl_rail_config_events()`|`sl_rail_status_t`|Same functionality|

##### HFXO Compensation Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_CompensateHFXO()`|`sl_rail_compensate_hfxo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ComputeHFXOPPMError()`|`sl_railcb_compute_hfxo_error_ppm()`|`sl_rail_status_t`|Callback function|
|`RAIL_ConfigHFXOCompensation()`|`sl_rail_config_hfxo_compensation()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConfigHFXOThermistor()`|`sl_rail_config_hfxo_thermistor()`|`sl_rail_status_t`|Same functionality|
|`RAIL_ConvertThermistorImpedance()`|`sl_railcb_convert_thermistor_impedance()`|`sl_rail_status_t`|Callback function|
|`RAIL_GetHFXOCompensationConfig()`|`sl_rail_get_hfxo_compensation_config()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetThermistorImpedance()`|`sl_rail_get_thermistor_impedance()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartThermistorMeasurement()`|`sl_rail_start_thermistor_measurement()`|`sl_rail_status_t`|Same functionality|

##### Sync Word Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigSyncWords()`|`sl_rail_config_sync_words()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetSyncWords()`|`sl_rail_get_sync_words()`|`sl_rail_status_t`|Same functionality|

##### Thermal Protection Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigThermalProtection()`|`sl_rail_config_thermal_protection()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetThermalProtection()`|`sl_rail_get_thermal_protection()`|`sl_rail_status_t`|Same functionality|

##### Vdet Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigVdet()`|`sl_rail_config_vdet()`|`sl_rail_status_t`|Same functionality|
|`RAIL_EnableVdet()`|`sl_rail_enable_vdet()`|`sl_rail_status_t`|Same functionality|
|`RAIL_GetVdet()`|`sl_rail_get_vdet()`|`bool`|Same functionality|
|`RAIL_GetVdetConfig()`|`sl_rail_get_vdet_config()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsVdetEnabled()`|`sl_rail_is_vdet_enabled()`|`bool`|Same functionality|

##### RF Sense Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConfigRfSenseSelectiveOokWakeupPhy()`|`sl_rail_config_rf_sense_selective_ook_wakeup_phy()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IsRfSensed()`|`sl_rail_is_rf_sensed()`|`bool`|Same functionality|
|`RAIL_SetRfSenseSelectiveOokWakeupPayload()`|`sl_rail_set_rf_sense_selective_ook_wakeup_payload()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartRfSense()`|`sl_rail_start_rf_sense()`|`sl_rail_status_t`|Same functionality|
|`RAIL_StartSelectiveOokRfSense()`|`sl_rail_start_selective_ook_rf_sense()`|`sl_rail_status_t`|Same functionality|

##### CRC Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_GetCrcInitVal()`|`sl_rail_get_crc_init_val()`|`uint16_t`|Same functionality|
|`RAIL_ResetCrcInitVal()`|`sl_rail_reset_crc_init_val()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetCrcInitVal()`|`sl_rail_set_crc_init_val()`|`sl_rail_status_t`|Same functionality|

##### Whitening Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_GetWhiteningInitVal()`|`sl_rail_get_whitening_init_val()`|`uint16_t`|Same functionality|
|`RAIL_ResetWhiteningInitVal()`|`sl_rail_reset_whitening_init_val()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetWhiteningInitVal()`|`sl_rail_set_whitening_init_val()`|`sl_rail_status_t`|Same functionality|

##### Frame Configuration Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_IncludeFrameTypeLength()`|`sl_rail_include_frame_type_length()`|`sl_rail_status_t`|Same functionality|
|`RAIL_SetFixedLength()`|`sl_rail_set_fixed_length()`|`sl_rail_status_t`|Same functionality|

##### Conversion Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConvertLqi()`|`sl_rail_convert_lqi()`|`uint8_t`|Same functionality|

##### PA Power Conversion Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_ConvertDbmToPowerSettingEntry()`|`sl_railcb_convert_dbm_to_power_setting_entry()`|`sl_rail_status_t`|⚠️ Callback function, uses deci-dBm (parameter name: `power_ddbm`), takes `sl_rail_tx_pa_mode_t` parameter|
|_(none)_|`sl_rail_util_pa_init()`|`void`|✅ **REQUIRED** - Must be called before PA config|
|_(none)_|`sl_rail_util_pa_post_init()`|`sl_rail_status_t`|✅ **REQUIRED** - Must be called after `sl_rail_init()` if `sl_rail_util_callbacks` is not used. Takes `sl_rail_tx_pa_mode_t` parameter|
|_(none)_|`sl_rail_util_pa_init_tx_power_table()`|`sl_rail_status_t`|✅ New - Initialize Power tables|
|`sl_rail_util_pa_on_channel_config_change()`|`sl_rail_util_pa_on_channel_config_change()`|`void`|Parameter `RAIL_ChannelConfigEntry_t` type changed to `sl_rail_channel_config_entry_t`|
|`RAIL_GetPowerSettingTable()`|`sl_rail_util_pa_get_power_setting_table()`|`const sl_rail_pa_power_setting_t *`|Function renamed|
|`RAIL_GetTxPowerCurveLimits()`|`sl_rail_util_pa_get_tx_power_limits()`|`sl_rail_status_t`|Function renamed|
|`RAIL_InitTxPowerCurvesAlt()`|`sl_rail_util_pa_init_tx_power_table()`|`sl_rail_status_t`|Function renamed|

##### TrustZone Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_TZ_CheckPeripheralsSecureStates()`|`sl_rail_tz_check_peripherals_secure_states()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_ConfigAntennaGpio()`|`sl_rail_tz_config_antenna_gpio()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_ConfigureHfxo()`|`sl_rail_tz_configure_hfxo()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_DisableSecureRadioIrqs()`|`sl_rail_tz_disable_secure_radio_irqs()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_EnableSecureRadioIrqs()`|`sl_rail_tz_enable_secure_radio_irqs()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_InitNonSecure()`|`sl_rail_tz_init_non_secure()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_InitSecure()`|`sl_rail_tz_init_secure()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_RadioClockEnable()`|`sl_rail_tz_radio_clock_enable()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_RadioPerformM2mLdma()`|`sl_rail_tz_radio_perform_m2m_ldma()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_RfecaClockEnable()`|`sl_rail_tz_rfeca_clock_enable()`|`sl_rail_status_t`|Same functionality|
|`RAIL_TZ_RfecaIsClockEnabled()`|`sl_rail_tz_rfeca_is_clock_enabled()`|`bool`|Same functionality|

##### IEEE 802.15.4 Functions

|RAIL 2.x Function|RAIL 3.0 Function|Return Type|Notes|
|---|---|---|---|
|`RAIL_IEEE802154_AcceptFrames()`|`sl_rail_ieee802154_accept_frames()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_ComputeChannelFromPhyModeId()`|`sl_rail_ieee802154_compute_channel_from_phy_mode_id()`|`uint16_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadio()`|`sl_rail_ieee802154_config_2p4_ghz_radio()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioAntDiv()`|`sl_rail_ieee802154_config_2p4_ghz_radio_ant_div()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex()`|`sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioAntDivCoexFem()`|`sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioAntDivFem()`|`sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioCoex()`|`sl_rail_ieee802154_config_2p4_ghz_radio_coex()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioCoexFem()`|`sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Config2p4GHzRadioFem()`|`sl_rail_ieee802154_config_2p4_ghz_radio_fem()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigCcaMode()`|`sl_rail_ieee802154_config_cca_mode()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigEOptions()`|`sl_rail_ieee802154_config_e_options()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigGB863MHzRadio()`|`sl_rail_ieee802154_config_gb863_mhz_radio()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigGB915MHzRadio()`|`sl_rail_ieee802154_config_gb915_mhz_radio()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigGOptions()`|`sl_rail_ieee802154_config_g_options()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigRxChannelSwitching()`|`sl_rail_ieee802154_config_rx_channel_switching()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConfigSignalIdentifier()`|`sl_rail_ieee802154_config_signal_identifier()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_ConvertRssiToEd()`|`sl_rail_ieee802154_convert_rssi_to_ed()`|`int8_t`|Function renamed|
|`RAIL_IEEE802154_ConvertRssiToLqi()`|`sl_rail_ieee802154_convert_rssi_to_lqi()`|`uint8_t`|Function renamed|
|`RAIL_IEEE802154_Deinit()`|`sl_rail_ieee802154_deinit()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_EnableDataFramePending()`|`sl_rail_ieee802154_enable_data_frame_pending()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_EnableEarlyFramePending()`|`sl_rail_ieee802154_enable_early_frame_pending()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_EnableSignalDetection()`|`sl_rail_ieee802154_enable_signal_detection()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_GetAddress()`|`sl_rail_ieee802154_get_address()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_GetPtiRadioConfig()`|`sl_rail_ieee802154_get_phy_id()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_Init()`|`sl_rail_ieee802154_init()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_IsEnabled()`|`sl_rail_ieee802154_is_enabled()`|`bool`|Same functionality|
|`RAIL_IEEE802154_SetAddresses()`|`sl_rail_ieee802154_set_addresses()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_SetFramePending()`|`sl_rail_ieee802154_toggle_frame_pending()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_SetLongAddress()`|`sl_rail_ieee802154_set_long_address()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_SetPanCoordinator()`|`sl_rail_ieee802154_set_pan_coordinator()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_SetPanId()`|`sl_rail_ieee802154_set_pan_id()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_SetPromiscuousMode()`|`sl_rail_ieee802154_set_promiscuous_mode()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_SetRxToEnhAckTx()`|`sl_rail_ieee802154_set_rx_to_enh_ack_tx()`|`sl_rail_status_t`|Function renamed|
|`RAIL_IEEE802154_SetShortAddress()`|`sl_rail_ieee802154_set_short_address()`|`sl_rail_status_t`|Same functionality|
|`RAIL_IEEE802154_WriteEnhAck()`|`sl_rail_ieee802154_write_enh_ack()`|`sl_rail_status_t`|Function renamed|

---

#### Type Name Changes

|RAIL 2.x Type|RAIL 3.0 Type|Base Type|Notes|
|---|---|---|---|
|`RAIL_AntennaSel_t`|`sl_rail_antenna_sel_t`|Enum (uint8_t)|Same concept|
|`RAIL_ChannelConfig_t`|`sl_rail_channel_config_t`|Struct|Same concept|
|`RAIL_Events_t`|`sl_rail_events_t`|Bitfield (uint32_t)|Same concept|
|`RAIL_Handle_t`|`sl_rail_handle_t`|`void *`|Same concept|
|`RAIL_IdleMode_t`|`sl_rail_idle_mode_t`|Enum (uint8_t)|Same concept|
|`RAIL_IrCalValues_t`|`sl_rail_ir_cal_values_t`|Struct|Same concept|
|`RAIL_PaPowerSetting_t`|`sl_rail_pa_power_setting_t`|`uint32_t`|Same concept|
|`RAIL_PtiProtocol_t`|`sl_rail_pti_protocol_t`|Enum (uint8_t)|Same concept|
|`RAIL_RadioConfig_t`|`sl_rail_radio_config_t`|Struct|Same concept|
|`RAIL_RadioStateDetail_t`|`sl_rail_radio_state_detail_t`|Enum (uint8_t)|Same concept|
|`RAIL_RadioState_t`|`sl_rail_radio_state_t`|Enum (uint8_t)|Same concept|
|`RAIL_RxOptions_t`|`sl_rail_rx_options_t`|Enum (uint8_t)|Same concept|
|`RAIL_SchedulerStatus_t`|`sl_rail_scheduler_status_t`|Enum (uint8_t)|Same concept|
|`RAIL_StateTiming_t`|`sl_rail_state_timing_t`|Struct|Same concept|
|`RAIL_StateTransitions_t`|`sl_rail_state_transitions_t`|Struct|Same concept|
|`RAIL_Status_t`|`sl_rail_status_t`|`sl_status_t`|Same concept|
|`RAIL_StopMode_t`|`sl_rail_stop_mode_t`|Enum (uint8_t)|Same concept|
|`RAIL_StreamMode_t`|`sl_rail_stream_mode_t`|Enum (uint8_t)|Same concept|
|`RAIL_TaskType_t`|`sl_rail_task_type_t`|Enum (uint8_t)|Same concept|
|`RAIL_TimeMode_t`|`sl_rail_time_mode_t`|Enum (uint8_t)|Same concept|
|`RAIL_TimerCallback_t`|`sl_rail_timer_callback_t`|Function pointer|Same concept|
|`RAIL_Time_t`|`sl_rail_time_t`|`uint32_t`|Same concept|
|`RAIL_TransitionTime_t`|`sl_rail_transition_time_t`|Enum (uint8_t)|Same concept|
|`RAIL_TxOptions_t`|`sl_rail_tx_options_t`|Enum (uint8_t)|Same concept|
|`RAIL_TxPowerConfig_t`|`sl_rail_tx_power_config_t`|Struct|⚠️ Field names changed|
|`RAIL_TxPowerCurvesConfigAlt_t`|`sl_rail_tx_power_table_config_t`|Struct|Function renamed|
|`RAIL_TxPowerMode_t`|`sl_rail_tx_power_mode_t`|Enum (uint8_t)|Same concept|
|`RAIL_TxPowerSettingEntry_t`|`sl_rail_tx_power_setting_entry_t`|Struct|⚠️ Simplified structure|
|`RAIL_TxPower_t`|`sl_rail_tx_power_t`|`int16_t`|⚠️ Now explicitly deci-dBm|

---

#### Consolidating Radio Configurations

> **⚠️ Important:** In RAIL 3.0, PA initialization is **required**. You must call `sl_rail_util_pa_init()` before configuring TX power. See [PA Power Conversion Functions](#pa-power-conversion-functions) for details, and refer to the [Power Amplifier (PA) Migration](#power-amplifier-pa-migration) section for comprehensive PA migration information.

This section provides practical examples comparing radio configuration patterns between RAIL 2.x and RAIL 3.0. These examples demonstrate how to migrate common radio setup scenarios.

##### Key Differences Summary

|Aspect|RAIL 2.x|RAIL 3.0|Notes|
|---|---|---|---|
|**Channel Preparation**|Auto-prepares first channel|Must call `sl_rail_prepare_channel()`|⚠️ Explicit call required|
|**Power Units**|Implicit (dBm * 10)|Explicit deci-dBm|✅ Clearer documentation|
|**Struct Fields**|`.voltage`, `.rampTime`|`.voltage_mv`, `.ramp_time_us`|⚠️ Snake_case + units|
|**PA settings**|`RAIL_ConfigTxPower()`|`sl_rail_util_pa_post_init()`|Instead of `sl_rail_util_pa_post_init()`if one parameter needs to change, use `sl_rail_set_tx_pa_ramp_time()` or `sl_rail_set_tx_pa_voltage()`. `sl_rail_util_pa_post_init()` will be called implicitly if `sl_rail_util_callbacks` component is used.|
|**TX Power Setting**|`RAIL_ConvertDbmToRaw()` + `RAIL_SetTxPower()`|`sl_rail_set_tx_power_dbm()`|Same functionality with only dBm focus|
|**Type Names**|`RAIL_Handle_t`, `RAIL_Status_t`|`sl_rail_handle_t`, `sl_rail_status_t`|`sl_rail_` prefix|

---

#### Struct Field Name Changes

##### sl_rail_tx_power_config_t (formerly RAIL_TxPowerConfig_t)

|RAIL 2.x Field|RAIL 3.0 Field|Type|Notes|
|---|---|---|---|
|`.mode`|`.mode`|`sl_rail_tx_power_mode_t`|Same|
|`.rampTime`|`.ramp_time_us`|`uint16_t`|⚠️ Snake_case + `_us` suffix|
|`.voltage`|`.voltage_mv`|`uint16_t`|⚠️ Added `_mv` suffix|

##### sl_rail_tx_power_setting_entry_t (formerly RAIL_TxPowerSettingEntry_t)

|RAIL 2.x Field|RAIL 3.0 Field|Type|Notes|
|---|---|---|---|
|`.currentPaPowerDbm`|`.curr_pa_power_ddbm`|`sl_rail_tx_power_t`|⚠️ Snake_case, deci-dBm|
|`.maxPaPowerDbm`|_(removed)_|-|✅ Simplified structure|
|`.minPaPowerDbm`|_(removed)_|-|✅ Simplified structure|
|`.paPowerSetting`|`.pa_power_setting`|`sl_rail_pa_power_setting_t`|⚠️ Snake_case|

##### sl_rail_config_t (formerly RAIL_Config_t)

|RAIL 2.x Field|RAIL 3.0 Field|Type|Notes|
|---|---|---|---|
|`buffer[]`|`opaque_value`|`sl_rail_opaque_value_t`|Reserved for app use|
|`eventsCallback`|`events_callback`|`sl_rail_events_callback_t`|Same|
|`protocol`|`p_opaque_handle_0`|void *|Reserved for app use|
|`scheduler`|`p_opaque_handle_1`|void *|Reserved for app use|
|_(none)_|`.rx_fifo_bytes`|`uint16_t`|✅ New - FIFO config at init|
|_(none)_|`.p_rx_fifo_buffer`|`uint8_t *`|✅ New - FIFO config at init|
|_(none)_|`.rx_packet_queue_entries`|`uint16_t`|✅ New - FIFO config at init|
|_(none)_|`.p_rx_packet_queue`|`void *`|✅ New - FIFO config at init|
|_(none)_|`.tx_fifo_bytes`|`uint16_t`|✅ New - FIFO config at init|
|_(none)_|`.tx_fifo_init_bytes`|`uint16_t`|✅ New - FIFO config at init|
|_(none)_|`.p_tx_fifo_buffer`|`uint8_t *`|✅ New - FIFO config at init|

---

#### Enum Value Changes

##### New PA Mode Enums

|RAIL 3.0 Enum Value|Value|Notes|
|---|---|---|
|`SL_RAIL_TX_PA_MODE_2P4_GHZ`|0|2.4 GHz|
|`SL_RAIL_TX_PA_MODE_SUB_GHZ`|1|Sub GHz|
|`SL_RAIL_TX_PA_MODE_SUB_GHZ_OFDM`|2|Sub GHz OFDM|
|`SL_RAIL_TX_PA_MODE_INVALID`|3|Invalid PA mode|

---

#### Constant Name Changes

##### Status Code Constants

|RAIL 2.x Constant|RAIL 3.0 Constant|Value|Notes|
|---|---|---|---|
|_none_|`SL_RAIL_STATUS_NO_MORE_RESOURCE`|0x001A|New value|
|`RAIL_STATUS_INVALID_CALL`|`SL_RAIL_STATUS_INVALID_CALL`|0x000E|Same value|
|`RAIL_STATUS_INVALID_PARAMETER`|`SL_RAIL_STATUS_INVALID_PARAMETER`|0x0021|Same value|
|`RAIL_STATUS_INVALID_STATE`|`SL_RAIL_STATUS_INVALID_STATE`|0x0002|Same value|
|`RAIL_STATUS_NO_ERROR`|`SL_RAIL_STATUS_NO_ERROR`|0x0000|Same value|
|`RAIL_STATUS_SCHED_ERROR`|`SL_RAIL_STATUS_SCHED_ERROR`|0x0006|Same value|
|`RAIL_STATUS_SUSPENDED`|`SL_RAIL_STATUS_SUSPENDED`|0x0005|Same value|

---

#### Header File Changes

|RAIL 2.x Include|RAIL 3.0 Include|Purpose|
|---|---|---|
|`#include "rail.h"`|`#include "sl_rail.h"`|Main RAIL header|
|`#include "rail_types.h"`|`#include "sl_rail_types.h"`|RAIL type definitions|
|`#include "pa_conversions_efr32.h"`|`#include "sl_rail_util_pa_conversions.h"`|PA conversion functions|
|`#include "pa_curves_efr32.h"`|_(included in main header)_|PA curve types|
|`#include "pa_curve_types_efr32.h"`|_(included in main header)_|PA curve type definitions|

---

#### Component Changes

|RAIL 2.x Component|RAIL 3.0 Component|Purpose|Notes|
|---|---|---|---|
|_(none)_|`sl_rail_util_pa_tables`|PA power tables|✅ Required by sl_rail_util_pa|
|`rail_util_pa`|`sl_rail_util_pa`|PA conversion plugin|⚠️ **Not compatible**|

---

#### Behavioral Changes Summary

|Feature|RAIL 2.x Behavior|RAIL 3.0 Behavior|Impact|
|---|---|---|---|
|**Channel Configuration**|`RAIL_ConfigChannels()` auto-prepares first channel|`sl_rail_config_channels()` only caches config|⚠️ **Must call** `sl_rail_prepare_channel()` explicitly|
|**PA Power Tables**|Only EFR32xG25 and SixG301|All platforms supported|✅ Expanded support|
|**PA Initialization**|Automatic|Must call `sl_rail_util_pa_init()`|⚠️ **REQUIRED** explicit call|
|**PA Power Units**|PA-dependent unitless power 'levels' (dBm * 10)|Explicit deci-dBm|✅ Clearer documentation|
|**PA Plugin**|`pa-conversions`|`sl_rail_util_pa`|⚠️ **Not compatible**|
|**PA settings**|`RAIL_ConfigTxPower()`|`sl_rail_util_pa_post_init()`|Instead of `sl_rail_util_pa_post_init()`if one parameter needs to change, use `sl_rail_set_tx_pa_ramp_time()` or `sl_rail_set_tx_pa_voltage()`. `sl_rail_util_pa_post_init()` will be called implicitly if `sl_rail_util_callbacks` component is used.|
|**PA Automode**|`RAIL_EnablePaAutoMode()`|Use automode tables provided by `sl_rail_util_pa_tables` component|Compile time choice|
|**RX FIFO/Packet Queue**|Shared across protocols, configured via callbacks|Per-protocol FIFOs possible, configurable at init|✅ More flexible|
|**Scheduled RX Event**|`RAIL_EVENT_RX_SCHEDULED_RX_END` only with `rxTransitionEndSchedule`|`SL_RAIL_EVENT_RX_SCHEDULED_RX_END` always occurs|⚠️ Different event timing|
|**Sequencer Images**|Image1/Image2 (1-based)|Image0/Image1 (0-based)|⚠️ Index change|
|**TX FIFO Size**|Minimum size requirement, rounded to power-of-2|Allows smaller FIFOs, non-power-of-2 treated as linear|✅ More flexible|

---

#### Migration Priority Checklist

##### High Priority (Required for Basic Functionality)

- Update all `#include` statements
- Add `sl_rail_util_pa_init()` call before PA configuration
- Update `RAIL_ConfigChannels()` → `sl_rail_config_channels()` + `sl_rail_prepare_channel()`
- Update all function names (`RAIL_*` → `sl_rail_*`)
- Update all type names (`RAIL_*` → `sl_rail_*`)
- Update struct field names (`.voltage` → `.voltage_mv`, `.rampTime` → `.ramp_time_us`)
- Add `sl_rail_util_pa_post_init()` after `sl_rail_init()`, if `sl_rail_util_callbacks` is not used

##### Medium Priority (Recommended for Best Practices)

- Use convenience APIs (`sl_rail_set_tx_power_dbm()`, `sl_rail_get_tx_power_dbm()`)
- Update PA plugin component (`rail_util_pa` → `sl_rail_util_pa`)
- Verify power unit conversions (dBm ↔ deci-dBm)
- Update enum values (`RAIL_TX_POWER_MODE_*` → `SL_RAIL_TX_POWER_MODE_*`)

##### Low Priority (Optional Enhancements)

- Configure FIFOs at initialization time via `sl_rail_config_t`
- Add channel config callback for per-channel PA configuration
- Update custom PA curve implementations
- Review and update scheduled RX event handling

---

#### Quick Reference: Common Migration Patterns

##### Pattern 1: Basic Initialization

**RAIL 2.x:**

```c
RAIL_Handle_t railHandle;
RAIL_Config_t config = { /* ... */ };
railHandle = RAIL_Init(&config, NULL);
```

**RAIL 3.0:**

```c
sl_rail_handle_t rail_handle = SL_RAIL_EFR32_HANDLE;
sl_rail_config_t config = { /* ... */ };
sl_rail_init(&rail_handle, &config, NULL);
```

##### Pattern 2: PA Configuration

**RAIL 2.x:**

```c
RAIL_TxPowerConfig_t txPowerConfig = {
  .mode = RAIL_TX_POWER_MODE_2P4_GHZ_HP,
  .voltage = 3300,
  .rampTime = 10,
};
RAIL_ConfigTxPower(railHandle, &txPowerConfig);
```

**RAIL 3.0:**

```c
sl_rail_util_pa_init();  // REQUIRED
sl_rail_tx_pa_mode_t pa_mode = SL_RAIL_TX_PA_MODE_2P4_GHZ;
sl_rail_util_pa_post_init(rail_handle, pa_mode);
```

##### Pattern 3: Setting TX Power

**RAIL 2.x:**

```c
RAIL_TxPowerConfig_t config;
RAIL_GetTxPowerConfig(railHandle, &config);
RAIL_TxPowerLevel_t level = RAIL_ConvertDbmToRaw(railHandle, config.mode, 200);
RAIL_SetTxPower(railHandle, level);
```

**RAIL 3.0:**

```c
sl_rail_set_tx_power_dbm(rail_handle, 200);  // necesssary API to set power in deci-dBm
```

---

#### Feature-Level Changes

##### 1. Channel Configuration

**RAIL 2.x Behavior:**

- `RAIL_ConfigChannels()` automatically prepared the first channel in the configuration

**RAIL 3.0 Behavior:**

- `sl_rail_config_channels()` only caches the configuration and does not prepare any channel
- Channel preparation is deferred to the first API call that specifies a channel
- To maintain RAIL 2.x behavior, call `sl_rail_prepare_channel()` after `sl_rail_config_channels()`:  
  ```c  
  sl_rail_config_channels(rail_handle, channel_configs[0], NULL);  
  sl_rail_prepare_channel(rail_handle,  
                          sl_rail_get_first_channel(rail_handle, channel_configs[0]));  
  ```

##### 2. Transmit FIFO Configuration

**RAIL 2.x Behavior:**

- `RAIL_SetTxFifo()` disallowed transmit FIFOs smaller than a minimum size requirement
- Non-power-of-2 sizes were rounded down to the next-smaller power-of-2

**RAIL 3.0 Behavior:**

- `sl_rail_set_tx_fifo()` allows transmit FIFOs smaller than the minimum size (defined by `SL_RAIL_MINIMUM_FIFO_BYTES`)
- Non-power-of-2 sizes are treated as linear buffers suitable for packet mode only
- Supports `start_offset_bytes` parameter for unaligned packet data

##### 3. Receive FIFO and Packet Queue

**RAIL 2.x Behavior:**

- All protocols shared the same RX FIFO and Packet Queue
- RX FIFO and Packet Queue were configured via callbacks

**RAIL 3.0 Behavior:**

- Each protocol can have its own RX FIFO and Packet Queue, or share them
- RX FIFO and Packet Queue can be configured at initialization time via `sl_rail_config_t`
- Protocols can share a built-in RX FIFO similar to RAIL 2.x using `sl_rail_builtin_rx_fifo_ptr`,  
  `sl_rail_bultin_rx_fifo_bytes`, `sl_rail_builtin_rx_packet_queue_ptr` and `sl_rail_builtin_rx_packet_queue_entries`

##### 4. Scheduled Receive Event

**RAIL 2.x Behavior:**

- `RAIL_EVENT_RX_SCHEDULED_RX_END` only occurred based on `rxTransitionEndSchedule` setting

**RAIL 3.0 Behavior:**

- `SL_RAIL_EVENT_RX_SCHEDULED_RX_END` always occurs regardless of `rx_transition_end_schedule` setting
- This provides more consistent behavior for scheduled receive operations

##### 5. PA Power Table Support

**RAIL 2.x Behavior:**

- PA power setting tables were only supported for EFR32xG25 and SixG301 platforms

**RAIL 3.0 Behavior:**

- PA power setting tables are supported for all platforms (not just EFR32xG25 and SixG301)
- The boolean `sli_rail_pa_power_table` indicates if PA power tables are in use

**Note:** RAIL 3.0 PA plugin and RAIL 2.x PA plugin are mutually exclusive and not fully compatible. Migration may require updating PA configuration. Use `sl_rail_util_compatible_pa` component to aid in selecting the desired PA plugin.

##### 6. Multiprotocol FIFO Management

**RAIL 2.x Behavior:**

- All protocols in multiprotocol mode shared the same RX FIFO and Packet Queue

**RAIL 3.0 Behavior:**

- Each protocol can have its own RX FIFO and Packet Queue
- FIFO configuration is more flexible and can be set per protocol
- Default behavior mimics RAIL 2.x for backward compatibility

---

#### Power Amplifier (PA) Migration

> **📖 For detailed PA information:** Refer to **[Power Amplifier Power Conversion Functions](https://docs.silabs.com/rail/latest/power-amplifier-power-conversion-functions-in-rail-v2x/)** for comprehensive PA customization and implementation details.

This section summarizes the key PA-related changes between RAIL 2.x and RAIL 3.0. RAIL 3.0 introduces a new PA plugin architecture that is **not compatible** with RAIL 2.x PA plugins.

##### Component Changes

|RAIL 2.x Component|RAIL 3.0 Component|Notes|
|---|---|---|
|_(none)_|`sl_rail_util_pa_tables`|✅ Required by `sl_rail_util_pa`|
|`rail_util_pa`|`sl_rail_util_pa`|⚠️ **Not compatible** - requires migration|

**⚠️ Important:** RAIL 3.0 PA plugin and RAIL 2.x PA plugin are **mutually exclusive and not fully compatible**. Use `sl_rail_util_compatible_pa` component to aid in selecting the desired PA plugin.

##### Header File Changes

|RAIL 2.x Include|RAIL 3.0 Include|
|---|---|
|`#include "pa_conversions_efr32.h"`|`#include "sl_rail_util_pa_conversions.h"`|

##### PA API Changes

|Functionality|RAIL 2.x Function|RAIL 3.0 Function|Notes|
|---|---|---|---|
|**Channel Config CB**|`sl_rail_util_pa_on_channel_config_change()`|`sl_rail_util_pa_on_channel_config_change()`|Parameter `RAIL_ChannelConfigEntry_t` type changed to `sl_rail_channel_config_entry_t`|
|**Get Power (dBm)**|`RAIL_GetTxPower()` + `RAIL_ConvertRawToDbm()`|`sl_rail_get_tx_power_dbm()`|✅ Convenience API in RAIL 3.0|
|**Init Power Tables**|Not available|`sl_rail_util_pa_init_tx_power_table()`|✅ New - Initialize Power tables|
|**PA Initialization**|None (automatic)|`sl_rail_util_pa_init()`|✅ **Required** - Must be called before PA config|
|**PA Post Init**|`RAIL_ConfigTxPower()`|`sl_rail_util_pa_post_init()`|✅ **Required** - Returns `sl_rail_status_t`, takes `sl_rail_tx_pa_mode_t` parameter. Must be called after `sl_rail_init()` if `sl_rail_util_callbacks` is not used|
|**PA Ramp Time**|Part of `RAIL_ConfigTxPower()`|`sl_rail_set_tx_pa_ramp_time()`|✅ New - Can change ramp time independently|
|**PA Voltage**|Part of `RAIL_ConfigTxPower()`|`sl_rail_set_tx_pa_voltage()`|✅ New - Can change voltage independently|
|**PA Automode**|`RAIL_EnablePaAutoMode()`|_(compile-time via table selection)_|⚠️ No runtime API - select automode table at compile time|
|**Power Table Convert**|`RAIL_ConvertDbmToPowerSettingEntry()`|`sl_railcb_convert_ddbm_to_power_setting_entry()`|⚠️ Callback function, uses deci-dBm, takes `sl_rail_tx_pa_mode_t` parameter|
|**Set Power (dBm)**|`RAIL_ConvertDbmToRaw()` + `RAIL_SetTxPower()`|`sl_rail_set_tx_power_dbm()`|✅ Convenience API in RAIL 3.0|

##### PA Type Changes

|RAIL 2.x Type|RAIL 3.0 Type|Notes|
|---|---|---|
|_(none)_|`sl_rail_tx_pa_mode_t`|✅ New - Simplified PA mode enum (2P4_GHZ, SUB_GHZ, SUB_GHZ_OFDM). Used by `sl_rail_util_pa_post_init()` and `sl_railcb_convert_ddbm_to_power_setting_entry()`|
|`RAIL_PaPowerSetting_t`|`sl_rail_pa_power_setting_t`|Type name changed|
|`RAIL_TxPowerConfig_t`|`sl_rail_tx_power_config_t`|Struct name changed|
|`RAIL_TxPowerCurvesConfigAlt_t`|`sl_rail_tx_power_table_config_t`|Type name changed|
|`RAIL_TxPowerMode_t`|`sl_rail_tx_power_mode_t`|Enum name changed (detailed power modes: HP, MP, LP, etc.)|
|`RAIL_TxPowerSettingEntry_t`|`sl_rail_tx_power_setting_entry_t`|✅ Structure simplified|
|`RAIL_TxPower_t`|`sl_rail_tx_power_t`|✅ Now explicitly deci-dBm|

##### PA Struct Field Changes

**`sl_rail_tx_power_config_t` (formerly `RAIL_TxPowerConfig_t`):**

- `.voltage` → `.voltage_mv` (added `_mv` suffix)
- `.rampTime` → `.ramp_time_us` (snake_case + `_us` suffix)

**`sl_rail_tx_power_setting_entry_t` (formerly `RAIL_TxPowerSettingEntry_t`):**

- `.paPowerSetting` → `.pa_power_setting` (snake_case)
- `.minPaPowerDbm` → _(removed)_ (simplified structure)
- `.maxPaPowerDbm` → _(removed)_ (simplified structure)
- `.currentPaPowerDbm` → `.curr_pa_power_ddbm` (snake_case, deci-dBm)

##### Platform Support

**RAIL 2.x:** PA power tables only supported on EFR32xG25 and SixG301 platforms.

**RAIL 3.0:** PA power tables supported on **all platforms** (expanded support).

##### PA Settings and Configuration

**RAIL 2.x Behavior:**

- `RAIL_ConfigTxPower()` was used to configure PA mode, voltage, and ramp time
- All PA settings were configured together in a single call

**RAIL 3.0 Behavior:**

- `sl_rail_util_pa_post_init()` replaces `RAIL_ConfigTxPower()` and configures initial PA settings (voltage, ramp time)
- If only one parameter needs to change after initialization, use:  
  - `sl_rail_set_tx_pa_ramp_time()` - to change only the PA ramp time  
  - `sl_rail_set_tx_pa_voltage()` - to change only the PA voltage
- `sl_rail_util_pa_post_init()` will be called implicitly if `sl_rail_util_callbacks` component is used
- Default values for voltage and ramp time are provided by `sl_rail_util_pa_config.h`

##### PA Automode

**RAIL 2.x Behavior:**

- `RAIL_EnablePaAutoMode()` runtime API allowed switching between multiple PAs based on requested power level
- Automode was enabled/disabled at runtime

**RAIL 3.0 Behavior:**

- Automode is now a **compile-time choice** through the automode table provided by `sl_rail_util_pa_tables` component
- Select an automode table via `SL_RAIL_UTIL_PA_TABLE_HEADER` (e.g., `sl_rail_util_pa_dbm_powersetting_mapping_table_automode_0_10dbm.h`)
- The automode table automatically selects the appropriate PA based on the requested power level
- No runtime API call is needed - the selection happens automatically when setting power via `sl_rail_set_tx_power_dbm()`
- This compile-time approach provides better optimization and reduces runtime overhead

##### PA Power Units

**RAIL 2.x Behavior:**

- PA power was represented as unitless "power levels" that were PA-dependent
- Values were implicitly in units of dBm * 10 (deci-dBm), but this was not clearly documented
- Different PAs had different power level ranges, making it difficult to compare across platforms

**RAIL 3.0 Behavior:**

- Power is explicitly represented in **deci-dBm** units (dBm * 10)
- `sl_rail_tx_power_t` is now explicitly `int16_t` representing deci-dBm
- All power-related APIs (`sl_rail_set_tx_power_dbm()`, `sl_rail_get_tx_power_dbm()`) use deci-dBm
- This makes power values consistent and comparable across all platforms and PAs
- Example: 20.0 dBm is represented as 200 deci-dBm

##### Key Migration Points

1. **Initialization Required**: Must call `sl_rail_util_pa_init()` before configuring TX power
2. **Post-Init Required**: Must call `sl_rail_util_pa_post_init()` after `sl_rail_init()` (if `sl_rail_util_callbacks` is not used). Call to `RAIL_ConfigTxPower()` is not necessary now.
3. **Individual PA Settings**: Use `sl_rail_set_tx_pa_ramp_time()` or `sl_rail_set_tx_pa_voltage()` if only one parameter needs to change after initialization
4. **Power Units**: RAIL 3.0 explicitly uses deci-dBm units (was implicit dBm * 10 in RAIL 2.x)
5. **PA Automode**: Automode is now a compile-time choice via table selection, not a runtime API
6. **Plugin Incompatibility**: RAIL 3.0 PA plugin is **not compatible** with RAIL 2.x PA plugin - full migration required

---

#### Behavioral Changes

##### 1. Initialization Changes

**RAIL 2.x:**

- FIFO configuration happened via callbacks after initialization
- Channel configuration automatically prepared the first channel

**RAIL 3.0:**

- FIFO configuration can happen at initialization time via `sl_rail_config_t`
- Channel configuration must be explicitly prepared
- Provides more control over initialization sequence

##### 2. Event Callback Signature

The event callback signature remains the same, but the type names have changed:

- **RAIL 2.x:** `void (*eventsCallback)(RAIL_Handle_t railHandle, RAIL_Events_t events)`
- **RAIL 3.0:** `void (*sl_rail_events_callback_t)(sl_rail_handle_t rail_handle, sl_rail_events_t events)`

##### 3. IEEE 802.15.4 PHY Configuration

**RAIL 2.x:**

- PHY configurations were constants like `RAIL_IEEE802154_Phy2p4GHz`

**RAIL 3.0:**

- PHY configurations are constants like `sl_rail_ieee802154_phy_2p4_ghz`
- Naming convention changed from camelCase to snake_case

---

#### Migration Tips

1. **Use Compatibility Layer:** RAIL 3.0 provides a compatibility layer that maps RAIL 2.x function names to RAIL 3.0 functions. This can be enabled/disabled via the `SLI_LIBRAIL_ALIAS` preprocessor define.
2. **Update Type Names:** Systematically replace all `RAIL_` prefixed types with `sl_rail_` prefixed types.
3. **Update Function Names:** Replace all `RAIL_` prefixed function names with `sl_rail_` prefixed names.
4. **Channel Configuration:** After migrating to `sl_rail_config_channels()`, explicitly call `sl_rail_prepare_channel()` if you need the first channel prepared immediately.
5. **FIFO Configuration:** Consider moving FIFO configuration to initialization time using `sl_rail_config_t` fields for better control.
6. **Test Thoroughly:** Pay special attention to:  
   - Multiprotocol applications (FIFO sharing behavior)  
   - Scheduled receive operations (event timing)  
   - PA power configuration (may require updates)

---

#### Compatibility Notes

- RAIL 3.0 maintains backward compatibility with RAIL 2.x through the compatibility layer when `SLI_LIBRAIL_ALIAS` is defined
- The compatibility layer provides function aliases and wrapper functions
- Some behavioral changes (like channel configuration) may require code updates even with compatibility layer

---

#### Notes

- ⚠️ Indicates a breaking change or important migration note
- ✅ Indicates an improvement or new feature
- All function signatures assume standard parameter order unless noted
- For detailed API documentation, refer to RAIL 3.0 Doxygen documentation

---

**Document Version:** 1.0<br />**Last Updated:** Based on RAIL 3.0 release<br />**Reference:** Similar format to [AN1113: Porting RAIL Applications to RAIL Version 2.x](https://www.silabs.com/documents/public/application-notes/an1113-porting-rail-applications-to-rail-version2.pdf)

### Detailed Timing Test Results for RAIL (PDF)

- [Detailed Timing Test Results for RAIL (PDF)](https://www.silabs.com/documents/public/application-notes/an1392-rail-timing-test.pdf)
### Rx Direct Mode on EFR32

This document outlines the Rx Direct Mode feature of the EFR32 Wireless Gecko
family. Rx Direct Mode is a feature that allows the user to access the raw
symbols received by the radio without packet handling. Direct Mode can be useful
when the received data does not conform to the standard packet structure or when
the user wants to implement custom packet handling. Although, Tx Direct Mode
where the modulator signal is fed into the radio directly for immediate
transmission also exists, the current document is restricted to discuss Rx
Direct Mode only.

#### Definition of Direct Mode

In the classical sense, in Direct Mode the radio operates via the GPIO
interface, where it outputs (expects) the demodulated (modulating) binary signal
stream for the received (transmitted) signal. In a broader sense, however, Rx
Direct Mode can be considered as any operational mode where the radio operates
with a **continuous**, **digital**, **semi-processed** or **raw** signal stream
requiring the detection and symbol decoding (in some cases even the
demodulation) to be performed in software with limitted HW assistance.

##### Practical Importance - Typical Use Cases

In Packet Mode, losing some data symbols during packet detection and clock
synchronization is unavoidable. If the synchronization pattern is too short or
not included in the transmitted data, reliable detection becomes impossible. In
such scenarios, switching to Direct Mode should be considered.

Access to the radio's internal signals provides the advantage of observing the
raw, the unprocessed signal stream -- the same signals the radio uses in
conventional Packet Mode. This makes Direct Mode an excellent debugging
interface, too.

Also, unconventional demodulation (such as multi-level FSK, AFSK, multi-level
PSK, Analog, etc.) or coding (32 bit+ DSSS, Pulse-Width OOK, etc.) schemes can
only be implemented  in Direct Mode on the EFR32.

Finally, Direct Mode can improve the performance compared to what Packet Mode
would be capable of by accessing more low-level information, at higher
resolution and rate on the signal not just the demodulated stream. This
advantage, however, may cost a tremendous amount of CPU resources.

#### Direct Mode Classification

##### Types of Direct Mode

The following list outlines the supported types of Direct Mode, arranged by data
integrity and complexity. Higher numbers indicate that the signal is accessed
earlier in the receiver chain, resulting in less hardware processing of the
signal:

(0. Packet Mode: This is the standard operational mode and not considered a type
of Direct Mode;)

1. **Synchronous Direct Mode**: bit-clock synchronized demodulated data provided  
   in a binary interface; depends on how the bit clock is recovered;
2. **Asynchronous Direct Mode**: Oversampled demodulated data provided in a  
   binary interface; heavily depends on the symbol detector configuration;
3. **Demod Data**: Amplitude or frequency of the received signal depending on  
   the modulation scheme used;
4. **IQ Data**: Quadrature samples directly tapped after the RF mixer;  
   independent of the demodulator.

Except for IQ Data, each successive mode simplifies the signal by reducing the
amount of information it carries while enhancing conciseness. This
simplification makes the signal easier to process and allows for higher
achievable data rates as it approaches Packet Mode. IQ Data and Demod Data modes
are the most versatile, offering detailed insights into the signal's physical
properties. In contrast, Synchronous and Asynchronous Direct Modes operate on
signals that have already passed through the demodulator’s slicer, which
converts the physical signal properties into binary symbols (0s and 1s).

The Synchrounous Direct Mode is captured at the `Actual Rx Baudrate [baud]`.
From mode 2 to 4, the radio operates at the Oversampling Rate (OSR), and the
sample rate is defined by `Raw Data Sampling Rate [sps]`. These parameters can
be found in the Radio Configurator generated log files
(`radioconf_generation_log.json`).

---

> We recommend using Packet Mode whenever possible, as this is the intended
> design of our products. If Packet Mode cannot be used, choose the least
> complex Direct Mode that meets your application's requirements.

As a general rule of thumb, the following guidelines can help you choose the
most suitable type of Direct Mode for your application:

- Synchronous Direct Mode:  
  - When robust signal detection cannot be set up in the radio configuration,    
    but the frame can be seen on the synchronized bit stream.  
  - For Bit Error Rate (BER) tests.
- Asynchronous Direct Mode:  
  - In channel scanning/protocol learning applications where the frequency or    
    the baud rate is not precisely known.  
  - In applications where enormous baud rate tolerance is desired.
- IQ or Demod Data:  
  - For signal analysis, debugging, or custom demodulation.  
  - For applications where the signal is not modulated with a supported    
    modulation scheme.

##### Interfaces and Availability of Rx Direct Mode Types

Direct Mode type availability and the interface through which the data is
provided for further processing depend on the radio configuration and the device
generation. The following interfaces are available for Rx Direct Mode types:

1. `Direct-to-Buffer`: may be available for all Direct Modes types;
2. `Direct-to-PRS`: may only be available for binary Direct Modes types.
3. `Direct-to-GPIO`: may only be available for binary Direct Modes types;

Several Direct Mode types are only available if the radio configuration is
generated with the Rx Direct Mode option enabled (i.e., not the `DISABLED`
option is selected). This option is available on a limited subset of Series 2 device
generations (e.g., EFR32xG23). These configurations will be referred to as the
`Direct Mode Radio Configuration` hereafter.

> Note: The `SYNC` mode is preferred over the `ASYNC` mode, as it provides both
> `Direct-to-PRS` signals simultaneously.

---

In `Direct-to-Buffer` mode, RAIL stores the samples into the Rx FIFO. In this
mode, all Direct Mode types are available and can be configured through the
[sl_rail_config_rx_data(...,
rx_data_config)](/rail/3.1.0/rail-api/data-management#sl-rail-config-rx-data)
API.

The type can be selected via the
[rx_data_config.rx_source](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t)
field and
[rx_data_config.rx_method](/rail/3.1.0/rail-api/data-management#sl-rail-data-method-t)
must be set to `SL_RAIL_DATA_METHOD_FIFO_MODE`.

The following table summarizes the available APIs for each Rx Direct Mode types:

|Direct Mode Type|RAIL API|Availability| |
|---|---|---|---|
|Synchronous Direct Mode|[SL_RAIL_RX_DATA_SOURCE_DIRECT_SYNCHRONOUS_MODE_DATA](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t)|Limitted to `Direct Mode Radio Configuration`| |
|Asynchronous Direct Mode|[SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t))|Limitted to `Direct Mode Radio Configuration`| |
|Demod Data|[SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t))|No restrictions| |
|IQ Data|[SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t)/[SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB](/rail/3.1.0/rail-api/data-management#sl-rail-rx-data-source-t)|No restrictions| |

In this mode, the data flow typically looks like this:

1. The samples captured by the radio are transferred to the Rx FIFO allocated  
   for RAIL.
2. The application reads the samples from the RAIL's Rx FIFO into an application  
   buffer.
3. The application processes the samples or transfers them to a host processor  
   through a communication interface.

The highest available baud rate for `Direct-to-Buffer` mode limited by the
interface through which the data is provided for further processing (or
potentially even lower if the data is processed within the EFR32's core). While
the radio can operate at symbol rates of up to several Msps, it's important to
note that each IQ sample consists of 4 bytes, whereas in `Demod Data`, the data
is represented with just 1 byte. Additionally, the Oversampling rate (baud
rate/symbol rate) can be as high as 10-20.

For example, for a 100 kbps PHY with an OSR of 10, the IQ Data rate would be
`4 * 100 kbps * 10 * 8 = 32 Mbps (4 MBps)`, while the Demod Data rate would be
`100 kbps * 10 * 8 => 8 Mbps (1 MBps)`.

---

Series 2 `Direct-to-PRS` is only available when a
`Direct Mode Radio Configuration` is the active radio configuration.

|Direct Mode Type|PRS Signal Name|
|---|---|
|Synchronous Direct Mode Data|`PRS_MODEM_DOUT`|
|Synchronous Direct Mode Clock|`PRS_MODEM_DCLK`|
|Asynchronous Direct Mode Data|`PRS_MODEM_LRDSALIVE`|

The baud rate of the `Direct-to-PRS` signals is essentially limited by the
peripheral to which the PRS signals are connected.

For more information on how to route PRS signals to GPIOs, see the
[Debugging training article](/rail/3.1.0/rail-training-debugging).

---

For Series 1 devices, Direct Mode types with binary output (Sync and Async) can
be traced onto GPIOs (via DBUS interface). These are available via the
[`sl_rail_config_direct_mode()`](/rail/3.1.0/rail-api/diagnostic#sl-rail-config-direct-mode)
and
[`sl_rail_enable_direct_mode()`](/rail/3.1.0/rail-api/diagnostic#sl-rail-enable-direct-mode)
APIs.

> Note: `Direct-to-GPIO` mode is not recommended on Series 2 devices as as it
> may not work as expected with certain radio PHYs. Instead, use the
> `Direct-to-PRS` mode.

#### Examples

In this section, we provide examples on how to set up the different Direct Mode
types and interfaces, either through firmware code implementation or, for a
quick testing, using RAILtest commands.

##### Setting up Direct-to-Buffer Mode

###### C Code

```c
/*
Available data sources:
SL_RAIL_RX_DATA_SOURCE_DIRECT_SYNCHRONOUS_MODE_DATA
SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA
SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA
SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB
*/

// Defines the RAIL Rx FIFO length and the application's buffer length
#define RX_FIFO_LENGTH 4096
#define BUFFER_LENGTH 2000

// Select the default data source
#define DEFAULT_DATA_SOURCE SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA

// Allocate the Rx FIFO
SL_RAIL_DECLARE_FIFO_BUFFER(tx_fifo, RX_FIFO_LENGTH);

// Allocate a ping-pong style application buffer
uint8_t rx_buffers[2][BUFFER_LENGTH];

// Initialize the active buffer index
uint8_t active_buffer = 0;

// ...

/* Initialization code */
{
  // ...
  sl_rail_status_t status;
  
  //Bind the Rx FIFO to the RAIL handle
  uint16_t rx_fifo_size = RX_FIFO_LENGTH;
  status = sl_rail_set_rx_fifo(railHandle, &rx_fifo[0], &rx_fifo_size, 0, 0);
  if (rx_fifo_size != RX_FIFO_LENGTH)
  {
    // handle error
  }
  if (status != SL_RAIL_STATUS_NO_ERROR)
  {
    // handle error
  }

  // Select Direct Mode type and configure the FIFO_MODE
  sl_rail_rx_data_config_t rx_data_config = {
    .rx_source = DEFAULT_DATA_SOURCE,
    .rx_method = FIFO_MODE,
  };

  // Configure `Direct-to-Buffer` mode
  status = sl_rail_config_rx_data(rail_handle, &rx_data_config);
  if (status != SL_RAIL_STATUS_NO_ERROR)
  {
    // handle error
  }

  // Set the Rx FIFO threshold for the Rx FIFO almost full event
  sl_rail_set_rx_fifo_threshold(rail_handle, BUFFER_LENGTH);

  // Enable the Rx FIFO almost full event
  sl_rail_events_t events = SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL;
  status = sl_rail_config_events(rail_handle, events, events);
  if (status != SL_RAIL_STATUS_NO_ERROR)
  {
    // handle error
  }
  // ...
}

/* RAIL event handler */ 
{
  // ...
  if (events & SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL)
  // This event fires whenever the Rx FIFO contains more data than configured 
  // in the threshold; BUFFER_LENGTH in this example
  {
    uint16_t bytes_read; 
    // Read the Rx FIFO into the active buffer
    bytes_read = sl_rail_read_rx_fifo(rail_handle, rx_buffer[active_buffer], BUFFER_LENGTH);
    if (bytes_read != BUFFER_LENGTH)
    {
      // handle error
    }
    // Switch the active buffer for the next iteration
    active_buffer ^= 1;
  }
  // ...
}
```

###### RAILtest Commands

```c
rx 0
setRxFifo <fifo_size>
dataConfig fifo fifo <rx_data_source> 0
// rx_data_source can be 1-5; e.g., RX_DIRECT_MODE_DATA is 4
fifoModeTestOptions 1 1
seteventconfig 0x400 0x000 
fiforeset 1 1
rx 1
rxFifoManualRead 0 <fifo_size> 0
```

##### Setting up Direct-to-PRS Mode

###### C Code

```c
#define SYNC_DOUT_GPIO_PORT gpioPortC
#define DCLK_GPIO_PORT gpioPortC
#define ASYNC_DOUT_GPIO_PORT gpioPortC

#define SYNC_DOUT_GPIO_PIN 0
#define DCLK_GPIO_PIN 1
#define ASYNC_DOUT_GPIO_PIN 2

/*
  Channel 0-5  available on GPIO port A/B
  Channel 6-11 available on GPIO port C/D
*/
#define SYNC_DOUT_PRS_CHANNEL 6
#define DCLK_PRS_CHANNEL 7
#define ASYNC_DOUT_PRS_CHANNEL 8

// (...)

// Initialize PRS signals
PRS_ConnectSignal(SYNC_DOUT_PRS_CHANNEL, prsTypeAsync, PRS_MODEML_DOUT);
PRS_ConnectSignal(DCLK_PRS_CHANNEL, prsTypeAsync, PRS_MODEML_DCLK);
PRS_ConnectSignal(ASYNC_DOUT_PRS_CHANNEL, prsTypeAsync, PRS_MODEM_LRDSALIVE);

// Initialize GPIO pins
GPIO_PinModeSet(SYNC_DOUT_GPIO_PORT, SYNC_DOUT_GPIO_PIN, gpioModePushPull, 0);
GPIO_PinModeSet(DCLK_GPIO_PORT, DCLK_GPIO_PIN, gpioModePushPull, 0);
GPIO_PinModeSet(ASYNC_DOUT_GPIO_PORT, ASYNC_DOUT_GPIO_PIN, gpioModePushPull, 0);

// Assing PRS signals to GPIO pins
PRS_PinOutput(SYNC_DOUT_PRS_CHANNEL, prsTypeAsync, SYNC_DOUT_GPIO_PORT, SYNC_DOUT_GPIO_PIN);
PRS_PinOutput(DCLK_PRS_CHANNEL, prsTypeAsync, DCLK_GPIO_PORT, DCLK_GPIO_PIN);
PRS_PinOutput(ASYNC_DOUT_PRS_CHANNEL, prsTypeAsync, ASYNC_DOUT_GPIO_PORT, ASYNC_DOUT_GPIO_PIN);
```

###### RAILtest Commands

```c
// The signal-source associations are valid for EFR32xG23/25/28 parts
setdebugsignal <gpio_pin_selection: PC0> CUSTOM_PRS 0x29 6 // SYNC DOUT
setdebugsignal <gpio_pin_selection: PC1> CUSTOM_PRS 0x29 5 // DCLK
setdebugsignal <gpio_pin_selection: PC2> CUSTOM_PRS 0x2A 3 // ASYNC DOUT
```

##### Setting up Direct-to-GPIO Mode

###### C Code

```c
sl_rail_status_t status;

sl_rail_direct_mode_config_t direct_mode_config = {
  // configure
};

status = sl_rail_config_direct_mode(rail_handle, &direct_mode_config);
if (status != SL_RAIL_STATUS_NO_ERROR)
{
  // handle error
}

status = sl_rail_enable_direct_mode(rail_handle, <enable_tx>, true);
if (status != SL_RAIL_STATUS_NO_ERROR)
{
  // handle error
}
```

###### RAILtest Commands

```c
rx 0
configDirectMode <parameters>
directmode 1
rx 1
```

---

For additional examples, explore our
[EFR32 RAIL Application Examples](https://github.com/SiliconLabs/proprietary_rail/)
repository on GitHub.

### Using RAIL for IEEE 802.15.4 Applications with EFR32

#### Using RAIL for IEEE 802.15.4 Applications with EFR32

> **Note: This section replaces _AN1365: Using RAIL for IEEE 802.15.4
> Applications with EFR32_. Further updates to this application note will be
> provided here.**

This application note describes how to use RAIL and the Radio Configurator for
IEEE 802.15.4 development on EFR32 Wireless parts. It includes supported
features and limitations, using the Radio Configurator and supplied software
components, and examples.

Proprietary is supported on all EFR32FG devices. For others, check the device's
datasheet under Ordering Information > Protocol Stack to see if Proprietary is
supported.

##### Overview

RAIL provides numerous hardware-accelerated IEEE 802.15.4 compliant MAC
features, such as format filtering, address filtering, Auto-ACK, and frame-type
filtering.

Silicon Labs provides some fully IEEE 802.15.4-compliant PHY configurations, but
not all that is defined by the standard. It is possible to define additional
PHYs in the Radio Configurator that are fully or just partially compatible with
the IEEE 802.15.4 standard supporting these MAC features.

#### Configure 802.15.4 PHYs in RAIL

This section describes how to configure EFR32 radios using an IEEE
802.15.4–compatible PHY. Most of these PHYs have limited configurability because
they are designed to comply with the standard.

The channel numbering for standard PHYs follows the IEEE 802.15.4 specification.
As a result, most PHYs do not use channel 0 as the first valid channel. Check
the GUI or refer to the standard to see the available channels for each PHY.

For the available PHYs and 802.15.4 specific RAIL features on the
selected radio platform generation, see:

- the device’s datasheet
- the Radio Configuration GUI
- the RAIL documentation

After you select any of these PHYs, load it by using
[sl_rail_ieee802154_config_channels()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-config-channels).
You can also use
[sl_rail_config_channels()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-config-channels),
but the ieee802154 API provides additional initialization. It configures PTI and
enables CRC and whitening based on the PHR for SUN-FSK (and similar) PHYs. **If
the device is a module that supports only signed PHYs, this method also unlocks
the module.**

Some PHYs - mainly 2.4 GHz PHYs - also have dedicated APIs, such as
[sl_rail_ieee802154_config_2p4_ghz_radio()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio)..
These APIs load pre-generated versions of the PHYs listed below. They are
provided for compatibility and might be deprecated in the future.

##### 2.4 GHz 250 kbps O-QPSK PHYs

The 2.4 GHz 250 kbps O-QPSK PHY is the most commonly used instance of the IEEE
802.15.4 PHYs. Zigbee and Thread applications (indoor PAN network protocols)
also configure this PHY when initializing the stack.

Find this PHY in the Radio Configurator under _IEEE802154OQPSK Profile_:

![2.4GHz profile](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/2p4g.png)

The Radio Configurator supports this PHY along with some variations:

- Antenna Diversity
- External LNA (FEM - front-end module)
- Concurrent

> **Note**: Do not confuse this PHY with the SUN O-QPSK (or MR-OQPSK) PHY. SubGHz
> O-QPSK PHYs are described in a later section.

###### Connect 2.4 GHz O-QPSK PHYs

The Radio Configurator provides the _Connect 2.4GHz OQPSK 2Mcps 250kbps_ PHY in
the _Connect Profile_:

![Connect OQPSK](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/connectoqpsk.png)

This PHY is mostly compatible with IEEE 802.15.4 but might not meet all
requirements or regulatory standards (such as FCC). It also delivers lower RF
performance on most EFR32 radio generations than the PHYs described in the
previous section.

However, as this PHY is not intended to comply with the standard, allows more
customization (DSSS configuration, custom datarate, different sync word,
preamble configuration, channel number, and frequency assignment, etc.).

For more information, see [Using Silicon Labs Connect v3.x with IEEE
802.15.4](/connect-stack/latest/using-connect-v3x-with-ieee-802-15-4).

##### SubGHz BPSK PHYs

The 20 kbps and 40 kbps BPSK PHYs (for the 868 MHz and 915 MHz ISM bands,
respectively) are available in the Radio Configurator under the _IEEE802154
BPSK Profile_:

![BPSK profile](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/bpsk.png)

##### UK metering PHYs

The following PHYs are being used most commonly in UK metering standards, using
Zigbee. These are under the _IEEE802154 Profile_:

![UK metering](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/ukmetering.png)

These PHYs provide a quasi–SUN-FSK configuration and use a 2-byte PHR. However,
they are not fully compliant with the IEEE 802.15.4 standard. For example,
limitations in PHY header construction restrict the maximum payload length to
127 bytes.

##### Wi-SUN and SUN PHYs

###### Wi-SUN PHYs

If a SUN PHY is part of the Wi-SUN standard, it appears in the _Wi-SUN FAN 1.0_,
_Wi-SUN FAN 1.1_ or _Wi-SUN HAN_ profiles. These profiles include both SUN-FSK
and SUN-OFDM PHYs.

![Wi-SUN](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/wisun.png)

###### SUN FSK

Find these PHYs under the _Base_ profile _-> IEEE 802.15.4 SUN FSK <specs>_.
PHYs under this profile are supported, but not part of the Wi-SUN specification.

![SUN FSK](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/sun-fsk.png)

###### SUN O-QPSK

These PHYs can be found under the _SUN OQPSK Profile_:

![SUN OQPSK](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/sun-oqpsk.png)

###### Connect OFDM

Connect OFDM PHYs are fully compatible with the OFDM PHYs under _Wi-SUN FAN
1.1_. They are provided here for easier configurability in proprietary
applications, Connect compatibility, and allowing some limited configurability,
namely, the channel map.

![Connect OFDM](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/connect-ofdm.png)

The four Connect OFDM PHYs are defined according to the 4 OFDM options defined
by the IEEE 802.15.4 standard. The parameters of these options are listed below:

| |OPT1|OPT2|OPT3|OPT4|
|---|---|---|---|---|
|Channel spacing (kHz)|1200|800|400|200|
|DFT size|128|64|32|16|
|Number of sub-carriers|104|52|26|14|
|Channel width (kHz)|1094|552|281|156|
|MCS0 (kbps)|100|50|25|12.5|
|MCS1 (kbps)|200|100|50|25|
|MCS2 (kbps)|400|200|100|50|
|MCS3 (kbps)|800|400|200|100|
|MCS4 (kbps)|1200|600|300|150|
|MCS5 (kbps)|1600|800|400|200|
|MCS6 (kbps)|2400|1200|600|300|
|MCS7 (kbps)|3600|1800|900|450|

**Note**: The high bitrate is only achievable on the payload, the training
sequence and PHR will be the same symbol rate within the same option.

For more information on using these PHYs in Connect, see [PHY Limitations and
Timing
Optimization](/connect-stack/latest/connect-phy#ofdm-settings).

##### PHYs with IEEE 802.15.4 Frame Format

Using the PHYs described in the following section, the radio might not be fully
IEEE 802.15.4 compatible and could fail on regulatory and/or protocol
certification. The IEEE 802.15.4 frame format is a well-known and common
specification. Using such a radio configuration might accelerate the product
development cycle, and it makes available the IEEE 802.15.4 specific RAIL APIs.

If the PHY you want to use is supported by RAIL, Silicon Labs recommends using
it from there, as these are validated and fine-tuned through config options that
might not be available on the Radio Configurator.

If you select any PHY from the `Connect` Profile and `Long Range` Profile in the
Radio Configurator, most of the payload-related customization becomes
unavailable because these PHYs ensure IEEE 802.15.4 frame format compatibility,
but overall, these PHYs are not fully compatible with the standard.

However, in cases where you need more customization options available in the
Radio Configurator, you might have set up IEEE 802.15.4 frame format
compatibility as it is discussed in the following section.

##### Build Custom PHYs in the Radio Configurator

If you need full control over the PHY customization, you need to set it up
directly in the Radio Configurator. Note that you can only set up OQPSK (not
SUN-OQPSK) and SUN-FSK PHYs. SUN-OFDM, SUN-OQPSK and BPSK PHYs are only
available as pre-configured PHY.

To set up the base of the config, follow these steps:

- Disable all `Advanced` options.
- Set up modulation and frequencies as per the requirements of the standard.
- Configure channel spacing and channel numbering according to the standard.
- Preamble and sync word (SFD) depends on the PHY format; set it up accordingly.
- Use LSB first everywhere unless stated otherwise. (*)

(*) SUN-FSK is an exception, which defines the length field MSB first. The
length can be handled by the hardware, but you must keep in mind that you have
to reverse the endianness of these bytes for both Rx and Tx in the application.
See the [next section](03-header-usage) for details

###### Variable Length Setup for 1-byte PHR with 7-bit Length

On 2.4 GHz O-QPSK, this is covered by the embedded config. Otherwise:

- Check _Header Enable_
- Set _Header Size_ to `1`
- Set _Frame Length Encoding_ to `VARIABLE_LENGTH`
- Set _Frame Bit Endian_ to `LSB_FIRST`
- Check _Length Includes CRC Bytes_
- Set _Minimum Length_ to `0`
- Set _Maximum Length_ to `127`
- Set _Variable Length Bit Size_ to `7`
- Set _Variable Frame Length Adjust_ to `0`
- Set _Variable Length Bit Endian_ to `LSB_FIRST`
- Set _Variable Length Bit Location_ to `0`

###### Variable Length Setup for 2-byte PHR and 11-bit Length (SUN FSK)

- Check _Header Enable_
- Set _Header Size_ to `2`
- Set _Frame Length Encoding_ to `VARIABLE_LENGTH`
- Set _Frame Bit Endian_ to `LSB_FIRST`
- Check _Length Includes CRC Bytes_
- Set _Minimum Length_ to `0`
- Set _Maximum Length_ to `2048`
- Set _Variable Length Bit Size_ to `11`
- Set _Variable Frame Length Adjust_ to `0`
- Set _Variable Length Bit Endian_ to `MSB_FIRST`
- Set _Variable Length Byte Endian_ to `MSB_FIRST`
- Set _Variable Length Bit Location_ to `0`

To use RAIL's capability of [selecting CRC and whitening based on the
PHR](./04-802-15-4-hw-accelerated-mac-features#runtime-phy-reconfiguration-with-sun-fsk-and-wi-sun-phys),
configure for 4-byte CRC and enabled whitening as described below.

> **Note**: The default Rx FIFO size is 512 bytes. Increase it by using
> [sl_rail_set_rx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-fifo)
> or use FIFO mode to download the packet in chunks.

###### CRC Configuration

###### 2-byte (CCITT-16) (heading level 7)

- Set _CRC Input Bit Endian_ to `LSB_FIRST`
- Uncheck _CRC Input Padding_
- Set _CRC Polynomial_ to `CCITT_16`
- Set _CRC Seed_ to `00`
- Set _CRC Output Bit Endian_ to `MSB_FIRST`
- Set _CRC Byte Endian_ to `MSB_FIRST`
- Uncheck _CRC Invert_
- Uncheck _CRC Header_

###### 4-byte (ANSI X3.66-1979) (heading level 7)

- Set _CRC Input Bit Endian_ to `LSB_FIRST`
- Check _CRC Input Padding_
- Set _CRC Polynomial_ to `ANSIX366_1979`
- Set _CRC Seed_ to `0xFFFFFFFF`
- Set _CRC Output Bit Endian_ to `MSB_FIRST`
- Set _CRC Byte Endian_ to `MSB_FIRST`
- Check _CRC Invert_
- Uncheck _CRC Header_

###### Whitening Configuration (2-byte PHR only)

- Set _Whitening Output Bit_ to `0`
- Set _Whitening Seed_ to `0x01F0`
- Set _Whitening Polynomial_ to `PN9`
- Uncheck _Whiten Header_

#### Using the Headers and Footers from RAIL

For radios that use RAIL, the hardware generates everything up to the end of the
sync word and from the start of the CRC. Data between the end of the sync word
and the start of the CRC is read from the FIFO. This is the general rule,
although RAIL and the radio can be configured differently.

In IEEE 802.15.4 terms, this means, the radio generates the SHR (including the SFD) and the
FCS, which is part of the MAC footer. The application loads the PHR, MHR, and
MAC payload. You can also change the SFD by using separate APIs.

##### Start of Frame Delimiter (SFD, Sync Word)

The Radio Configurator can configure up to two sync words, with some
limitations. If the selected demodulator supports this feature, the radio can
receive both sync words. You can read the sync word of the received packet from
the
[sync_word_id](/rail/3.1.0/rail-api/sl-rail-rx-packet-details-t#sync-word-id)
field of
[sl_rail_rx_packet_details_t](/rail/3.1.0/rail-api/sl-rail-rx-packet-details-t).

On transmit, select the sync word by using the
[SL_RAIL_TX_OPTION_SYNC_WORD_ID](/rail/3.1.0/rail-api/transmit#sl-rail-tx-option-sync-word-id)
Tx option.

For SUN-FSK, the SFD selection determines whether FEC is used. By default, the
hardware does not decode or encode this, but you can enable it. See [Dynamic
FEC](./04-802-15-4-hw-accelerated-mac-features#dynamic-fec) in the next section.

##### Payload header (PHR)

As discussed above, the PHR should be loaded from RAIL as the beginning of the
payload. The most important role of the PHR is the length configuration. With
RAIL-supported radios configured for variable length mode, both the Tx and Rx
length is automatically configured from the length field. Note that this means
that if you load more data to the FIFO than needed, some extra bytes will remain
there until reset, or transmitted as part of the next frame.

If you load more data into the FIFO than required, extra bytes remain until you
reset the FIFO or transmit the next frame, where they will be included.

The length field in the PHR includes the entire PHY payload. This includes the
FCS (CRC) bytes but not the PHR itself. RAIL expects the PHR in the FIFO but not
the FCS.

For example, if you set the length field to 16 in a 1-byte PHR and 2-byte FCS
configuration, the MAC payload is 14 bytes, while RAIL expects 15 bytes in the
FIFO.

###### 1-byte PHR

The following PHYs use the 1-byte PHR with a 7-bit length field and one reserved
bit at the most-significant-bit (MSB):

- 2.4 GHz 250 kbps O-QPSK PHYs
- SubGHz BPSK PHYs
- All Connect PHYs
- All Long Range PHYs

The radio hardware handles endianness automatically. To set the PHR, set the
first byte of the FIFO to a value between 1 and 127.

###### 2-byte PHR

The following PHYs use the 2-byte PHR with an 11-bit length field and configurable
whitening and FCS:

- SUN FSK PHYs, including Wi-SUN FSK PHYs
- UK metering PHYs

In SUN-FSK, the PHR is transmitted MSB first, while the rest of the packet is
least-significant-bit (LSB) first. The radio operates in LSB-first mode, so the
application must reverse the PHR bit order (endianness). You can do this by
using the following functions:

```c
void set_phr(uint8_t *payload, uint32_t phr, uint8_t phr_size){
  phr = __RBIT(phr);
  for (uint8_t index = 0; index < phr_size; index++) {
    payload[index] = ((phr & (0xFF << index * 8)) >> index * 8);
  }
}

uint32_t get_phr(uint8_t *payload, uint8_t phr_size){
  uint32_t phr = 0;
  for (uint8_t index = 0; index < phr_size; index++) {
    phr |= payload[index] << (index * 8);
  }
  phr = __RBIT(phr);
  return phr;
}
```

The code above is flexible and supports PHR sizes up to 4 bytes. Although this
approach might be less efficient for a 2-byte PHR, you can use the same code for
upcoming 4-byte PHR sections.

Construct the native-endianness PHR as follows:

```c
uint16_t phr = ((fcsType << 12) | (whitening << 11) | frameLength);
```

The whitening and FCS selection is not automatic in the hardware, but that can
be enabled. See [2-byte Header
Options](./04-802-15-4-hw-accelerated-mac-features#2b-header-options) in the
next chapter.

###### Mode switch frame (heading level 7)

Mode switch frame can be coded with the 2-byte PHR configuration. Although
run-time generation of the Mode Switch PHR is possible, we found that it is
simpler to pre-generate them. When generating a Wi-SUN PHY, an an array of
structs will be generated as well. This includes the PHR needed to switch to
the given PHY.

You must still flip the endianness of this value by using the `set_phr()`
function described above. For information about receiving mode switch frames,
see the [next page](04-802-15-4-hw-accelerated-mac-features#mode-switch).

###### 36-bit PHR

The following PHYs use the 36-bit PHR, which has an 11-bit length field,
configurable rate and scrambling and has an 8-bit HCS (CRC), and a 6-bit
all-zero tail field:

- SUN OFDM PHYs
- Connect OFDM PHYs

To simplify the application, the radio hardware automatically generates the HCS
and Tail on Tx and checks and removes them on Rx. To avoid handling partial
bytes, the hardware use a 4-byte pseudo-PHR for both Tx and Rx.

![OFDM pseudo PHR](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/si-ofdm-phr.svg)

> **Note**: The Rate, Length, and Scrambler field sizes match the IEEE 802.15.4
> PHR, but the HCS and Tail fields are not included. To match SUN-FSK handling,
> you must also flip the endianness of this pseudo-PHR.

In Tx mode, the Rx ID is reserved and must be set to 0. In Rx mode, it is 0xC0.
The MSB is always 1 for Softmodem Rx, while the lower bits define the received
modulation (1 for OFDM).

The hardware handles the Rate (MCS) and Scrambler. It processes the payload
based on the PHR bits for both Tx and Rx.

Use the same function as for the [2-byte PHR](#2-byte-phr) to convert
endianness. You can assemble the native-endianness PHR as follows:

```c
phr = (rate << 19) | (frameLength << 7) | (scrambler << 3);
```

###### 3-byte PHR

The following PHYs use the 3-byte PHR, which has an 11-bit length field,
configurable rate and spreading and has an 8-bit HCS (CRC):

- SUN OQPSK PHYs

To simplify the application, the radio hardware automatically generates the HCS
on Tx and checks and removes it on Rx. Use a similar 4-byte pseudo-PHR for
SUN-OQPSK:

![OQPSK pseudo PHR](/using-rail-for-802-15-4-applications-with-efr32/0.1/images/si-oqpsk-phr.svg)

> **Note**: The Rate, Length, and Spreading field sizes match the IEEE 802.15.4
> PHR, but the HCS field is not included. To match SUN-FSK handling, you must
> also flip the endianness of this pseudo-PHR.

In Tx mode, the Rx ID is reserved and must be set to 0. In Rx mode, it is 0xA0.
The MSB is always 1 for Softmodem Rx, while the lower bits define the received
modulation (2 for SUN-OQPSK).

The hardware handles the Rate and Spreading. It processes the payload based on
the PHR bits for both Tx and Rx.

Use the same function as for the [2-byte PHR](#2-byte-phr) to convert
endianness. You can assemble the native-endianness PHR as follows:

```c
phr = (spreadingMode << 15) | (rateMode << 13) | frameLength;
```

#### IEEE 802.15.4 Hardware-Accelerated MAC Features

The APIs introduced in the following sections work with any proprietary PHY
which meets the IEEE 802.15.4 frame format specification. This includes all PHYs
defined under the _Connect_ and _Long Range_ profiles in the Radio Configurator.
Meeting this requirement is sufficient to use the protocol-specific RAIL APIs at
the IEEE 802.15.4 PHY layer. The Connect SDK provides a good example of how to
use these features with PHYs that are not fully IEEE 802.15.4 compliant.

The hardware supports address and frame filtering, Auto-ACK, and handling of the
frame pending bit in the ACK through RAIL. To enable these features, use the
[sl_rail_ieee802154_init()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-init)
API call and the other calls related to address filtering or frame pending.

You can configure address filtering and Auto-ACK by using the init API. These
features also have dedicated configuration APIs, described in the following
sections:

##### Address Filtering

To configure address filtering, call
[sl_rail_ieee802154_set_addresses()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-set-addresses)
with a structure containing all addresses, or call the individual
[sl_rail_ieee802154_set_pan_id()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-set-pan-id),
[sl_rail_ieee802154_set_short_address()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-set-short-address),
and
[sl_rail_ieee802154_set_long_address()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-set-long-address)
APIs. You can configure up to three addresses for each IEEE 802.15.4
address field. You can also set these addresses by using the
[sl_rail_ieee802154_init()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-init)
API.

With enabled address filter, packet reception will be immediately aborted after
the address fields if the configured address filtering does not match with any
configured addresses.

> **Note**: The IEEE 802.15.4 address filter is different from the generic RAIL
> address filter feature.

###### Best Practices for Address Filtering

- Broadcast addresses are supported by default and do not require additional  
  configuration. They do not consume address slots.
- Set unused addresses to the broadcast address (`0xFFFF`) if you do not need  
  all three addresses.
- Do not change addresses during reception. Reconfiguring the address filter  
  while receiving a packet might cause unexpected behavior.

To know more, see the [IEEE 802.15.4
page](/rail/3.1.0/rail-api/ieee802-15-4#ieee-802-15-4) of the
API documentation and
[sl_rail_ieee802154_addr_config_t](/rail/3.1.0/rail-api/sl-rail-ieee802154-addr-config-t)
type’s documentation.

##### Auto-Ack and Frame Pending

Auto-ACK is controlled by the ackConfig and timings fields passed to
[sl_rail_ieee802154_init()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-init).
After initialization, you can control it by using the Auto-ACK and state
transition APIs.

The `ackTimeout` interval is measured from the end of the transmitted (Tx)
packet to the end of the sync word (SFD) of the received (Rx) ACK packet.
Therefore, the configured `ackTimeout` value must account for the transmission
time of both the ACK PHY header and the ACK payload to ensure correct operation.

For an example, see the RAIL IEEE 802.15.4 detailed description.

To listen for an ACK packet, you must transmit the packet with the
[SL_RAIL_TX_OPTION_WAIT_FOR_ACK](/rail/3.1.0/rail-api/transmit#sl-rail-tx-option-wait-for-ack)
option.

The ACK frame includes the same sequence number as the frame that it responds
to.

The AR bit in the Frame Control Field (FCF) specifies whether an acknowledgment
is required from the receiver device. Upon a reception, the receiver sends an
ACK frame only if the frame passes the filtering. If this bit is 0, the receiver
does not send an ACK packet. Usually, the AR is located at the 5th position of
the FCF.

The Frame Pending bit is used for data polling. The end device polls the
coordinator with a data request command. If the coordinator has a message to the
end device, it responds with an ACK packet with the frame pending bit set in the
FCF.

In IEEE 802.15.4 mode with a 2.4 GHz PHY, the ACK frame has a length of 5 bytes.
It includes the FCF, sequence number, and FCS (MAC fields) but no payload. The
frame type is ACK, and the frame version is 0 (2003).

The ACK frame pending bit is false unless the
[SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](/rail/3.1.0/rail-api/events#sl-rail-event-ieee802154-data-request-command)
event is triggered. In that case, it defaults to the setting configured in the
[sl_rail_ieee802154_config_t.default_frame_pending_in_outgoing_acks](/rail/3.1.0/rail-api/sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).
If the default frame pending setting is incorrect, call
[sl_rail_ieee802154_toggle_frame_pending()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending)
while handling the
[SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](/rail/3.1.0/rail-api/events#sl-rail-event-ieee802154-data-request-command)
event.

Enable this event so it fires when a data request is received. This allows the
stack to determine whether data is pending.

If you need to change the default frame pending bit, do so quickly. Otherwise,
the ACK might already be transmitted with the default setting. To trigger this
event earlier during packet reception, use the
[sl_rail_ieee802154_enable_early_frame_pending()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-enable-early-frame-pending)
API.

Check the return code of
[sl_rail_ieee802154_toggle_frame_pending()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending)
to confirm that the frame pending bit was updated in time.

The
[SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](/rail/3.1.0/rail-api/events#sl-rail-event-ieee802154-data-request-command)
event is triggered only for data request MAC command frames that request an ACK.
To trigger this event for data frames as well, call the
[sl_rail_ieee802154_enable_data_frame_pending()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-enable-data-frame-pending)
API.

##### Enhanced ACK

The
[SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack)
option allows the radio to receive packets with Frame Version 2 in the MAC
header. By default, RAIL accepts packets with frame version 0 or 1. Enable this
option to handle enhanced ACK frames.

RAIL automatically assembles immediate ACK frames but does not assemble enhanced
ACK frames. The
[SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](/rail/3.1.0/rail-api/events#sl-rail-event-ieee802154-data-request-command)
event is triggered for every received frame that requests an ACK. The application
must determine whether to assemble an enhanced ACK payload based on the
partially received packet, which you can access through
[sl_rail_get_rx_incoming_packet_info()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-incoming-packet-info).

For more information, see the API documentation for
[SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack).

> **Note**: This feature does not enable reception of multipurpose frames. To
> enable this capability, use the
> [sl_rail_ieee802154_accept_frames()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-accept-frames)
> API. The Thread protocol always sets the FP bit to 1.

##### Implicit Broadcast

The
[SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-e-option-implicit-broadcast)
option enables the MAC implicit broadcast feature. If the frame Version is 2 and
the frame does not include the destination PAN ID or destination address fields, the radio treats the
packet as a broadcast packet. If this option is disabled, the radio typically
filters such packets.

##### Runtime PHY Reconfiguration with SUN FSK and Wi-SUN PHYs

###### 2-byte Header Options

Call
[sl_rail_ieee802154_config_g_options()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-config-g-options)
with the
[SL_RAIL_IEEE802154_G_OPTION_GB868](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-g-option-gb868)
option to support dynamic CRC and whitening reconfiguration coded in a 2-byte
PHR PHY.

In this mode, RAIL automatically reads the PHR field of the transmitted and
received packet, and reconfigures the radio during frame reception. For example, it
enables or disables whitening for the payload and selects 2- or 4-byte CRC
configuration based on the FCS and whitening bitfields.

Although the API name might be misleading, it enables all the IEEE 802.15.4g
features.

###### Dynamic FEC

To enable or disable IEEE 802.15.4g dynamic FEC feature, use the
[SL_RAIL_IEEE802154_G_OPTION_DYN_FEC](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-g-option-dyn-fec)
option.

SFD field (implemented as the sync word) indicates whether the rest of the
packet is FEC encoded or not. As the SFD field is configured as the sync word on
the EFR32 radio platform, it enables dual sync word detection to detect whether
FEC should be enabled or not.

Address Filtering and FEC work together only on radio platforms where
[SL_RAIL_IEEE802154_SUPPORTS_G_DYN_FEC](/rail/3.1.0/rail-api/features#sl-rail-ieee802154-supports-g-dyn-fec-1)
is defined.

For more information, see [IEEE
802.15.4](/rail/3.1.0/rail-api/ieee802-15-4).

###### Mode Switch

The mode switch mechanism enables a device using the MR-FSK PHY to change its
symbol rate or modulation scheme on a packet-by-packet basis. You can enable or
disable this feature by using the
[SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-g-option-wi-sun-mode-switch)
option.

A specific mode switch PPDU informs the receiver of the mode switch and
specifies the new PHY mode for the next PPDU.

To switch the receiver to a higher-rate PHY mode, send a mode switch packet that
indicates the new PHY mode. The mode switch packet is an FSK-modulated 2-byte
PHY header with no payload.

To generate the mode switch frame, use the pre-generated value. For more
details, see [previous page](03-header-usage#mode-switch-frame) and [IEEE
802.15.4](/rail/3.1.0/rail-api/ieee802-15-4).

> **Note**: This is the mode switch feature defined by Wi-SUN, not the outdated
> IEEE 802.15.4g standard.

#### RAILtest Examples

The following examples demonstrate basic IEEE 802.15.4 RAIL features. These
tests typically require RAILtest nodes: one transmitter and one receiver. Run
the commands on both nodes unless stated otherwise.

For simplicity, these examples use the built-in 2.4 GHz 250 kbps O-QPSK PHY and
SubGHz GB PHYs.

##### Applying a PHY from RAIL

```sh
rx 0 // Configs can be loaded only in radio Idle state
config2p4GHz802154
// or
config863GHz802154
// or
config915MHz802154
rx 1 // Make the RX active
// or
tx 1 // Transmit a packet
```

The default payload in the RAILtest application is configured to transmit
16-byte frames. When you load SubGHz PHYs, the application also updates the
first two bytes of the payload (the PHR) to match this default configuration,
unless you have already changed the payload.

To set different payload lengths, see the next example.

Use the `getChannel` command to check the current channel.

Use the `setTxPayload` command to configure the payload. The first argument
specifies the start offset, and subsequent arguments specify the payload bytes.
This allows you to modify the payload partially. To print the configured
payload, use the `printTxPacket` command.

By default, the Rx and Tx FIFO sizes in RAILtest are 512 bytes. This can be a
limitation for SUN frame formats, which support frames up to 2048 bytes.

##### Variable Length Payload

###### PHR setup in RAILtest

RAILtest provides the `set802154phr` command to configure the PHR for the Tx
packet. It sets the length field based on the value configured by the
`setTxLength` command (or 16 bytes by default). The command `setTxLength`
defines the payload length from RAIL's perspective. This value includes the PHR
length but excludes the FCS length, which is the opposite of how the length is
defined in the PHR. The `set802154phr` command adjusts this difference. For
example, after `setTxLength 16`, assuming 1-byte PHR and 2-byte FCS,
`set802154phr` sets the length field to `16-1+2=17` bytes.

To perform this conversion and format the PHR correctly, `set802154phr` requires
additional configuration, which you pass as command arguments:

- format  
  - 0 for 1B PHR  
  - 1 for 2B PHR (SUN-FSK)  
  - 2 for SUN-OFDM 4B PHR  
  - 3 for SUN-OQPSK 4B PHR
- option 1  
  - FCS type for SUN-FSK  
  - rate for SUN-OFDM  
  - spreading for SUN-OQPSK
- option 2  
  - whitening for SUN-FSK  
  - scrambler for SUN-OFDM  
  - rate for SUN-OQPSK

The second and third arguments can be omitted for a 1-byte PHR.

The 863 and 915 MHz built-in PHYs limit the payload length to 127 (`0xFE`).

Use the `configRxOptions 0x1` to store the CRC on valid packet reception. This
also prints the CRC to the console.

##### Address Filtering

This example uses the 2.4 GHz PHY.

###### Enable Address Filtering

Hardware-accelerated MAC features, such as frame and address filtering, are
enabled using the `enable802154` command.

```sh
rx 0
config2p4GHz802154
enable802154 rx 100 192 1000
rx 1
```

The default packets transmitted after these commands won't be received on the RX
node, because the 802.15.4 mode automatically enables filtering without any
address defined (except broadcast messages).

To receive packets without configuring addresses, format a valid broadcast
message.

###### Formatting Broadcast Message

Configure the Frame Control Field as follows. Pay attention to bit endianness.

- Frame Type = `0b000` (Beacon)
- Security Enabled = `0b0`
- Frame Pending = `0b0`
- AR = `0b0`
- PAN ID Compression = `0b0`
- Reserved = `0b0`

The first byte of the PSDU is `0x00`.

- Sequence Number Compression = `0b0`
- IE Present = `0b0`
- Destination Addressing Mode = `0b10` (Short, 16-bit)
- Frame Version = `0b0`
- Source Address = `0b10` (Short, 16-bit)

The second byte is `0x88`.

The FCF field is followed by the Sequence Number. This is a random number; we
can set it arbitrarily in this example:

- Sequence Number = `0x00`

The third byte is `0x00`.

Set the Addressing fields next to the Sequence Number starting by the
Destination:

- Destination PAN ID = `0xFFFF` (Broadcast)
- Destination Address = `0xFFFF` (Broadcast)
- Source PAN ID = `0x1234`
- Source Address = `0x5678`

The next 8 bytes are `0xFF 0xFF 0xFF 0xFF 0x34 0x12 0x78 0x56`.

And finally, we add 1 byte of MAC payload to the packet:

- Payload data = `0x55`

The last byte configured in the Tx payload is `0x55`.

The total length of the packet is 15 bytes, including the header (i.e., the PHR
field). Set the first byte according to Example 1.

- `FL = PSDU_LEN = 14 = 0x0E` (11B MHR + 1-byte payload + 2-byte CRC)

```sh
setTxPayload 0 0x0E 0x00 0x88 0x00 0xFF 0xFF 0xFF 0xFF 0x34 0x12 0x78 0x56 0x55
             | PHR |   FCF   | SN | D. PAN  | D. Addr.| S. PAN  | S. Addr | Payl.|
```

This packet is now received without defining the address of the receiver.

##### Short Address Example

Next, set up an address on the receiver node.

The `setPanId802154` command configures the PAN ID of the device and
`setShortAddr802154` sets the Short Address.

To keep the example simple, set the PAN ID and Address on the RX node to 0x5555
and 0xAAAA, respectively.

```sh
// Tx node

setPanId802154 0x1234
setShortAddr802154 0x5678

// Rx node

setPanId802154 0x5555
setShortAddr802154 0xAAAA
```

Now send a message addressed to the receiver node, keeping all other packet
parameters the same:

```sh
setTxPayload 0 0x0E 0x00 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
```

Setting the PAN ID and Short Address on the transmitter does not affect packet
transmission.

At this point, you can verify that changing a single bit in the Destination
Address or PAN ID prevents the Rx node from receiving the packet:

```sh
                                           |
setTxPayload 0 0x0E 0x00 0x88 0x00 0x55 0x57 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
// or
setTxPayload 0 0x0E 0x00 0x88 0x00 0x55 0x55 0xAE 0xAA 0x34 0x12 0x78 0x56 0x55
                                                |
```

However, RAIL supports multiple addresses and PAN IDs defined at the same time.

You can register a new address by passing a second, optional argument to the
`setPanId802154` and `setShortAddr802154` commands.

To receive the previous two wrongly formatted packets, use the following
commands:

```sh
// Rx node

setPanId802154 0x5755 1
setShortAddr802154 0xAAAA 1

setPanId802154 0x5555 2
setShortAddr802154 0xAAAE 2
```

Notice that the PAN ID and the address must be defined in pairs on a given
index. The following packet still can't be received with the registered PAN ID
and Short Address pairs:

```sh
setTxPayload 0 0x0E 0x00 0x88 0x00 0x55 0x57 0xAE 0xAA 0x34 0x12 0x78 0x56 0x55
                                           |    |
```

##### Long Address Example

As a last address filtering example, receive a packet using the long address.

Set the Source address to `0x0123456789ABCDEF` with the `setLongAddr802154`
command.

The Tx packet changes:

- Destination address = `0b11` (Long, 64 bit)

The second byte of the FCF is `0x8C`.

- Destination address is now four times longer (8 bytes)

The addressing fields (14 bytes) are: `0x55 0x55 0x01 0x23 0x45 0x67 0x89 0xAB
0xCD 0xEF 0x34 0x12 0x78 0x56`.

- Add 6 bytes to the PHR:
- `FL = PSDU_LEN = 20 = 0x14` (17B MHR + 1B payload + 2B CRC)

```sh
setTxPayload 0 0x14 0x00 0x8C 0x00 0x55 0x55 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF 0x34 0x12
             | PHR |   FCF   | SN | D. PAN  |     Destination Long Address          | S. PAN  |
0x78 0x56 0x55
 S. Addr | Payl.|

// or load it in two commands if the default argument length does not let the command pass in one run

setTxPayload 0  0x14 0x00 0x8C 0x00 0x55 0x55 0x01 0x23 0x45 0x67
setTxPayload 10 0x89 0xAB 0xCD 0xEF 0x34 0x12 0x78 0x56 0x55
```

Don't forget to increase the maximum packet length on the transmitter if needed:

```sh
setTxLength 19
```

As a complete example to send and receive a packet with a long address, use the
following commands after resetting the devices:

```sh
// Rx Node

rx 0
config2p4GHz802154
enable802154 rx 100 192 1000
rx 1
setPanId802154 0x5555
setLongAddr802154 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF

// Tx Node

rx 0
config2p4GHz802154
enable802154 rx 100 192 1000
rx 1
setTxPayload 0  0x14 0x00 0x8C 0x00 0x55 0x55 0x01 0x23 0x45 0x67
setTxPayload 10 0x89 0xAB 0xCD 0xEF 0x34 0x12 0x78 0x56 0x55
setTxLength 19
```

In the examples above, the transmitted frame was a Beacon type message. By
default, enabling IEEE 802.15.4 mode, all frame types are enabled to receive. To
filter out or reenable messages with different frame types, use the
`acceptFrames` command.

The command's argument sets which frames can be received:

```sh
acceptFrames <MAC command> <ACK> <Data> <Beacon> [<Multipurpose>]
```

For example, after the following command, the receiver rejects data and Beacon
type frames, but accepts ACK and MAC command frames.

```sh
acceptFrames 1 1 0 0
```

###### Notes on Address Filtering

Broadcast messages are always received, regardless of the configured addresses.

You can deactivate an address by setting it to the broadcast address (0xFFFF) at
the corresponding index.

```sh
setPanId802154 0xFFFF <index>
setShortAddr802154 0xFFFF <index>
```

802.15.4 Address Filtering is fully disabled when the device is in promiscuous
mode.

```sh
setPromiscuousMode 1
```

There is no constraint between the short and the long address and the PAN ID;
you can set each of them independently at any index.

RAIL supports intra-PAN communication via multiple addresses defined using
different PAN IDs.

##### Auto-ACK

Auto-ACK is automatically enabled by enabling IEEE 802.15.4 mode using the
`enable802154` command.

```sh
rx 0
config2p4GHz802154
enable802154 rx 100 192 1000

rx 1
```

The third and fourth parameters of the `enable802154` command set the Rx-to-Tx
turnaround time and the ACK timeout in microseconds, respectively.

Start with the Tx packet and device configuration introduced in the previous
example:

```sh
setTxPayload 0 0x0E 0x00 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
```

To request an ACK message, the first byte of the FCF field must be changed:

1. Request ACK packet by setting the AR bit (5th bit).
2. Beacon frames cannot be acknowledged: set Frame type (3 LS bits) to `0b001`  
   (Data).

The first byte of the FCF shall be `0x21`:

```sh
setTxPayload 0 0x0E 0x21 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
```

Also, configure RAIL to expect an ACK packet after transmission. To do this, run
the following command:

```sh
configTxOptions 1
```

See a complete example for testing Auto-ACK feature below:

```sh
// Tx node

rx 0
config2p4GHz802154
enable802154 rx 100 192 1000
setPanId802154 0x1234
setShortAddr802154 0x5678
setTxPayload 0 0x0E 0x21 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
configTxOptions 1
rx 1

// Rx node

rx 0
config2p4GHz802154
enable802154 rx 100 192 1000
setPanId802154 0x5555
setShortAddr802154 0xAAAA
rx 1
```

Review the received ACK message's payload:

```sh
0x05 0x02 0x00 0x00
```

- `0x05`: This is the PHR and the Frame Length is 5
- `0x02 0x00`: The FCF field indicates that it is an ACK frame
- `0x00`: Sequence Number is identical to the packet which is acknowledged by  
  this packet

To change the Sequence Number only, you can use the following command:

```sh
setTxPayload 3 0x01
```

IEEE 802.15.4 ACK frames are automatically assembled in RAIL, there is no need
to set it up in the Rx node.

###### Notes on Auto-ACK

Auto-ACK is fully disabled when the device is in promiscuous mode.

```sh
setPromiscuousMode 1
```

To disable or reenable Auto-Ack feature use the following command:

```sh
autoAckPause <Rx> <Tx>
```

Changing the ACK payload or its length prevents RAIL from assembling the packet.
Printing the ACK packet does not display the automatically generated IEEE
802.15.4 ACK.

```sh
setAckPayload
setAckLength
printAckPacket
```

RAIL sets the frame pending bit in the ACK payload automatically.

##### Runtime PHY changes

###### Whitening and CRC Config

SUN-FSK PHYs support dynamic radio configuration changes, such as selecting a 2-
or 4-byte CRC (FCS type) and enabling or disabling whitening (DW) over the PSDU
field. RAIL fully supports these features. The radio is reconfigured on the fly
during packet transmission and reception based on the PHR.

This mode can be enabled by the `RAIL_IEEE802154_G_OPTION_GB868` option. Use the
`set802154g` command to enable the `G_OPTION`s.

```sh
// Tx node

rx 0
config915MHz802154
enable802154 rx 100 192 1000
set802154g 1
setPanId802154 0x1234
setShortAddr802154 0x5678
setTxPayload 2 0x00 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
setTxLength 14
rx 1
```

Then, for non-whitened & 4B FCS:

```sh
set802154phr 1 0 0 // non-whitened & 4B FCS
set802154phr 1 1 0 // non-whitened & 2B FCS
set802154phr 1 0 1 // whitened & 4B FCS
set802154phr 1 1 1 // whitened & 2B FCS

// Rx node

rx 0
config915MHz802154
enable802154 rx 100 192 1000
set802154g 1
setPanId802154 0x5555
setShortAddr802154 0xAAAA
rx 1
```

###### Dynamic FEC

The SUN-FSK protocol defines a dynamic FEC feature that is supported on certain
EFR32 device generations. The SFD field indicates whether FEC is enabled for the
transmitted or received packet.

This mode can be enabled by the `RAIL_IEEE802154_G_OPTION_DYNFEC` option. Use
the set802154g command to enable the `G_OPTION`s.

```sh
// Tx node

rx 0
enable802154 rx 100 192 1000

//set_appropriate_channel
setconfigindex <Y>
setchannel <X>

set802154g 3
setPanId802154 0x1234
setShortAddr802154 0x5678
setTxPayload 2 0x00 0x88 0x00 0x55 0x55 0xAA 0xAA 0x34 0x12 0x78 0x56 0x55
setTxLength 14
set802154phr 1 1 1 // whitened & 2B FCS
rx 1

// Rx node

rx 0
setchannel <set_appropriate_channel>
enable802154 rx 100 192 1000
set802154g 3
setPanId802154 0x5555
setShortAddr802154 0xAAAA
rx 1
```

Transmit packet without FEC encoding (using sync word #0):

```sh
configTxOptions 0
tx 1
```

Transmit packet without FEC encoding (using sync word #1):

```sh
configTxOptions 0x4
tx 1
```

To use this feature on supported platforms, contact technical support to create
an appropriate PHY.

The `set802154g` command requires an appropriate PHY configuration and idle
state.

### Power Amplifier Power Conversion Functions in RAIL 2.x

#### Power Amplifier Power Conversion Functions in RAIL 2.x

**This section replaces _AN1127: Power Amplifier Power Conversion Functions in RAIL 2.x_. Further updates to this application note will be provided here.**

In many wireless applications, due to limitations imposed by the transmission protocol, law, or energy constraints, it is critical to know the power output of a given device. However, this issue is complicated by the fact that output characteristics may vary drastically even for a given chip, based on the board or module onto which the chip is mounted, due to poor impedance matching, or due to parasitics. This application note outlines how to account for the variation across custom boards and applications for the Silicon Labs EFR32 family of chips. While the Proprietary Flex SDK is required for the procedures described in this document, the resulting calibration curves can be used with applications developed with Silicon Labs Connect, Zigbee, Bluetooth, and OpenThread SDKs. Customers developing with Z-Wave should refer to [https://www.silabs.com/community/wireless/z-wave/knowledge-base.entry.html/2020/03/03/z-wave_700_tx_powercalibrationandadjustment-YUiB](https://www.silabs.com/community/wireless/z-wave/knowledge-base.entry.html/2020/03/03/z-wave_700_tx_powercalibrationandadjustment-YUiB). Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

#### Overview: EFR32 Power Amplifiers and RAIL

The EFR32 families of chips each come equipped with Power Amplifiers (PAs) as follows:

- EFR32xG21  
  - A high-power 2.4 GHz PA (for power 20 dBm and lower)**  
  - A medium-power 2.4 GHz PA (for power 10 dBm and lower)  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG22  
  - A high-power 2.4 GHz PA (for power 6 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG23x02x  
  - A high-power Sub-GHz PA (for power 20 dBm and lower)**
- EFR32xG23x01x  
  - A high-power Sub-GHz PA (for power 14 dBm and lower)**
- EFR32xG24x02x  
  - A high-power 2.4 GHz PA (for power 20 dBm and lower)**
- EFR32xG24x01x  
  - A high-power 2.4 GHz PA (for power 10 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG25  
  - A single PA for OFDM operation  
  - A single PA for Sub-GHz (FSK) operation
- EFR32xG26x02x  
  - A high-power 2.4 GHz PA (for power 20 dBm and lower)**
- EFR32xG26x01x  
  - A high-power 2.4 GHz PA (for power 10 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG27x02x  
  - A high-power 2.4 GHz PA (for power 4 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG27x01x  
  - A high-power 2.4 GHz PA (for power 6/8 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)
- EFR32xG28x02x  
  - A high-power 2.4 GHz PA (for power 20 dBm and lower)**  
  - A high-power Sub-GHz PA (for power 20 dBm and lower)**
- EFR32xG28x01x  
  - A high-power 2.4 GHz PA (for power 14 dBm and lower)**  
  - A high-power Sub-GHz PA (for power 14 dBm and lower)**
- SixG301  
  - A high-power 2.4 GHz PA (for power 10 dBm and lower)**  
  - A low-power 2.4 GHz PA (for power 0 dBm and lower)

Each of these PAs has a unique number of discrete "power levels", which are
simply abstractions of the different register settings that control the active
PA. For each PA, the following power levels are available:

- EFR32xG21  
  - High-power 2.4 GHz: 1-180**  
  - Medium-power 2.4 GHz: 1-90  
  - Low-power 2.4 GHz: 1-64
- EFR32xG22  
  - High-power 2.4 GHz: 0-127**  
  - Low-power 2.4 GHz: 0-15
- EFR32xG23x02x  
  - High-power Sub-GHz: 0-240**
- EFR32xG23x01x  
  - High-power Sub-GHz: 0-240**
- EFR32xG24x02x  
  - High-power 2.4 GHz: 0-180**
- EFR32xG24x01x  
  - High-power 2.4 GHz: 0-90**  
  - Low-power 2.4 GHz: 0-15
- EFR32xG25  
  - "power levels" not supported; instead dBm is converted to powerSetting (see section    
    [dBm-to-powerSetting Mode](02-generating-the-piecewise-linear-segment-data-used-for-conversion))
- EFR32xG26x02x  
  - High-power 2.4 GHz: 0-180**
- EFR32xG26x01x  
  - High-power 2.4 GHz: 0-90**  
  - Low-power 2.4 GHz: 0-15
- EFR32xG27x02x  
  - High-power 2.4 GHz: 0-127**  
  - Low-power 2.4 GHz: 0-15
- EFR32xG27x01x  
  - High-power 2.4 GHz: 0-127**  
  - Low-power 2.4 GHz: 0-15
- EFR32xG28x02x  
  - High-power 2.4 GHz: 0-240**  
  - High-power Sub-GHz: 0-240**
- EFR32xG28x01x  
  - High-power 2.4 GHz: 0-240**  
  - High-power Sub-GHz: 0-240**
- SixG301  
  - "power levels" not supported; instead dBm is converted to powerSetting (see section    
    [dBm-to-powerSetting Mode](02-generating-the-piecewise-linear-segment-data-used-for-conversion))

> **Note**: that the use of 'high', 'medium', and 'low' in the names of these PAs
> refers to power consumption, not power output. It is possible, for instance, to
> configure the high-power PA to transmit at a lower dBm output than the low-power
> PA.

Maximum power/use of these PAs may be restricted by your specific OPN. See
the data sheet for more details regarding your particular part.

Although the number of power levels varies across different PAs, for any given
PA, a higher power level generally indicates a higher dBm output power. It is
important to realize that a PA power level does not always correspond to the
same dBm output power across boards and applications.

The power is set using `sl_rail_set_tx_power_dbm()` which sets the registers by
using values provided by a powersetting mapping table. `sl_rail_util_pa`
component provides the newer RAIL 3.0 PA utilities to help convert dBm to
hardware-specific PA powersetting values.
The ramp time and voltage for the PAs are set by calling
`sl_rail_util_pa_post_init()` after `sl_rail_init()`. The default
values are provided by sl_rail_util_pa_config.h file of the `sl_rail_util_pa`
component. Setting the power takes care of setting a sub-mode (High-power,
Low-power) automatically. It is recommended that a channel or PHY is correctly
established prior to setting the power through `sl_rail_set_tx_power_dbm()`.
`sl_rail_util_pa` component also provides
`sl_railcb_convert_ddbm_to_power_setting_entry()` which is used as a callback by
RAIL library to get a powersetting value for a certain deci-dBm.

It is recommended to build the applications for the specific boards as it pulls
correct board-specific configurations and thus helps to correctly pick a
powersetting table among the different options provided. Simplicity Studio
automatically takes care of this while building for an OPN.
Series 2 modules currently do not work with RAIL 3.0 PA plugin `sl_rail_util_pa`
and instead `rail_util_pa` plugin should be used. Silicon Labs plans to address this
limitation in a near-future release. If a project needs to be used for
both SoC and a module, it is recommended to pull in `sl_rail_util_compatible_pa`
which correctly pulls `sl_rail_util_pa` for SoC and `rail_util_pa` for module.

The `sl_rail_util_pa plugin` pulls in the `sl_rail_util_pa_tables` plugin which
provides PA mapping tables that convert between dBm powers and hardware-specific
PA power settings. Silicon Labs is moving away from RAIL 2.x's conversion method of
curves and towards mapping table that can have more than just power levels.
The component provides multiple options for different platforms and chooses one
default powersetting mapping table through `SL_RAIL_UTIL_PA_TABLE_HEADER`.

Multiple PA modes (2.4GHz, Sub-GHz, Linear OFDM) and different options for each
PA mode are provided when supported by the platform. For example, EFR32xG25
supports Linear OFDM and Sub-GHz, so it has two different tables to represent
each of them. Similarly EFR32xG28 supports 2.4GHz and Sub-GHz and therefore
has two different tables to represent each of them.
The rest of the series 2 parts and SixG301 support only one band and have one
set of powersetting tables.

Each powersetting table can be selected from
different options for `SL_RAIL_UTIL_PA_TABLE_HEADER`, this mainly depends on PAs
available on that chip. For example, on EFR32xG24x01x there is a 10 dBm PA and 0
dBm PA, so choices for SL_RAIL_UTIL_PA_TABLE_HEADER are:

- sl_rail_util_pa_dbm_powersetting_mapping_table_10dbm.h which provides  
  conversions for 10 dBm PA
- sl_rail_util_pa_dbm_powersetting_mapping_table_0dbm.h which provides conversions  
  for 0 dBm PA
- sl_rail_util_pa_dbm_powersetting_mapping_table_automode_0_10dbm.h that provides  
  conversions for 0 dBm PA for the range close to 0 dBm and otherwise conversions  
  for 10 dBm PA and automatically switches among them depending on the requested  
  power.

In RAIL 2.x, there was a concept of power level and the power level of the
active PA was controlled by the `RAIL_GetTxPower()` and `RAIL_SetTxPower()` APIs.
`RAIL_GetTxPowerDbm()` and `RAIL_SetTxPowerDbm()` also allowed users to interface
with dBm output power values, but they were merely utility functions that
combine calls to `RAIL_ConvertRawToDbm()`, `RAIL_ConvertDbmToRaw()`,
`RAIL_SetTxPower()`, and `RAIL_GetTxPower()`. They added no new functionality or
features on their own. Although these PA power levels add another layer of
complexity to PA control, they give the user much more control to account for
parasitics and impedance mismatch between the PA and a custom board. These APIs
are deprecated in RAIL 3.0.

RAIL 2.x allowed users to assign an exact dBm power to each of the PA power
levels for their custom boards through the functions `RAIL_ConvertDbmToRaw()`
and `RAIL_ConvertRawToDbm()`. Note that these functions convert between raw power
levels and deci-dBm, or dBm * 10, to allow for higher precision dBm values.
Though Silicon Labs provides a default implementation for these functions to do
the conversion, the user can also override these functions with other
algorithms, ranging from a highly precise but space-intensive lookup table for
all possible PA-power level combinations, to less robust solutions such as a
lookup table containing only a few power levels that correspond to the dBm
output power levels of interest (see [Alternative Methods to Convert between
Power Levels and dBm Output
Power](03-alternative-methods-to-convert-between-power-levels-and-dbm-output-power)
for more information on creating custom conversion functions).

For the default conversion function implementation in RAIL 2.x, Silicon Labs
used an 8-segment, piecewise linear curve fit of the mapping between PA power
levels and dBm output powers to convert between these quantities. On EFR32xG21
and EFR32xG23 chips, there was one curve for each PA. On EFR32xG22 and
EFR32xG24 chips, there was one curve for the high-power 2.4GHz PA. For these
PAs, this method provided a good balance between accuracy across power levels,
computational speed, and code size. The conversion for low-power 2.4GHz on
EFR32xG22 and EFR32xG24, which have fewer than 20 possible values, was handled
with a simple lookup table.

The section [Piecewise Linear Curve Fits](./02-generating-the-piecewise-linear-segment-
data-used-for-conversion.md) focuses on how to generate the curve data (slopes and
y-intercepts) for a custom application, similar to the default values currently found
in **pa_curves_efr32xg2x.h** in RAIL 2.8 and earlier versions and in
**sl_rail_util_pa_curves.h** in RAIL 2.9 and later versions. In other words, it assumes
that the existing methodologies found in `RAIL_ConvertDbmToRaw()` and `RAIL_ConvertRawToDbm()`
are appropriate for your application and will not be over-written, but that the parameters
for these functions need to be adjusted for the custom board.

This application note is not intended for use with Silicon Labs’ pre-certified
Wireless SiP and PCB modules. The power amplifiers on these parts have been
calibrated specifically to adhere to certain regulations. Trying to alter these
calibrations in software will cause the RAIL library to assert and lock the
chip, preventing further use until Silicon Labs’ default libraries are restored.

In the following procedures, use the **railtest** and
**pa_customer_curve_fits.py** script from RAIL 2.5 or higher in Proprietary Flex
SDK version 2.4.0 or higher, even if you are developing in an earlier
Proprietary Flex SDK 2.x version. Improvements to the app and script
that will subtly improve results. If you have already generated the CSV files
from the procedure in [Piecewise Linear Curve
Fits](02-generating-the-piecewise-linear-segment-data-used-for-conversion), you
can simply re-run the newer **pa_customer_curve_fits.py** on the existing CSVs.
There is no need to re-generate the CSVs by running the sweep again.

#### Generating Conversion Data

##### Piecewise Linear Curve Fits

Piecewise Linear Curves are used as a method of converting dBm into power level
in RAIL 2.x and is available in `rail_util_pa` plugin component.
The following steps explain how to generate the piecewise fit curves for the
following PAs:

- EFR32xG21: All PAs
- EFR32xG22: High-power 2.4 GHz
- EFR32xG23: All PAs
- EFR32xG24: High-power 2.4 GHz

The procedure uses the 2.4 GHz high-power PA on EFR32xG2x devices as an example,
but the same procedure is applicable to all the aforementioned PAs. For the
other PAs, which do not use the piecewise linear fit approach, see Lookup
Table Fits below.

1. In Simplicity Studio, generate a RAILtest application configured with the  
   desired PA, PA power source, and PA ramp time. The configuration process  
   depends on the Proprietary Flex SDK version. If you are using version 2.x  
   with Simplicity Studio 4, use Hardware Configurator (see _AN1115: Configuring  
   Peripherals for 32-Bit Devices using Hardware Configurator_ for more detail).  
   If you are using version 3.x with Simplicity Studio 5, use the Component  
   Editor to modify the **RAIL Utility, Power Amplifier** component. Build the  
   RAILtest application, and flash the resulting binary to the chip mounted to  
   the PCB you are trying to characterize.
2. Connect the RF output of the board (U.FL test connector, SMA connector, or  
   similar, with antenna disconnected from the RF path) to the input of a  
   spectrum analyzer. The spectrum analyzer should be in dBm peak detection mode  
   to sense values between approximately -30 to 20 dBm and centered on the base  
   frequency/channel for your PHY and channel combination. Make sure to account  
   for any cable / adapter loss in your measurements.
3. Connect to the RAILtest CLI and enter the command `sweepTxPower`. For more  
   information on RAILtest functionality and the CLI interface, see _Miscellaneous_  
   in the RAILtest User's Guide.
4. Your chip should begin a CW tone at power level 1. Record the power level and  
   dBm power measured on the spectrum analyzer in a CSV file in the format  
   `<POWER_LEVEL>,<ACTUAL_DBM_OUTPUT>` with one reading per line. Note that  
   unlike the conversion functions `RAIL_GetTxPowerDbm()` and  
   `RAIL_SetTxPowerDbm()`, which use deci-dBm values, values in these csv files  
   should be specified in dBm. Sample files **Vbatt_efr32xg21_HP.csv** and  
   **Vbatt_efr32xg24_HP_10dbm.csv** are included in the SDK for reference, and can be  
   found in the `/platform/radio/rail_lib/chip/efr32/efr32xg2x/characterization`  
   folder of the SDK installation.
5. Repeat step 4 for all power levels. Press Enter in the RAILtest CLI to  
   progress to the next power level.
6. From a terminal prompt, run the **pa_customer_curve_fits.py** script (in  
   /platform/radio/rail_lib/tools), with the `python pa_customer_curve_fits.py  
   <CSV_FILE>`. If you don’t already have them installed, you will need to  
   install the **numpy** and **pylab** python libraries. Running the commands  
   `pip install numpy` and `pip install matplotlib` will install those libraries  
   in the appropriate directories on your machine to be accessible by python.  
   The following figure shows an example of an intended result, after the  
   **pa_customer_curve_fits.py** script has been run on the  
   **Vbatt_efr32xg21_HP.csv** file from a terminal prompt.  
   > **Note**: The script also provides extra parameters such as –maxPower/-m and –increment/-i to accommodate the maximum power from the csv and to divide the data in segments of needed "increment" dBm steps.  
   ![pa_customer_curve_fits.py Script Results](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/pa-customer-curve-fits-usage.png)
7. If using multiple PAs, repeat steps 1-6 for the PA you did not characterize previously.
8. Create a copy of the PA curve file (here and in subsequent steps, "PA curve  
   file" refers to **pa_curves_efr32xg2x.h** in RAIL 2.8 and earlier versions,  
   and **sl_rail_util_pa_curves.h** in RAIL 2.9 versions and later depending on  
   the platform currently being characterized).  
   Copy the terminal output from the python script under the appropriate macro.  
   Note that there is one `RAIL_PA_CURVES_…` define for each combination of PA  
   and PA power source available for your hardware. You do not need to copy data  
   for a PA/PA power supply (`…_VBAT_…` or `…_DCDC_…`) combination that is not  
   being used. Additionally, update the `…_MIN_POWER` and `…_MAX_POWER` macros  
   to reflect the values you observed. The following figure shows an example of  
   the copying process, where the values from the previous figure have been  
   copied into the appropriate macros in a **sl_rail_util_pa_curves.h** file.  
   There is also an example of subGhz curve for EFR32xG23. Note how  
   `…MIN_POWER` and `…_MAX_POWER` macros have been updated.  
   ![Terminal Output Copied into a sl_rail_util_pa_curves.h file for EFR32xG21](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/xg21-curves-hp.png)  
   ![Example of subGHz curve in sl_rail_util_pa_curves.h file for EFR32xG23](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/xg23-curves-hp.png)
9. Update the hardware config `HAL_PA_CURVE_HEADER` header to point to your new  
   file. The figures illustrates where to update the header. The interface depends  
   on the tool used (Hardware Configurator in Proprietary Flex SDK 2.x, or  
   Component Editor in Proprietary Flex SDK 3.x).  
   ![Updating the Custom PA Curve Header File Name with Hardware Configurator](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/updating-the-custom-pa-curve-header-file-name-with-hardware-configurator.png)  
   ![Updating the Custom PA Curve Header File Name with Component Editor](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/updating-the-custom-pa-curve-header-file-name-with-component-editor.png)
10. For customers using only one or two of the available PAs, Silicon Labs  
    recommends removing references to these functions from  
    **pa_conversions_efr32.c** and from the `RAIL_DECLARE_TX_POWER` macros in  
    your new version of the PA curves file. Although not strictly necessary,  
    doing this can save substantial code size versus compiling in useless data  
    for a PA that is never engaged.

##### Lookup Table Fits

This information applies to the following PAs in RAIL 2.x:

- EFR32xG22: Low power 2.4 GHz
- EFR32xG24x01x: Low power 2.4 GHz

With only a few unique power levels, some PAs on some chip families use a simple
lookup table to translate power levels to output powers, as opposed to a more
code-size-intensive curve fit. Using the EFR32xG22 low-power PA as an example,
follow steps 1-5 in the previous section, but for step 4, place the results
directly into the RAIL_PA_CURVES_2P4_LP macro of the custom PA curves file.
These values should be entered as deci-dBm (for example, enter -100 to indicate
-10 dBm). A similar process can be followed for any other PAs using the lookup
table approach. The following two figures contain an example of this process.

![Running RAILtest’s sweepTxPower Command](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/running-railtest-s-sweeptxpower-command.png)

![Updating the deci-dBm Output Powers in the 2.4 GHz low-power PA Lookup Table](/power-amplifier-power-conversion-functions-in-rail-v2x/0.2/images/xg22-table-lp.png)

##### dBm-to-powerSetting Mode

A table in memory that contains a "powerSetting" for each supported dBm level is
provided for the EFR32xG25 and SixG301 families in RAIL 2.x and is the preferred
method for all platforms in RAIL 3.0. In RAIL 3.0, `sl_rail_util_pa` and
`sl_rail_util_pa_tables` plugin provide support for powersetting tables for all
platforms in RAIL 3.0. The table specifies the minimum and maximum dBm levels
that are supported, as well as the step size between entries in the table. The
default step size is 0.1 dBm. This allows for precise control over the output
power of the PA, making it possible to achieve the desired level of performance
across the entire range of supported dBm levels. To accomplish this, a new mode
has been added to the EFR32xG25 family that allows for a single PA to support
the entire range of supported dBm levels for both the OFDM and Sub-GHz (FSK) PAs.
Note that this new mode utilizes "power-Setting" instead of the traditional
"power levels" for the output power of the PA. As a result, the capability to
set a specific "raw" power level is no longer supported in this mode. Only the
setting of dBm levels from the table is supported in this mode. The
“powerSetting” table is also provided to the SixG301 family, but there is not a
special mode to use it.

###### OFDM

A powerSetting for OFDM is comprised of three primary components: the digital
gain, the slice level, and the filter gain. These fields are extracted from
powersetting value and are set up.These three components work together to
determine the overall power output of the PA for OFDM signals.

To ensure proper usage and optimal performance, it is important to adhere to the
valid ranges for the digital gain, slice level, and filter gain. The valid range
for the digital gain is 0 to 204 (the value is multiplied by 5 in RAIL,
resulting in a range of 0 to 1020), the valid range for the slice level is 0 to
191, and the valid range for the filter gain is 0 to 3.

In addition to the valid ranges, the following are the recommended ranges:
digital gain between 200 and 800, filter gain of 2.

To generate a table using the pa_dbm_mapping_table_generator.py script (in
platform/radio/rail_lib/tools), you need a CSV file containing the
necessary data for OFDM mode. The file should have a header row with column
names for:

- Digital gain
- Slice level
- Filter gain

Each subsequent row should contain data for a specific dBm level within the
desired range. Each column's data should be separated by a comma, and you can
add optional comments for each row using the "#" symbol. It is crucial to ensure
that the CSV file is properly formatted, with the correct data in each column
and the correct number of rows for the desired dBm range.

**Format of the OFDM PA CSV File**

|TXTRIMPASLICE|GAINDIG|FILGAIN|#dBm|
|---|---|---|---|
|x|x|x|#-317|
|x|x|x|#-316|
|x|x|x|#-315|
|x|x|x|#-314|

This table shows an example of how the CSV file should be formatted for
generating a table for OFDM mode. The first row is the header row, which
specifies the column names. Each subsequent row contains data on the power
settings for a specific dBm level, as well as an optional comment indicating the
corresponding dBm value. The data for each column is separated by a comma. It is
important to include a row for every dBm level within the desired range, with
the appropriate power setting values for each level. Be aware that the
"dBm" column in the table is preceded by a "#" symbol, which indicates that it
is a comment and will be ignored by the script.

###### Sub-GHz (FSK)

A powerSetting for Sub-GHz (FSK) mode is comprised of four primary components:
the fine current setting, the coarse current setting, the slice level, and the
stripe setting. Sub-GHz powersetting entry has fields of coarse current,
fine current, slice and stripe. These fields are extracted from the powersetting
entry using mask and shift and are set up. These four components work together
to determine the overall power output of the PA for Sub-GHz (FSK) signals.

The valid range for the fine current setting is 0 to 8, the valid range for the
coarse current setting is 0 to 31, the valid range for the slice level is 0 to
2, and the valid range for the stripe setting is 0 to 31.

In addition to the valid ranges, the following are the recommended ranges:
current fine of 4, and slice level between 1 and 2.

To generate a table using the pa_dbm_mapping_table_generator.py script (in
platform/radio/rail_lib/tools), you need a CSV file containing the
necessary data for Sub-GHz (FSK) mode. The file should have a header row with
column names for:

- Coarse current setting
- Fine current setting
- Slice level
- Stripe setting

Each subsequent row should contain data for a specific dBm level within the
desired range. Each column's data should be separated by a comma, and you can
add optional comments for each row using the "#" symbol. It is crucial to ensure
that the CSV file is properly formatted, with the correct data in each column
and the correct number of rows for the desired dBm range.

**Format of the Sub-GHz (FSK) PA CSV File**

|COARSE|FINE|SLICE|STRIPE|#dBm|
|---|---|---|---|---|
|x|x|x|x|#-317|
|x|x|x|x|#-316|
|x|x|x|x|#-315|
|x|x|x|x|#-314|

This table shows an example of how the CSV file should be formatted for
generating a table for Sub-GHz (FSK) mode. The first row is the header row, which
specifies the column names. Each subsequent row contains data on the power
settings for a specific dBm level, as well as an optional comment indicating the
corresponding dBm value. The data for each column is separated by a comma. It is
important to include a row for every dBm level within the desired range, with
the appropriate power setting values for each level. Be aware that the
"dBm" column in the table is preceded by a "#" symbol, which indicates that it
is a comment and will be ignored by the script.

###### Common

A common powerSetting format applies to:
**RAIL 2.x:**

- SixG301 family

**RAIL 3.0:**

- All Series 2 devices (except EFR32xG25 - see OFDM/Sub-GHz sections)  
  - EFR32xG21 (10 dBm, 20 dBm PA variants)  
  - EFR32xG22 (0 dBm, 6 dBm PA variants)  
  - EFR32xG23 (10 dBm, 14 dBm, 20 dBm PA with HP/MP/LP/LLP sub-modes)  
  - EFR32xG24 (0 dBm, 10 dBm, 20 dBm PA)  
  - EFR32xG26 (0 dBm, 10 dBm, 20 dBm PA)  
  - EFR32xG27 (0 dBm, 4 dBm, 8 dBm PA)  
  - EFR32xG28 (14 dBm, 20 dBm PA)  
  - EFR32xG29 (0 dBm, 8 dBm PA)  
  - EFR32xG2B (Sub-GHz variants)  
  - EFR32xG2D (14 dBm, 20 dBm PA)
- SixG301 family

The common powersetting entry is comprised of two main bitfields: the scalor and PA
sub-mode setting. The bitfield looks as below:
|15-14:sub-mode|13-8:unused|7-0:scalor|
The scalor is synonymous to power level in the
Lookup Table Fits section. The scalor is extracted using
SLI_RAIL_UTIL_PATABLE_SCALOR_MASK and the sub-mode is extracted using
SLI_RAIL_UTIL_PA_TABLE_SUBMODE_MASK and SLI_RAIL_UTIL_PA_TABLE_SUBMODE_SHIFT.
The sub-mode can have one of these values {0= High Power, 1= Medium Power, 2=
Low Power, 3 = Low Low Power}.

To generate a table using the pa_dbm_mapping_table_generator.py script (in
platform/radio/rail_lib/tools), you need a CSV file containing the
necessary data for Common powersetting. The --type input from the choices 10dBm
or 0dBm is needed for the script and that populates the correct sub-mode in the
generated powersetting table. Generated output will also have that appended
along with the scalor. The CSV file should have a header row with column names
for:

- Scalor

Each subsequent row should contain data for a specific dBm level
within the desired range. Each column's data should be separated by a comma; you
can add optional comments for each row using the "#" symbol. It is crucial that
the CSV file is properly formatted, with the correct data in each column and the
correct number of rows for the desired dBm range.

**Format of the Common(FSK) PA CSV File**

|Scalor|#dBm|
|---|---|
|x|#-317|
|x|#-316|
|x|#-315|
|x|#-314|

This table shows an example of how the CSV file should be formatted for
generating a table for Common mode for SixG301. The first row is the header row,
which specifies the column names. Each subsequent row contains data on the power
settings for a specific dBm level, as well as an optional comment indicating the
corresponding dBm value. The data for each column is separated by a comma. It is
important to include a row for every dBm level within the desired range, with
the appropriate power setting values for each level. Note that the "dBm" column
in the table is preceded by a "#" symbol, which indicates that it is a comment
and will be ignored by the script.

###### Generating the Table

The script **pa_dbm_mapping_table_generator.py** is located in the
`platform/radio/rail_lib/tools` directory. It takes data from the CSV file
specified with the `File` argument and generates a list of power setting values
based on the `-min` or `--minPower` and `-max` or `--maxPower` arguments. To
understand the CSV format for each respective mode, refer to the OFDM and Sub-GHz
sections above. Note that a `-t` or `--type` argument is also required, with a
default value of `OFDM`, to specify the type of curve.

It also accepts command-line arguments for:

- An optional flag `-f` or `--fem` to indicate whether the table is for a  
  front-end module (FEM) with a default value of False.
- An optional argument `-o` or `--output` to specify the output file for the  
  generated code.

The script has a default increment value for the dBm levels, which you can
customize as needed. Additionally, the script generates C code for defining the
table, including:

- The number of values
- The step size between dBm levels
- The minimum and maximum dBm levels
- The actual power setting values

Finally, the script outputs the generated C code to `stdout`. To use the
generated table, you should replace the applicable contents of the
plugin/pa-conversions/efr32xg25/ files with the output of the script.

Example on how to use the script

```sh
python3 tools/pa_dbm_mapping_table_generator.py plugin/pa-conversions/sixg301/RAIL_TX_POWER_MODE_10DBM_POWERSETTING_TABLE.csv -c 301 -min -320 -max 120 -t 10dbm

#output to a file 
python3 tools/pa_dbm_mapping_table_generator.py plugin/pa-conversions/sixg301/RAIL_TX_POWER_MODE_10DBM_POWERSETTING_TABLE.csv 
-c 301 -min -320 -max 120 -t 10dbm -o output.h

#Add a specific increment in deci-dBm using `-i`
python3 tools/pa_dbm_mapping_table_generator.py plugin/pa-conversions/sixg301/RAIL_TX_POWER_MODE_10DBM_POWERSETTING_TABLE.csv 
-c 301 -min -320 -max 120 -t 10dbm -i 10 -o output.h

```

###### Migrating from curves to powersetting mapping table

When you want to migrate to RAIL 3.0, you can use the script
`platform/radio/rail_lib/tools/convert_curves_to_tables_s2.py` to convert the
CSV used for existing curves to generate powersetting tables.

```bash
#### Example for xG24 HP mode, 20dBm max
python3 tools/convert_curves_to_tables_s2.py \
  chip/efr32/efr32xg2x/characterization/Vbatt_efr32xg24_HP_20dbm_vbat.csv \
  -c 24 \
  -p HP \
  -m 203 \
  -n -336 \
  -s 10 \
  -r lowest \
  -o /tmp/pa_table_xg24_hp_20dbm.h
```

Fill the appropriate powersetting_mapping_table.h with values for SL_RAIL_PA_TABLE_x_NUM_VALUES, SL_RAIL_PA_TABLE_x_STEP_DDBM, SL_RAIL_PA_TABLE_x_MAX_POWER_DDBM, SL_RAIL_PA_TABLE_x_MIN_POWER_DDBM and SL_RAIL_PA_TABLE_x.

Currently the naming used for RAIL 3.0 tables is SL_RAIL_PA_TABLE_x where x is 0
or 1.
All series-2 (other than EFR32xG25 and EFR32xG28) and SixG301 chips
support only one powersetting table which means only SL_RAIL_PA_TABLE_0 is
available but on EFR32xG25 and EFR32xG28, two PA modes are supported and so they
have SL_RAIL_PA_TABLE_0 and SL_RAIL_PA_TABLE_1.

The list below provides the PA modes supported for each part:

- EFR32xG21  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- EFR32xG22  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- EFR32xG23  
  - SL_RAIL_PA_TABLE_0 - Sub-GHz
- EFR32xG24  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- EFR32xG25  
  - SL_RAIL_PA_TABLE_0 - Sub-GHz  
  - SL_RAIL_PA_TABLE_1 - Linear OFDM
- EFR32xG26  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- EFR32xG27  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- EFR32xG28  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz  
  - SL_RAIL_PA_TABLE_1 - Sub-GHz
- EFR32xG29  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz
- SixG301  
  - SL_RAIL_PA_TABLE_0 - 2.4 GHz

#### Alternative Methods to Convert between Power Levels and dBm Output Power

For your application that uses RAIL 2.x, having highly granular dBm output
levels may not be necessary. Therefore, it may make sense to overwrite the
`RAIL_ConvertRawToDbm()` and `RAIL_ConvertDbmToRaw()` functions that Silicon Labs
provides. This example demonstrates how to simplify those functions to return
only a few values of interest. Doing this would also allow you to remove calls
to the `RAIL_InitTxPowerCurves()` function and `RAIL_DECLARE_TX_POWER_XXXX_CURVES`
macro. Removing these dependencies on the piecewise linear curve fits allows you
to reduce application code size significantly. In this example, the functions
are meant to work with common dBm values, such as 20, 13, 3, 0 and -10 (200,
130, 30, 0 and -100 deci-dBm, respectively).

```sh
RAIL_TxPowerLevel_t RAIL_ConvertDbmToRaw(RAIL_Handle_t railHandle,
                                         RAIL_TxPowerMode_t mode,
                                         RAIL_TxPower_t power)
{
  // Anything above this power is likely still an error, so it
  // should return an invalid value
  if (power >= RAIL_TX_POWER_MAX) {
    return RAIL_TX_POWER_LEVEL_INVALID;
  }
  if (mode == RAIL_TX_POWER_MODE_2P4_LP) {
    if (power >= 0) {
      return RAIL_TX_POWER_LEVEL_LP_MAX;
    } else if (power >= -100) {
      return 2;
    } else {
      return 1;
    }
  }
  if (mode == RAIL_TX_POWER_MODE_2P4_HP) {
    if (power >= 200) {
      return RAIL_TX_POWER_LEVEL_HP_MAX;
    } else if (power >= 130) {
      return 93;
    } else if (power >= 30) {
      return 33;
    } else if (power >= 0) {
      return 22;
    } else if (power >= -100) {
      return 7;
    } else {
      return 1;
    }
  }
  if (mode == RAIL_TX_POWER_MODE_SUBGIG) {
    if (power >= 200) {
      return RAIL_TX_POWER_LEVEL_SUBGIG_MAX;
    } else if (power >= 130) {
      return 86;
    } else if (power >= 30) {
      return 26;
    } else if (power >= 0) {
      return 18;
    } else if (power >= -100) {
      return 6;
    } else {
      return 1;
    }
  }
  // return an error value if no PA is initialized
  return RAIL_TX_POWER_MIN;
}
RAIL_TxPower_t RAIL_ConvertRawToDbm(RAIL_Handle_t railHandle,
                                    RAIL_TxPowerMode_t mode,
                                    RAIL_TxPowerLevel_t powerLevel)
{
  if (mode == RAIL_TX_POWER_MODE_2P4_LP) {
    if (powerLevel >= RAIL_TX_POWER_LEVEL_LP_MAX) {
      return 0;
    } else if (powerLevel >= 2) {
      return -100;
    } else {
      return 1;
    }
  }
  if (mode == RAIL_TX_POWER_MODE_2P4_HP) {
    if (powerLevel >= RAIL_TX_POWER_LEVEL_HP_MAX) {
      return 200;
    } else if (powerLevel >= 93) {
      return 130;
    } else if (powerLevel >= 33) {
      return 30;
    } else if (powerLevel >=22) {
      return 0;
    } else if (powerLevel >= -7) {
      return -100;
    } else {
      return -250;
    }
  }
  if (mode == RAIL_TX_POWER_MODE_SUBGIG) {
    if (powerLevel >= RAIL_TX_POWER_LEVEL_SUBGIG_MAX) {
      return 200;
    } else if (powerLevel >= 86) {
      return 130;
    } else if (powerLevel >= 26) {
      return 30;
    } else if (powerLevel >= 18) {
      return 0;
    } else if (powerLevel >= 6) {
      return -100;
    } else {
      return 1;
    }
  }
  // return an error value if no PA is initialized
  return RAIL_TX_POWER_MIN;
}
```

## PHY Development

### RAIL PHY Development

The content in this section is related to the working directly with the physical layer using tools and features provided with RAIL in the Proprietary SDK. This is configurable only when using RAIL or Connect. The content includes theory of and basic information on configuring the EFR32 radio, measurement results and recommendations to comply with various standards, as well as guides on how start from scratch or how to set up the radio to be compatible with an existing setup.

- [**Proprietary Radio Configurator Guide**](/rail/3.1.0/proprietary-radio-configurator-guide): Describes the radio configurator GUI for RAIL framework applications. With it, you can create standard or custom radio configurations on which to run your RAIL-based applications. The role of each GUI item is explained.
- [**EFR32 Series 1 Long Range Configuration Reference**](/rail/3.1.0/efr32-series-1-long-range-configuration): Introduces the long-range radio profile, describes its development, and examines underlying details that enable it to realize extended range. Instructions for using example applications are included.
- [**EFR32 Series 2 Long Range Configuration Reference**](/rail/3.1.0/efr32-series-2-long-range-configuration): Describes how to test long range performance on EFR32 Series 2 devices using Simplicity Studio 5 and Silicon Labs development hardware.
- [**EFR32 RF Evaluation Guide**](rail/3.1.0/efr32-rf-eval-guide.pdf): Describes using RAILTest to evaluate radio functionality, as well as peripherals, deep sleep states, etc. With it you can fully evaluate the receiving and transmitting performance and test RF functionality of development kit hardware or custom hardware.

### Proprietary Radio Configurator Guide

#### Proprietary Radio Configurator Guide

> **Note: This section replaces _AN1253: EFR32 Radio Configurator Guide_. Further updates to this application note will be provided here**.

This document describes the Radio Configurator tool provided as part of
Simplicity Studio® for Proprietary applications. With the help of the Radio
Configurator, users can create standard or custom radio configurations for their
RAIL- or Connect-based radio applications. This document explains the role of
each item in the configuration.

If you are working with Proprietary SDK 2.7.n in Simplicity Studio 4, see
[AN971: EFR32 Radio Configurator
Guide](https://www.silabs.com/documents/public/application-notes/an971-efr32-radio-configurator-guide.pdf)
for RAIL in Simplicity Studio 4.

#### Radio Configuration Flow

Once an EFR32-based project that uses Proprietary protocol (either a project in
a proprietary SDK, or a DMP project) has been created in Simplicity Studio (as
described in [Silicon Labs Flex SDK v3.x Getting Started
Guide](https://docs.silabs.com/rail/latest/proprietary-flex-sdk-v3x-quick-start-guide/))
an .slcp project file is created and an _Overview_ tab is opened. The _Radio
Configurator_ can be opened from the _Configuration Tools_ tab,  (For some
examples, the Radio Configurator might open on project creation). All the radio
configurator settings are stored at config/rail/ in the
_radio_settings.radioconf_ file.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-radio-configurator-start-light.png)

All the parameters in the Radio Configurator are arranged in cards, some of
which are grouped together. Each card contains entries that logically go
together. Different radio profiles (see [Protocols](#protocols)) offer different
views and parameter sets as a profile is a high-level view of the parameter set
valid for and describing a given radio link.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-radio-configurator-params-light.png)

A radio configuration has two hierarchical levels: Protocol level and Channel
Group level. A radio configuration can contain multiple protocols and a protocol
can have multiple channel groups defined.

##### Protocols

Protocols are complete radio configurations that can be switched using the
[sl_rail_config_channels()](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-config-channels) API, or can be used in Dynamic Multiprotocol
applications. For Channel Group definitions see [Channel
Groups](#channel-groups).

To configure a protocol, first **select a predefined PHY** configuration, then
**customize** it to meet your needs.

First, look at the **General Settings** card. Select a radio profile in the
**Select radio profile** drop-down menu. A radio profile may be any supported
radio link technology. These technologies can be bound by standards (for example
the Sigfox or WMBus protocols) or can be fully customized. The fully
customizable profile is called the **"Base Profile"**.

Once the radio profile has been selected, the next step is to select a radio PHY
(radio configuration) in the **Select a radio PHY** drop-down list. Each profile
has "built-in" configurations ready to use.

Once the radio profile and radio PHY have been selected, users can review the
**profile options**. By default, no changes are allowed, fields are hidden. To
enable customize, use the **Customized** switch on the **General Settings**
card. This allows access to all the parameters defined by the profile.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-radio-configurator-editing-light.png)

**Important notes:**

1. If you select a "built-in" PHY, and then switch to "Customized ", the Radio  
   Configurator retains the property values of the "built-in" PHY. You can edit  
   the values, but can also revert to the defaults.
2. If you switch to “Customized” mode, we **recommend unchecking all “Advanced”  
   ** properties, as those are fine-tuned for the “built-in” PHY, and may not be  
   the optimal choice for the modified PHY. This way those parameters get  
   auto-calculated, and users can experiment with the fine tuning starting up  
   from the calculated values. To keep the improved performance achieved by the  
   original optimization, only minor changes should be made. For example, <100  
   MHz change in carrier frequency, or a different frame length configuration.
3. If you switch customization off, your **modifications will be reverted** to  
   the property values of the “built-in” PHY.
4. Each menu item in the Navigation pane (on the left) is represented by a card  
   in the main editor panel (on the right). **Cards can be hidden** by clicking  
   the corresponding “eye” icon on the Navigation panel.

Based on the selected radio profile, customizable options may be restricted. For
example, if a radio profile is selected that is bound by a standard, the profile
options only allow users to set the base frequency. All other options are preset
according to the standard.

##### Channel Groups

Each protocol configuration includes one or more channel group configurations.
Channel groups define one or more (sequential) channels, with a constant channel
spacing between them. Channel groups can differ in the radio configuration both
from each other and from the parent protocol. By default, a channel group
configuration includes only the **General Settings** and **Channel
Configuration** cards. Additional parameters defined by the Protocol can be
accessed for customization on a channel group basis by sliding the
**Customized** switch on the corresponding card. Channel groups can also be
completely overridden to a predefined PHY by checking the **Select radio PHY**
box.

RAIL automatically detects when hopping to a new channel requires hopping
between channel groups. The configured property values defined by the channel
group will be applied automatically for the new channel. This enables users to
define virtual channels to the same physical frequency, but with different
configuration settings.

The order of the channel groups does not matter, but could be reordered to help
visually. A channel number should only occure once for each protocol.

For more on Multi-PHY configuration, see the example in [Multi-PHY Configuration
Example](07-multi-phy-config-example).

##### Finalizing a Configuration

When a parameter is modified from its pre-loaded value (inherited from a
protocol or a predefined config), a revert icon will show up next to it:

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-modified-property-light.png)

Each input field has an **Information** icon next to it, which opens the
embedded version of this user guide at the relevant section. You can also reach
the documentation using the **[View Manual]** control at the top right corner of
the perspective.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-information-access-light.png)

Finally, the Radio Configurator **generates an output upon saving the file**.
The generated files are called _rail_config.c_, and _rail_config.h_ and
_radioconf_generation_log.json_ and are located in the autogen/ folder of your
project. These files get also generated upon the creation of a project.

##### Other Radio Configurator Controls

The Radio Configurator hosts several features, to simplify the work with
multiple protocols and PHY configurations. This chapter discusses the tools
highlighted by red rectangles on the following figure.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-controls-light.png)

1. The tool bar in the top left corner enables the following self-explanatory  
   functions:  
   - Add another Protocol Configuration  
   - Add another Channel Group  
   - Duplicate a selected entry (Protocol Configuration or Channel Group)  
   - Move selected item up or down  
   - Load a legacy .isc or .radioconf file  
   - Delete a selected entry (Protocol Configuration or Channel Group)
2. The Search window enables real-time filtering of input parameters. Example:  
   typing AGC will hide all the input fields, except those having AGC in the  
   name.
3. The Channels Overview card summarizes the physical frequency assignments for  
   the Channel Groups added under the selected Protocol Configuration.

#### Radio Parameters

##### General Settings

###### Protocol Name (Protocol only)

- Description: Configures the name of the [sl_rail_channel_config_t](https://docs.silabs.com/rail/latest/rail-api/sl-rail-channel-config-t) struct for  
  the protocol. The Radio Configurator will convert this into a C-compatible  
  variable name.
- Unit: String

###### Channel Group Name (Channel Group only)

- Description: Configures the name of the [sl_rail_channel_config_entry_t](https://docs.silabs.com/rail/latest/rail-api/sl-rail-channel-config-entry-t)  
  struct for the given channel group, and will be used for its phyConfigDeltaAdd  
  and attr if necessary and/or possible for the protocol. The configurator will  
  convert this into a C-compatible variable name.
- Unit: String

###### Select radio profile (Protocol only)

- Description: Selects the radio profile for the given protocol. A profile is a  
  high-level view and parameter set valid for and describing a given radio link,  
  for example the WMBUS or Sigfox standards.

###### Select radio PHY 

- Description: Selects the radio PHY (low-level radio configuration) for the  
  given protocol or channel group. Each radio profile has "built-in"  
  configurations ready to use. Even for a custom PHY configuration, starting  
  with a built-in config best matching the user’s application and then  
  customizing it is recommended (see next field).

###### Customized

- Description: Unlocks all the customization features, parameter sets to create  
  custom PHY configurations.
- Note: All the customizations revert to default state determined by the  
  selected base configuration (radio PHY) once this field gets toggled off.

##### Channel Configuration (Channel Group only)

###### First channel number

- Description: Sets the first channel number in the channel group. The frequency  
  of this channel will be Base_frequency + (First Channel Number – Channel  
  Number Offset) * Channel spacing.
- Min value: 0
- Max value: 65535

###### Last channel number

- Description: Sets the last channel number in the channel group. The frequency  
  of this channel will be Base_frequency + (Last Channel Number – Channel Number  
  Offset) * Channel spacing.
- Min value: 0
- Max value: 65535

###### Channel number offset

- Description: Sets the channel number offset in the channel group. The  
  frequency of any channel will be Base_frequency + (Channel Number – Channel  
  Number Offset) * Channel spacing. Generally, this should be the same as the  
  First Channel Number, so the first channel will be on the base frequency.  
  When disabled, the Channel Number Offset is equal to the First Channel Number.
- Min value: 0
- Max value: 65535

###### Transmit Power Limit

- Description: Limit the transmit power of the given channel group. RAIL will  
  automatically lower the transmit power when changing to these channels (if  
  needed), and will not allow setting higher transmit power. If a channel is  
  available with various power limits, RAIL will choose based on the order and  
  the configured TX power. For example, if you have a channel limited to 10 dBm  
  and one unlimited, and the limited channel is defined first, RAIL will select  
  the limited channel up to 10 dBm, and the unlimited above that. This is useful  
  if you need to add some limitation (e.g. different shaping filter) at high  
  power to pass compliance testing. PA conversion should be set up to use this,  
  see [Power Amplifier Power Conversion Functions in RAIL  
  2.x](https://docs.silabs.com/rail/latest/power-amplifier-power-conversion-functions-in-rail-v2x/)  
  for details.  
  When disabled, transmit power is not limited on the channel group.
- Unit 0.1 dBm
- Min value: -3276.8 dBm (further limited by the part’s minimum Tx power)
- Max value: 3276.7 dBm (further limited by the part’s maximum Tx power), or  
  unlimited when disabled

##### Operational Frequency

The operational frequency card contains entries for setting the operational
frequency, also referred to as the base channel frequency, as well as the
channel spacing value. The channel spacing value is used for relative frequency
configuration, where a frequency can be configured to be so many channel spacing
away from the base channel frequency. The channel number can be passed to the
[sl_rail_start_tx()](https://docs.silabs.com/rail/latest/rail-api/packet-tx#sl-rail-start-tx) and [sl_rail_start_rx()](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-start-rx) API functions.

###### Base Channel Frequency

- Description: Sets the base channel frequency/operational frequency
- Unit: MHz
- Min value: 100
- Max value: 2480
- Applicability: Tx and Rx

###### Channel Spacing

- Description: Sets the channel spacing frequency
- Unit: kHz
- Min value: 0
- Max value: 10 000
- Applicability: Tx and Rx

###### Injection side

- Description: If selected, overrides the default injection side. Usually,  
  supported chips use High Injection side.
- Unit: Enumerated list
- Applicability: Rx

##### Crystal

The Crystal card parameters configure the frequency and the accuracy of the
reference clock source (XO/TCXO). Note that crystal accuracy has two entries,
one for Rx and one for Tx. Both numbers are needed to calculate the worst-case
frequency offset between the nodes and to select a channel filter in the Rx side
accordingly. The suggested channel filter BW is calculated based on these
inputs, except for OOK modulation (for more information see [Channel
Bandwidth](#channel-bandwidth)).

An on-chip capacitor bank presents the desired load to the HF crystal, to
oscillate at the desired nominal frequency. It can be configured through the
[sl_rail_get_tune()](https://docs.silabs.com/rail/latest/rail-api/diagnostic#sl-rail-get-tune) and [sl_rail_set_tune()](https://docs.silabs.com/rail/latest/rail-api/diagnostic#sl-rail-set-tune) APIs after RAIL is initialized, or
through the CMU API before that. The RAIL APIs are for gracefully shutting down
RAIL before restarting the crystal with the new capbank setting. See further
notes on this topic in [AN0016.2 Oscillator Design
Considerations](https://www.silabs.com/documents/public/application-notes/an0016.2-efr32-series-2-oscillator-design-considerations.pdf)
(or
[AN0016.1](https://www.silabs.com/documents/public/application-notes/an0016.1-efm32-series-1-oscillator-design-considerations.pdf)
or
[AN0016.3](https://www.silabs.com/documents/public/application-notes/an0016.3-oscillator-design-considerations.pdf),
depending on the part generation).

###### RX Crystal Accuracy in ppm

- Description: Sets the Rx node crystal accuracy. Crystal accuracy depends on  
  the used crystal oscillator on the receiver side. Rx Crystal Accuracy and Tx  
  Crystal Accuracy attribute has impact on the receiver’s acquisition channel  
  bandwidth calculation.
- Unit: ppm
- Min value: 0
- Max value: 200
- Applicability: Rx

###### TX Crystal Accuracy in ppm

- Description: Sets the Tx node crystal accuracy. Crystal accuracy depends on  
  the used crystal oscillator on the transmitter side. Rx Crystal Accuracy and  
  Tx Crystal Accuracy attribute has impact on the receiver’s acquisition channel  
  bandwidth calculation.
- Unit: ppm
- Min value: 0
- Max value: 200
- Applicability: Tx

###### Crystal Frequency

- Description: Sets the crystal frequency
- Unit: MHz
- Min value: 38
- Max value: 40
- Applicability: Tx and Rx

###### RF Frequency Planning Band

> **Note**: Only for EFR32xG25

- Description: These options are optimized to provide the best performance for a  
  given band by optimizing the radio clock rate. Use this field if you have a  
  multi-PHY configuration across bands. In that case, you need to make the  
  Frequency Planning Band the same across all channel configs.
- Units:  
  |Enumerated Value|Frequency Range (MHz)|  
  |---|---|  
  |Band 928|928-960|  
  |Band 9xx|902-928|  
  |Band 896|896-901|  
  |Band 863|863-870|  
  |Band 780|779-787|  
  |Band 470|470-510|  
  |Band 450|below 470|
- Applicability: Tx and Rx

##### Modem

The Modem card contains the basic modem configuration entry fields including the
modulation format, bit rate, and symbol filtering.

###### Modulation type

- Description: This is an enumerated list that contains all the available  
  modulation formats. Note that if a modulation format is not supported on a  
  given platform it is not shown in the list.
- Unit: Enumerated list:  
  - FSK2: Frequency Shift Keying on two frequencies. Symbol shaping is also    
    available on this modulation format. See the [Shaping    
    Filter](#shaping-filter) entry description for details. For GFSK2 (Gaussian    
    Frequency Shift Keying) also select this item and pair it with a Gaussian    
    shaping filter.  
  - FSK4: Frequency Shift Keying on four frequencies. For GFSK4 (Gaussian    
    Frequency Shift Keying) also select this item and pair it with a Gaussian    
    symbol shaping filter.  
  - OOK: On Off Keying. OOK is an amplitude (or pulse) modulation where one    
    symbol is represented by the presence of an RF carrier while the other    
    symbol is represented by the absence of an RF carrier. Symbol shaping as    
    selected by the shaping filter entry is applied in the amplitude domain to    
    prevent spectral splatter induced by abrupt power level changes.  
  - MSK: Minimum Shift Keying. MSK is a phase modulation where one symbol is    
    represented by a positive 90 degree phase shift on the carrier (with regards    
    to the preceding symbol) and the other symbols is represented by a negative    
    90 degree phase shift (with regards to the preceding symbol). This scheme is    
    implemented as FSK2 whose frequency deviation is 1/4th of the data rate.    
    Please note that even though the deviation is fixed for MSK implementation    
    it still needs to be set in the deviation entry. Symbol shaping is performed    
    in the frequency domain.  
  - OQPSK: Only the half-sine shaped Offset Quadrature Phase Shift Keying is    
    supported. QPSK is a phase modulation format where symbols are represented    
    by 0, 90, 180 and 270 degree phase rotations with regards to the carrier.    
    OQPSK is a modified version of QPSK where only 90 degree phase shifts are    
    allowed at any one time. This is achieved by offsetting the symbol    
    transitions on the I (In-phase) and Q (Quadrature-phase) components by one    
    half of the symbol time. The resulted modulation format is without any    
    amplitude modulation content, which would otherwise be present at 180 degree    
    phase transitions. Finally, the half-sine symbol shaping in the IQ amplitude    
    domain is achieved by default without any shaping filter. Additional shaping    
    can be enabled to improve spectral (for example, roll-off) properties of the    
    signal if needed, but that would introduce at least inter symbol    
    interference due to signal distortion.
- Applicability: Tx and Rx

###### Chiprate

> **Note**: Beginning with the EFR32xG23, Chiprate is replaced by Bitrate.

- Description: This is the bit rate after channel coding and before symbol  
  coding. Channel coding is done in the FRC (Frame Controller) so the modulator  
  will get the already-coded bit stream. Most of the channel coding mechanisms  
  will add additional bits to the data stream. Therefore if the net (uncoded) DR  
  (data rate) is to be kept at a given level, the bitrate must be increased in  
  this entry scaled by the bit increase level at channel coding. For example if  
  block coding is configured whereby every block of 4 bits gets 3 parity bits  
  appended to it, the Bitrate entry must be calculated as DR_net*7/4. Otherwise,  
  at 2 level modulation formats (2FSK, OOK) one symbol carries one bit (or chip,  
  if symbol coding is applied).  
  Whenever DSSS symbol coding is applied, each bit is replaced by a longer bit  
  sequence (chip) in the modulator. It is important that in such cases the  
  Bitrate entry expects the bit rate as opposed to the chip rate. Chip rate up  
  (down) conversion is done automatically in the modulator (demodulator).  
  Another note of caution here is that some modulation formats (4FSK, OQPSK)  
  carry two bits in each symbol; therefore, the symbol rate will be half as much  
  as the bitrate. In such cases, it is still the bitrate that has to go in this  
  field.
- Unit: kbps
- Min value: 0
- Max value: 2000
- Applicability: Tx and Rx

###### Bitrate

> **Note**: For chips beforw EFR32xG23, Chiprate is used instead of Bitrate.

- Description: This is the bit rate before channel coding and before symbol  
  coding and usually referred to as baud rate. Using any channel coding, the  
  resulting data rate may be different from this value as these methods are  
  adding more bits to the initial data. For instance, if Manchester coding is  
  used, then the actual chip rate will be twice as high as the bit rate set in  
  this field. To know more about these changes, refer to the Chiprate  
  description.  
  Another note of caution here is that some modulation formats (4FSK, OQPSK)  
  carry two bits in each symbol; therefore, the symbol rate will be half as much  
  as the bitrate. In such cases, it is still the bitrate that has to go in this  
  field.
- Unit: kbps
- Min value: 0
- Max value: 2000
- Applicability: Tx and Rx

###### Deviation

- Description: This is the deviation parameter for FSK modulation formats. It is  
  the single sided deviation measured from the carrier. **At 4FSK modulation  
  formats, the deviation entry expects the inner deviation measured from the  
  carrier.** The outer deviation will be 3 times the configured inner deviation.  
  At MSK modulation format, the deviation must be set to 1/4th of the data rate.
- Unit: kHz
- Min value: 0
- Max value: 1000
- Applicability: Tx and Rx

###### Baudrate Tolerance

- Description: The demodulator’s timing synchronization circuitry allows for  
  compensation for baud rate errors with regard to the nominal configuration.  
  This entry expects the baud rate inaccuracy of the signal transmitted to the  
  receiver. Note that when high offsets are to be compensated for (typically >  
  2.5 %), the receiver measures the baud rate on the preamble section and  
  updates its nominal configuration to the measured value at preamble detection.  
  In such a scenario, it is recommended that the preamble length be longer by at  
  least 8 bauds compared to low offset cases.
- Unit: ppm
- Min value: 0
- Max value: 100 000 (10%)
- Applicability: Rx

###### Shaping Filter

- Description: The shaping filter entry describes the filtering type that is  
  applied to each symbol or chip before being modulated onto the carrier. Note  
  that the selected modulation format may restrict the selection of symbol  
  shaping filters. Also note that, for different modulation formats, filtering  
  may get applied in different domains such as frequency or amplitude.
- Unit: Enumerated list  
  - **None**: No symbol shaping filter is applied. Can be used to obtain true    
    FSK signals in 2FSK and 4FSK modulation formats or to obtain half sine    
    IQ-shaped OQPSK signals. In all other cases, some symbol shaping is    
    recommended.  
  - **Gaussian**: This filter implements Gaussian pulse symbol/chip shaping. Use    
    this filter to obtain GFSK modulation formats. The BT (Bandwidth Time    
    product) factor of the filter can be set in the Shaping Filter Parameter (BT    
    or R) entry.  
  - **Raised_Cosine**: This filter implements raised cosine symbol/chip shaping.    
    The R (roll-off or excess bandwidth) factor of the filter can be set in the    
    Shaping Filter Parameter (BT or R) entry.  
  - **Custom_OQPSK**: This filter is specific to the 802.15.4 250 kbps DSSS    
    OQPSK PHY to provide additional frequency domain shaping for better spectral    
    properties of the output signal.  
  - **Custom_PSK**: This filter implements a legacy third party MSK scheme where    
    the phase rotation between symbols is 2.2 radian (126 degree) and the peak    
    frequency deviation is close to the DR.
- Applicability: Tx

###### Shaping Filter Parameters (BT or R)

- Description: This entry either takes the BT (Bandwidth Time product) factor  
  for Gaussian or the R (roll-off) factor for Raised Cosine shaping filters. The  
  meaning of the entry field thus changes with filter selection. Note that the  
  entry has no effect if any of the other shaping filters are selected.
- Unit: N/A
- Min value: 0 (For BT a value of 0 is not allowed, practical values range from  
  0.25 to 1)
- Max value: 1
- Applicability: Tx

###### FSK symbol map

- Description: This entry defines the symbol mapping at FSK modulation formats.  
  With 2FSK, it is simply stating which frequency carries which bit; and there  
  are only two choices. At 4FSK modulation, however, where one frequency symbol  
  carries two bits of information, the number of choices increase to 24 out of  
  which 8 are implemented on the device.  
  This configuration is shared between the modulator and demodulator.
- Unit: Enumeration:  
  - **2FSK mode**    
    |2FSK|-dev|+dev|    
    |---|---|---|    
    |MAP0|0|1|    
    |MAP1|1|0|  
  - **4FSK mode**    
    |4FSK|-3dev|-dev|+dev|+3dev|    
    |---|---|---|---|---|    
    |MAP0|01|00|10|11|    
    |MAP1|11|10|00|01|    
    |MAP2|00|01|11|10|    
    |MAP3|10|11|01|00|    
    |MAP4|10|00|01|11|    
    |MAP5|11|01|00|10|    
    |MAP6|00|10|11|01|    
    |MAP7|01|11|10|00|
- Applicability: Tx and Rx

###### RX Direct Mode (heading level 7)

- Description: In RX Direct Mode, the demodulated (baseband) signal (Modem DOUT)  
  is continuously available on an IO pin – typically – for a processing host MCU.  
  The signal detection (i.e., Preamble and Syncword detections) is disabled in the  
  radio and should be performed by the host MCU. The demodulated data can be  
  either synchronous or asynchronous. In asynchronous Direct Mode, the data is  
  oversampled, and the data collection takes place before bit synchronization. In  
  synchronous Direct Mode, the Rx data is synchronized to a clock signal (Modem  
  DCLK) to leverage data sampling. These signals (Modem DOUT and Modem DCLK) are  
  available via PRS (can be connected to a GPIO) or on DBUS interface. RX Direct  
  Mode can be used with FSK2 and OOK modulations only. If Direct Mode is applied  
  on a given PHY, it is not recommended to use for Tx.

Please read the [Rx Direct Mode on
EFR32](https://docs.silabs.com/rail/latest/rail-developers-guide-direct-mode/)
article to understand the recommended setting for a give unsecase.

- Units:  
  - **DISABLED**: Direct Mose disabled.  
  - **SYNC**: Synchronous Direct Mode enabled.  
  - **ASYNC**: Asynchronous Direct Mode enabled.
- Applicability Rx

###### Enable Asynchronous Direct Mode (heading level 7)

- Description: This entry selects whether the synchronous or asynchronous RX  
  data is feeding the **configured direct mode output pin** when Rx direct mode  
  is enabled from RAIL. Synchronous RX data is only available in packet mode. It  
  starts outputting once sync word is detected and stops at the end of the  
  packet. Synchronous Rx data is synchronized to the recovered bit clock that  
  can also be output. Asynchronous Rx data is always outputting when direct mode  
  is enabled. It is not synchronized to a bit clock and typically has an  
  oversampling rate (with regard to the bit clock) in the range of 4-10. On  
  EFR32xG23 devices, this option was replaced with the **RX Direct Mode** field.  
  Please read the [Rx Direct Mode on  
  EFR32](https://docs.silabs.com/rail/latest/rail-developers-guide-direct-mode/)  
  article to understand the recommended setting for a give unsecase.
- Unit: N/A
- Applicability Rx

###### Maximum deviation offset expected in ppm  (heading level 7)

- Description: Defines the required deviation tolerance in parts-per-million for  
  RX.
- Unit: ppm
- Applicability: Rx

##### Packet Configuration

###### Frame General

###### Header Enable (heading level 7)

- Description: This control enables or disables the HEADER field in the packet.  
  Header can be used for [variable  
  length](05-length-configuration#variable-length) configuration or when  
  part of the frame has different CRC or Whitening configuration.
- Applicability: Tx and Rx

###### Frame Coding Method (heading level 7)

- Description: This control enables or disables coding methods applied to the  
  packet (that is, after the sync word, including the header, payload and CRC).  
  **From EFR32xG23 model and on these codings can be set under Symbol Encoding  
  Mode field on Symbol Coding card in the radio configurator.**
- Unit: Enumerated List  
  - **NONE**: No coding/decoding is applied.  
  - **UART_NO_VAL**: Start (0) and a single stop (1) bits are inserted before    
    and after each word to be transmitted, respectively. This feature is useful    
    for emulating direct UART data transfer over the air. Data whitening and/or    
    FEC are executed after coding in the Tx chain, and before decoding in the Rx    
    chain. There is no validation in the Rx chain; the start/stop bits are    
    removed from the frame, but not checked.  
  - **UART_VAL**: Start (0) and a single stop (1) bits are inserted before and    
    after each word to be transmitted, respectively. This feature is useful for    
    emulating direct UART data transfer over the air. FEC is executed after    
    coding in the Tx chain, and before decoding in the Rx chain. The Rx chain    
    uses validation, an error will result [SL_RAIL_EVENT_RX_PACKET_ABORTED](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-packet-aborted). The    
    coding is handled by the same engine that handles whitening, so whitening    
    cannot be used with UART_VAL frame coding.  
  - **MBUS_3OF6**: Implements 3 out of 6 coding/decoding, described in EN13757-4    
    for Wireless M-Bus mode T (replaces every 4 bit with 6 bits, where each 6    
    bit code word has 3 “1” bits). The Rx chain uses validation, an error will    
    result [SL_RAIL_EVENT_RX_PACKET_ABORTED](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-packet-aborted). The coding is handled by the same    
    engine that handles whitening, so whitening cannot be used with MBUS_3OF6    
    frame coding.
- Applicability: Tx and Rx

###### Frame Length Algorithm (heading level 7)

- Description: This control sets how the frame length information is determined.  
  Note that the frame length does not include the preamble, sync word, and  
  header sections. See [Length Configuration](05-length-configuration) for  
  more details.
- Unit: Enumerated list  
  - **FIXED_LENGTH**: Configured via the Frame Fixed Length card.  
  - **VARIABLE_LENGTH**: Configured via the Frame Variable Length card.  
  - **FRAME_TYPE**: Configured via the Frame Type Length card.
- Applicability: Tx and Rx

###### Frame Bit Endian (heading level 7)

- Description: This control sets the bit endianness in the whole frame. Remember  
  this has no effect on the preamble and sync word sections. The enumerated  
  options are self*evident.
- Applicability: Tx and Rx

###### Frame Fixed Length

This card is enabled when FIXED_LENGTH is selected as the Frame Length Algorithm
on the Frame General card. See [Fixed
Length](05-length-configuration#fixed-length) for more details.

###### Fixed Payload Size (heading level 7)

- Description: This controls sets the payload length in bytes when FIXED_LENGTH  
  option is selected.  
  Note that while this controls the length of the payload only, the limits are  
  given for the Header+Payload length.
- Unit: byte
- Min value: 1 (including the header field) Max value: 4096 (including the  
  header field)
- Applicability: Tx and Rx

###### Frame Variable Length

This card configures the various properties of the variable length coding scheme
(such as location length, endianness of the length word) if the VARIABLE_LENGTH
option is selected as the Frame Length Algorithm on the Frame General card. See
[Variable Length](05-length-configuration#variable-length) for more
details.

###### Variable Length Bit Endian (heading level 7)

- Description: This control sets the bit endianness of the length word. The  
  enumerated options are self-evident. See the [Length Decoding  
  Process](05-length-configuration#length-decoding-process) on how this  
  value is used.
- Applicability: Tx and Rx

###### Variable Length Byte Endian (heading level 7)

- Description: This control sets the byte endianness of the length word. The  
  enumerated options are self-evident. See the [Length Decoding  
  Process](05-length-configuration#length-decoding-process) on how this  
  value is used.
- Applicability: Tx and Rx

###### Length Includes CRC Bytes (heading level 7)

- Description: This control decides whether the indicated length includes or  
  excludes CRC bytes.
- Applicability: Tx and Rx

###### Maximum Length (heading level 7)

- Description: If the decoded length in bytes is longer than this value, the  
  packet is discarded.
- Unit: byte
- Min value: 0
- Max value: 4096 - header size
- Applicability: Tx and Rx

###### Minimum Length (heading level 7)

- Description: If the decoded length in bytes is smaller than this value, the  
  packet is discarded.
- Unit: byte
- Min value: 0
- Max value: 16 - header size
- Applicability: Tx and Rx

###### Variable Frame Length Adjust (heading level 7)

- Description: The decoded length is adjusted by this value (e.g. if set to +2,  
  the radio will always download 2 extra bytes). See the [Length Decoding  
  Process](05-length-configuration#length-decoding-process) on how this  
  value is used.
- Unit: byte
- Min value: -8 + header length
- Max value: 7 - header length
- Applicability: Tx and Rx

###### Variable Length Bit Size (heading level 7)

- Description: This control sets the variable length word’s size in bits. See  
  the [Length Decoding  
  Process](05-length-configuration#length-decoding-process) on how this  
  value is used.
- Unit: bit
- Min value: 1
- Max value: Header size in bits, but less than 12 bits.
- Applicability: Tx and Rx

###### Variable Length Bit Location (heading level 7)

- Description: This control sets the distance (in bits) between the end of the  
  header and the length field. With the default, 0 setting, the end of length  
  field should be at the end of the header. Bigger values mean the length field  
  ends before the end of the header. See the [Length Decoding  
  Process](05-length-configuration#length-decoding-process) on how this  
  value is used.
- Unit: bit
- Min value: 0
- Max value: 7
- Applicability: Tx and Rx

###### Frame Type Length

This card configures the various properties of the variable length coding scheme
if the FRAME_TYPE option is selected as the FrameLength Algorithm on the Frame
General card. See [Frame Type](05-length-configuration#frame-type) for more
details.

For each frame type, the following controls can be set:

###### Frame TypeX Length (heading level 7)

- Description: This control sets the frame length in bytes for type X (X = 0–7).
- Unit: byte
- Min value: 1 (including header field)
- Max value: 4096 (including the header field)
- Applicability: Tx and Rx

###### Frame TypeX Enable (heading level 7)

- Description: This control enables/disables type X frame (X = 0–7).
- Applicability: Tx and Rx

###### Frame TypeX Address Filter (heading level 7)

- Description: This control enables/disables address filter on type X frame  
  reception (X = 0–7).
- Applicability: Rx

A further three controls describe the location of the type information in the
frame.

###### Number of Frame Type Bits (heading level 7)

- Description: This control sets the length of the frame TYPE information in  
  bits.
- Unit: bit
- Min value: 0
- Max value: 3
- Applicability: Tx and Rx

###### Frame Type Location (heading level 7)

- Description: This control sets the location of the byte that contains the TYPE  
  information in the frame. The location is counted from the beginning of the  
  FRAME. Note that the 1st byte in the frame has a location number of 0 (as  
  opposed to 1).
- Unit: byte
- Min value: 0
- Max value: 255
- Applicability: Tx and Rx

###### Frame Type Bit0 Location (heading level 7)

- Description: This control defines the bit location of the LSB bit of the TYPE  
  field within the byte specified by Frame Type Location.
- Unit: bit
- Min value: 0
- Max value: 7
- Applicability: Tx and Rx

###### CRC Input

This section contains the input configuration of CRC. CRC is calculated at the
TX side on the not yet coded (neither FEC nor symbol coded nor whitened) byte
stream. At the receive side, the CRC is calculated again on the fully decoded
byte stream, and if the result matches the received CRC value, packet reception
is deemed successful.

###### CRC Input Bit Endian (heading level 7)

- Description: This control configures in which order the bits in any one byte  
  are fed to the CRC calculator engine.
- Applicability: Tx and Rx

###### CRC Input Padding (heading level 7)

- Description: In some standards, the CRC value must be calculated on at least  
  as long a byte stream as the CRC result itself. If this feature is enabled and  
  the byte stream is shorter than this value, additional zero bytes will be  
  appended to it to reach the minimum length. That is, if the CRC calculation  
  has a result of 4 bytes and it is to be calculated on a 3-byte long sequence  
  an additional 0x00 byte will be appended to the byte stream for CRC  
  calculation. Note that additional 0x00 padding bytes are not transmitted.
- Applicability: Tx and Rx

###### CRC Polynomial (heading level 7)

- Description: This control selects the CRC generator polynomial.  
  |Enumerated Value|Polynomial|Width [bit]|Comment|  
  |---|---|---|---|  
  |NONE|NA|NA|No CRC will be calculated / checked|  
  |CRC_8|X8+X2+X+1|8| |  
  |CRC_16|X16+X15+X2+1|16| |  
  |CCITT_16|X16+X12+X5+1|16|IEEE 802.15.4|  
  |DNP_16|X16+X13+X12+X11+1X10+X8+X6+X5+X2+1|16|w-MBUS|  
  |BLE_24|X24+X10+X9+X6+X4+X3+X+1|24|Bluetooth protocol|  
  |CRC_32Q|X32+X31+X24+X22+X16+X14+X8+X7+X5+X3+X+1|32| |  
  |ANSIX366_1979|X32+X26+X23+X22+X16+ X12+X11+X10+X8+X7+X5+X4+X2+X+1|32|IEEE 802.15.4g|  
  |ZWAVE|X8+1|8|ITU-T G.9959 FCS|  
  |BCH15_11|X4+X+|8|Bose Chaudhuri Hocquenghem|
- Applicability: Tx and Rx

###### CRC Seed (heading level 7)

- Description: This control configures the initial value of the CRC calculation  
  engine also referred to as CRC seed. Note that the length of the seed must be  
  equal to the CRC width as listed in above table.
- Unit: N/A
- Min value: 0x0000 0000
- Max value: 0xFFFF FFFF
- Applicability: Tx and Rx

###### CRC output

This section contains the output configuration options of CRC. Once the CRC is
calculated, it can be passed through further operations to comply with protocol
requirements.

###### CRC Output Bit Endian (heading level 7)

- Description: This control configures in which order the bits are output from  
  the CRC calculator engine.
- Applicability: Tx and Rx

###### CRC Byte Endian (heading level 7)

- Description: This control sets the byte endianness of the CRC at both the Rx  
  and Tx sides. The enumerated options are self-evident.
- Applicability: Tx and Rx

###### CRC Invert (heading level 7)

- Description: This control allows for inverting the calculated CRC at both the  
  Tx and Rx sides.
- Applicability: Tx and Rx

**Some commonly used CRC Configurations:**

|Protocol|Polynomial|Seed|Input Bit Endian|Padding|Output Bit Endian|Byte Endian|Invert|
|---|---|---|---|---|---|---|---|
|IEEE 802.15.4 (2B)|CCIT_16|0x0000|LSB first|False|MSB first|MSB first|False|
|IEEE 802.15.4 (4B)|ANSIX366_1979|0xFFFFFFFF|LSB first|True|MSB first|MSB first|True|
|WMBus|DNP_16|0x0000|MSB first|False|MSB first|MSB first|True|
|Bluetooth|BLE_24|0x00555555|LSB first|False|MSB first|MSB first|False|

###### Whitening

The device allows for data whitening operation that is primarily used to improve
the spectral properties of the transmitted signal by making the symbol
distribution more even within a packet. It is especially useful to break long
zero or one transmissions. Some standards also make this operation mandatory.
Whitening is implemented by XOR-ing the data to be transmitted with a pseudo
random data stream. At the Rx side, dewhitening is done by repeating the same
operation.

###### Whitening Output Bit (heading level 7)

- Description: Whitening is implemented with a linear feedback shift register  
  (LFSR). This control sets which bit of the shift register is “tapped” and  
  XOR’ed with the data bit to be transmitted.
- Unit: bit
- Min value: 0
- Max value: 15
- Applicability: Tx and Rx

###### Whitening Polynomial (heading level 7)

- Description: This control sets the polynomial of the LFSR.  
  |Enumerated Value|LFSR Type|Polynomial|Comment|  
  |---|---|---|---|  
  |NONE|NA|NA|Whitening is disabled|  
  |PN9|Galois|X9+X5+1| |  
  |PN9_BYTE|Fibonacci|X9+X5+1|Bytewise reversed output of PN9_Fibonacci|  
  |PN16|Galois|X16+X14+X13+X11+1| |  
  |BLE|Galois|X7+X4+1|BLE|  
  |Bytewise_XOR_seed_LSB|NA|X8+1|Input is bytewise XORed with the LSB of the seed|  
  |PN9_802154|Fibanocci|X9+X5+1|PN9 sequence per IEEE 802.15.4, same as PN9_BYTE|
- Applicability: Tx and Rx

###### Whitening Seed (heading level 7)

- Description: This control configures the initial value of the LFSR that  
  implements whitening.
- Unit: N/A
- Min value: 0x0000
- Max value: 0xFFFF
- Applicability: Tx and Rx

**Some commonly used CRC Configurations:**

|Protocol|Polynomial|Seed|Output bit|
|---|---|---|---|
|IEEE 802.15.4|PN9|0x01F0|0x00|
|Bluetooth|BLE|0x065 (for channel 37)|0x00|

###### Preamble

The preamble card describes how the transmitted preamble appears and how long it
is. Note that, even though these entries primarily configure the transmitted
preamble, they also have a significant bearing on the receiver’s configuration.

The receiver’s timing and frame detection algorithms and control loops (AGC,
AFC) will be tailored to the preamble defined in this card. In other words, the
entries here do not only define the transmitted preamble at the Tx side but also
define the **expected preamble** at the Rx side. In some cases, it is desirable
to use long preamble for transmit, but short preamble for detection. On xG23 and
newer parts, this is possible by using _Preamble Detection Length_. On other
parts, it is recommended to set the preamble length for Rx requirements, and use
[sl_rail_set_tx_alt_preamble_length()](https://docs.silabs.com/rail/latest/rail-api/transmit#sl-rail-set-tx-alt-preamble-length) with [SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN](https://docs.silabs.com/rail/latest/rail-api/transmit#sl-rail-tx-option-alt-preamble-len)
on all transmissions.

Note that the preamble and sync word is calculated in combination. If the
preamble is too short, sync word might be used for timing recovery, while if the
sync word is short, the calculator might add some bits from the preamble to
decrease false detection rate.

###### Preamble Base Pattern (heading level 7)

- Description: The preamble is composed of a repeating base pattern. This entry  
  defines what this base pattern is. Typically it is chosen to be an alternating  
  1010 pattern. Note that the shortest binary base pattern for creating such a  
  preamble is: 10 (or 01). The pattern is transmitted MSB first.  
  When DSSS symbol coding is enabled, the preamble base pattern defaults to DSSS  
  chipping code base and this entry becomes irrelevant.  
  When Manchester coding is enabled, the preamble does NOT get coded. (Neither  
  does the sync word.) It follows then that whatever is defined here as the base  
  pattern gets directly transmitted.  
  At 4FSK and OQPSK modulations the preamble can only take on values of two  
  symbols only (out of the four). At 4FSK these are the ±3 dev frequency symbols  
  by default, whereas at OQPSK these are the ±90 degree phase symbols by  
  default. Practically this means that the preamble is 2FSK-coded even though  
  4FSK modulation is selected and MSK-coded even though OQPSK is selected. For  
  example, at 4FSK modulation a preamble base pattern of b01 will look like -3  
  dev, +3 dev in the air.
- Unit: N/A
- Min value: b0
- Max value: b1111
- Applicability: Tx and Rx

###### Preamble Pattern Length (heading level 7)

- Description: This entry defines the length of preamble base pattern in bits.  
  For example, if a 1010 binary pattern is built from the shortest base pattern  
  of 10, this entry must be set to 2.
- Unit: bit
- Min value: 1
- Max value: b4
- Applicability: Tx and Rx

###### Preamble Length Total (heading level 7)

- Description: This entry defines the overall length of the transmitted (and  
  expected) preamble pattern in bits. Note that this can only be an integer  
  multiple of the length of the base pattern. If this parameter is set to 0, no  
  preamble is transmitted in Tx mode, nor will it be looked for (and detected)  
  in Rx mode. If the length is set to maximum, the radio will transmit infinite  
  preamble, the sync word and payload will not be transmitted.
- Unit: bit
- Min value: 0
- Max value: (2^16 – 1) * Preamble Pattern Length  
  - On xG23, if Fast Preamble Detect is enabled: 2^16 - ceil(Sync Word Length *    
    1.5)  
  - If short sync word is used, the calculator could decide to extend the    
    syncword with preamble bits. In this case, the maximum value could be higher    
    than expected.
- Applicability: Tx and Rx

###### Preamble Detection Length  (heading level 7)

- Description: If the Preamble Detection Length field is enabled, the expected  
  preamble length on the receiver side will be equal to the Preamble Detection  
  Length. The transmitted preamble will remain the same length set in the  
  Preamble Length Total field.
- Unit: bit
- Applicability: Rx

###### Sync Word

These entries configure the sync word in the radio packet. The sync word serves
as a delimiter in the radio frame after which the demodulated bits will be
stored in the Rx FIFO. Note that inherently sync word also implements packet
filtering/addressing functionality, as radio packets with different than
expected sync words are dropped automatically.

Note that in cases where the preamble is too short for reliably doing the bit
time synchronization, the sync word is used as the qualifier pattern. See more
about this use case under [Timing Detection](#timing-detection). Two sync words
can be defined. The radio can either search for sync0 only (default operation),
or both (when [SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-enable-dual-sync) is used). In such a scenario,
the receiver is looking for both words simultaneously and asserts
[SL_RAIL_EVENT_RX_SYNC_0_DETECT](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-sync-0-detect) or [SL_RAIL_EVENT_RX_SYNC_1_DETECT](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-sync-1-detect) according
to the sync word received. Which sync word has been detected is also returned in
[sl_rail_rx_packet_details_t](https://docs.silabs.com/rail/latest/rail-api/sl-rail-rx-packet-details-t) by the RAIL API function
[sl_rail_get_rx_packet_details()](https://docs.silabs.com/rail/latest/rail-api/packet-information#sl-rail-get-rx-packet-details).

When DSSS symbol coding is applied, the sync word is detected on the already
decoded bit stream, whereas when Manchester coding is enabled, the sync word is
detected on the raw “chip” stream.

**The sync pattern is transmitted MSB first.**

###### Sync Word Length (heading level 7)

- Description: This entry defines the length of the sync word(s) in bits.  
  Granularity is one bit.
- Unit: bit
- Min value: 2
- Max value: 32
- Applicability: Tx and Rx

###### Sync Word 0 (heading level 7)

- Description: This entry defines sync word 0. Note that only Sync Word Length  
  number of LS bits are used, _which_ are sent out MSB first. To avoid confusion  
  from this, the GUI displays the sync word in a binary string format as it  
  appears in the air once the configuration has been generated. Note that when  
  DSSS symbol coding is enabled, the sync word also gets coded at the Tx side  
  and is detected after decoding at the Rx side. However, when Manchester symbol  
  coding is enabled, the sync word does not get _**coded**_ at the Tx side and  
  gets detected without any decoding at the Rx side.
- Unit: N/A
- Min value: 0x0000 0000
- Max value: 0xFFFF FFFF
- Applicability: Tx and Rx

###### Sync Word 1 (heading level 7)

- Description: This entry defines sync word 1. **Note that only Sync Word Length  
  number of LS bits are used, _which_ are sent out MSB first**. To avoid  
  confusion from this, the GUI displays the sync word in a binary string format  
  as it appears in the air once the project has been generated. Note that when  
  DSSS symbol coding is enabled, the sync word also gets coded at the Tx side  
  and is detected after decoding at the Rx side. However, when Manchester symbol  
  coding is enabled, the sync word does not get encoded at the Tx side and gets  
  detected without any decoding at the Rx side. Note that it also requires  
  [SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-enable-dual-sync) configured with  
  [sl_rail_config_rx_options()](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-config-rx-options) to enable it.
- Unit: N/A
- Min value: 0x0000 0000
- Max value: 0xFFFF FFFF
- Applicability: Tx and Rx

###### Sync Word Tx Skip (heading level 7)

- Description: When enabled, the sync word will be not transmitted, and only  
  used for RX.
- Unit: N/A
- Min value: N/A
- Max value: N/A
- Applicability: Tx

###### Frame Header

The header provides for a logically separated field from the payload data with
possibly different configurations. That is, the header field can be excluded
from CRC calculation and whitening.

Another use of the Header is that the length field must be part of the Header,
to be more precise, it must be part of the Header’s last byte.

Note that RAIL does not have a separate function to write the HEADER content. It
is regarded as part of the payload there.

###### CRC Header (heading level 7)

- Description: If this checkbox is enabled the header content is included in the  
  CRC calculation. Note that this does not mean that the HEADER has its own CRC  
  calculated, but rather it is included in the calculation of the CRC that gets  
  appended to the payload field.
- Applicability: Tx and Rx

###### Whiten Header (heading level 7)

- Description: If this checkbox is enabled the header content is whitened as per  
  the whitening configuration.
- Applicability: Tx and Rx

###### Header Size (heading level 7)

- Description: This entry defines the length of the HEADER field in bytes.
- Unit: byte
- Min value: 1
- Max value: 255 (7 - `frame_length_adjust`, if variable frame length is  
  selected)
- Applicability: Tx and Rx

###### Frame Payload

Payload is the field in the radio packet where useful data is located. The data
that goes into this field (combined with the header) is set by the
[sl_rail_write_tx_fifo()](https://docs.silabs.com/rail/latest/rail-api/data-management#sl-rail-write-tx-fifo) or [sl_rail_set_tx_fifo()](https://docs.silabs.com/rail/latest/rail-api/data-management#sl-rail-set-tx-fifo) RAIL functions.

###### Insert/Check CRC After Payload (heading level 7)

- Description: If this checkbox is enabled, the payload content is included in  
  the CRC calculation, and the CRC is sent out after the payload in TX and  
  checked in RX operation.
- Applicability: Tx and Rx

###### Payload Whitening Enable (heading level 7)

- Description: If this checkbox is enabled, the payload content is whitened as  
  per the whitening configuration.
- Applicability: Tx and Rx

##### Symbol Coding

The Symbol Coding GUI subsection contains controls that are related to symbol
coding. Symbol coding is the concept that translates bits (or groups of bits) to
modulation symbols that represent the bit (or group of bit) in the modulation
domain (frequency, phase, amplitude).

###### Symbol Encoding

- Description: This dropdown entry selects the symbol coding method. Unit:  
  Enumerated list  
  - **NRZ (Non Return to Zero)**: In practice, this option means that no symbol    
    coding is done, and the incoming bits are just simply passed through to the    
    modulator.  
  - **Manchester**: Manchester coding replaces each bit on the payload with two    
    chips based on the selection in the Manchester Code Mapping entry. At the Rx    
    side, Manchester decoding is done in a similar fashion whereby each pair of    
    chips is replaced by a bit. Manchester coding is recommended in case long    
    zero or one trails of data are to be transmitted especially in OOK    
    modulation mode. The Manchester coding scheme ensures that there are always    
    chip transitions regardless of the input data, which is beneficial for the    
    slicing (especially at OOK demodulation) and bit clock recovery circuits in    
    the demodulator. With Mancherster coding, the chip rate will be twice of the    
    datarate. On EFR32xG22 and older (where chiprate is the configuration    
    input), this result twice as long transmission time, while on EFR32xG23 and    
    newer (where bitrate is the configuration input), the chiprate will be    
    doubled. Also note that Manchester coding does not apply to the preamble and    
    sync word sections. Manchester coding/decoding is not supported in more than    
    1 bit / symbol modulation formats (4FSK / OQPSK). When Manchester decoding    
    is enabled, preamble polarity must be configured as it will be seen by the    
    Rx for robust operation (that is, the end of the configured preamble and    
    sync word must match the Tx signal). When Manchester decoding is disabled,    
    this is not a requirement.  
  - **DSSS (Direct Sequence Spread Spectrum)**: DSSS takes a bit or group of    
    bits and replaces them with a longer chip sequence based on the    
    configuration of the DSSS-related entries, an operation also referred to as    
    spreading. DSSS greatly impacts the spectral properties of the transmitted    
    signal. The chip rate in the air can be much higher than the bit rate, which    
    can greatly increase the bandwidth of the signal, hence the name of spread    
    spectrum. The spreading factor is defined as Chip_rate / Bit_rate. At the    
    receive side, decoding is done in the demodulator whereby a received chip    
    sequence is detected and replaced by the corresponding bit or group of bits.    
    This operation is also referred to as despreading. The chip sequences that    
    represent different groups of bits are chosen to have weak correlation    
    (i.e., they look different) so even if chip sequences are not demodulated    
    perfectly, the corresponding bit values can still be detected. This    
    mechanism gives rise to a so-called processing gain in the receiver. In    
    practice, it means that sensitivity on the bit sequence will be better than    
    on the chip sequence by as much as the processing gain. The possible maximum    
    value of the processing gain is the spreading factor itself. DSSS is    
    typically used when relatively low data rates are to be transmitted. The    
    advantages of DSSS are more immunity against narrowband interferers and the    
    possibility of using relatively inaccurate reference sources (XOs).  
  - **UART_NO_VAL**: Start (0) and a single stop (1) bits are inserted before    
    and after each word to be transmitted, respectively. This feature is useful    
    for emulating direct UART data transfer over the air. Data whitening and/or    
    FEC are executed after coding in the Tx chain, and before decoding in the Rx    
    chain. There is no validation in the Rx chain; the start/stop bits are    
    removed from the frame, but not checked.  
  - **UART_VAL**: Start (0) and a single stop (1) bits are inserted before and    
    after each word to be transmitted, respectively. This feature is useful for    
    emulating direct UART data transfer over the air. FEC is executed after    
    coding in the Tx chain, and before decoding in the Rx chain. The Rx chain    
    uses validation, an error will result [SL_RAIL_EVENT_RX_PACKET_ABORTED](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-packet-aborted). The    
    coding is handled by the same engine that handles whitening, so whitening    
    cannot be used with UART_VAL frame coding.  
  - **MBUS_3OF6**: Implements 3 out of 6 coding/decoding, described in EN13757-4    
    for Wireless M-Bus mode T (replaces every 4 bit with 6 chips, where each    
    6-chip code word has 3 “1” chips). The Rx chain uses validation, an error    
    will result [SL_RAIL_EVENT_RX_PACKET_ABORTED](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-packet-aborted). The coding is handled by the    
    same engine that handles whitening, so whitening cannot be used with    
    MBUS_3OF6 frame coding.  
  - **Linecode**: Maps 0 to 0011 symbol and 1 to 1100 symbol.
- Applicability: Tx and Rx

> 3 out of 6, UART (no validation), UART (with validation) and Linecode symbol
> coding were introduced on EFR32xG23 series under this field. For earlier models,
> 3 out of 6, UART (no validation), UART (with validation) coding is available to
> set as Frame Coding Method on the Frame General card in the radio configurator.

###### Manchester Code Mapping

- Description: This dropdown entry selects the Manchester code mapping.  
  - **Default**: Replacing 0→01 and 1→10.  
  - **Inverted**: Replacing 0→10 and 1→01.
- Applicability: Tx and Rx

###### Differential Encoding Mode

- Description: A built-in feature in the modem allows for differential encoding  
  on the bit stream. This encoding scheme can be applied to any modulation  
  format where one symbol corresponds to one bit (that is, OQPSK and FSK4  
  excluded). This coding scheme is applied to the entire frame starting from  
  sync word on (sync word excluded). Note that differential encoding precedes  
  symbol encoding (so Manchester or DSSS coding will come after differential  
  encoding). Differential coding is a powerful tool to break long zero and one  
  sequences in the data stream. It may however “flatten out” alternating  
  patterns to one or zero trails.
- Unit: Enumeration  
  |DISABLED|Differential Encoding is disabled.|  
  |---|---|  
  |PR0|Tx/Rx the XOR*ed value of the Raw bit and the last Raw bit. Initial Raw bit is 0.|  
  |RE0|Tx/Rx the XOR*ed value of the Raw bit and the last Encoded bit. Initial Encoded bit is 0.|  
  |PR1|Tx/Rx the XOR*ed value of the Raw symbol and the last Raw bit. Initial Raw bit is 1.|  
  |RE1|Tx/Rx the XOR*ed value of the Raw bit and the last Encoded bit. Initial Encoded bit is 1.|
- Applicability: Tx and Rx
- Note: On some parts (mainly xG23 and newer), depending on the modulation,  
  coding is only applied on Tx

###### DSSS Encoding

The following three parameters configure the DSSS symbol coding mechanism. There
are mutual restrictions in between these parameters. You can find all the valid
combinations in the table below the entry descriptions. Note that it is possible
to enter invalid combinations into the entry boxes; in such cases, the PHY
generation will fail, so make sure you do a double check against the table.

###### DSSS Chipping Code Base (heading level 7)

- Description: This entry serves as the base chip sequence code. All the other  
  codes are generated with binary cyclic right-shifting and/or inversion or  
  complex conjugation. Complex conjugation is used only for OQPSK modulation.  
  Complex conjugation in case of OQPSK is simply the inversion of the upper bit  
  of the symbol code. Inversion is used for all the rest of the modulations.  
  **Select a code that has weak autocorrelation (that is, the base code and its  
  cyclic-shifted versions have weak correlations).**
- Unit: N/A
- Min value: 0x00 00 00 00
- Max value: 0xFF FF FF FF
- Applicability: Tx and Rx

###### DSSS Chipping Code Length (heading level 7)

- Description: This entry specifies the length of the chipping code. The  
  chipping code length and the spreading factor (see below) determines how many  
  bits are coded into one chip sequence. See the table below for this  
  information. Should be set to 0 if DSSS is disabled.
- Unit: bit
- Valid values: 0, 2, 4, 8, 16, 32
- Applicability: Tx and Rx

###### DSSS Spreading Factor (heading level 7)

- Description: This entry defines the spreading factor that is essentially the  
  chip-rate to bit-rate ratio. Note: Rx sensitivity performance degrades if a  
  spreading factor higher than 8 is configured. Therefore, it is recommended  
  that the spreading factor be less than or equal to 8.
- Unit: N/A
- Valid values: 2, 4-32
- Applicability: Tx and Rx

###### Valid DSSS Configuration Combinations (heading level 7)

|DSSS Spreading Factor|DSSS Chipping Code Length|Bit/Chip Sequence|Binary Cyclic Right Shift|
|---|---|---|---|
|4 to 32|4 to 32 (DSSS spreading factor and DSSS chipping code length must be equal.)|1|0|
|2|4|2|2|
|2|8|4|1|
|4|8|2|4|
|4|16|4|2|
|8|16|2|8|
|8|32|4|4|
|16|32|2|16|

Each byte of the packet is separated into BCS long chunks, where BCS is the
Bit/Chip Sequence (defined in the previous table). On the transmitter’s side,
these chunks will be fetched up with the endianness defined by the corresponding
field of the packet (for example, **Frame bit endianness** in case of payload
bytes). Then the chunks will be encoded to chip sequences keeping their bit
endianness. It means that the endianness settings set the chunk endianness
within the byte, and not the bit endianness of the chunk or the chip endianness.
On the receiver side, the endianness configuration applies similarly to the
decoded chunks’ endianness within the received bytes. The chip codes are always
sent out in LSB first order (the top right bit of the Base is transmitted
first).

The number of the chip codes is equal to 2 squared to the power BCS. The chip
sequences are generated by shifting the Base byBCRS (Binary-Cyclic-Right Shift
defined in the previous table) multiplied by the value of the BCS-1 least
significant bits of the chunk and inverted (or complex conjugated in case of
OQPSK modulation) if the chunk’s most significant bit is 1. (If BCS=1 only the
other sequence is generated by inversion/complex conjugate operation.)

All the chipping codes for the following example with DSSS Chipping Code Base of
“01001101” are listed below.

###### Example DSSS Configuration (heading level 7)

|DSSS Spreading Factor|DSSS Chipping Code Length|Bit/Chip Sequence|Binary Cyclic Right Shift|
|---|---|---|---|
|4|8|2|4|

###### Example Chip Sequences for 2FSK (heading level 7)

|Bits (bin)|Operation|Chip sequence in LSB first order (bin)|Chip sequence in LSB first order (hex)|
|---|---|---|---|
|0|Base|1001001001101111|926F|
|1|Base right shifted by 2 (B>>2)|1110010010011011|E49B|
|10|B>>4|1111100100100110|F926|
|11|B>>6|1011111001001001|BE49|
|100|B>>8|0110111110010010|6F92|
|101|B>>10|1001101111100100|9BE4|
|110|B>>12|0010011011111001|26F9|
|111|B>>14|0100100110111110|49BE|
|1000|Base inverted (B!)|0110110110010000|6D90|
|1001|B!>>2|0001101101100100|1B64|
|1010|B!>>4|0000011011011001|06D9|
|1011|B!>>6|0100000110110110|41B6|
|1100|B!>>8|1001000001101101|906D|
|1101|B!>>10|0110010000011011|641B|
|1110|B!>>12|1101100100000110|D906|
|1111|B!>>14|1011011001000001|B641|

###### Example Chip Sequences for OQPSK

|Chip Sequence #|Bits|Chip Sequence|Note|
|---|---|---|---|
|0|0|0111101011001001|Base (B)|
|1|1|1110101100100101|Base right-shifted by 2 bits (B>>2)|
|2|10|1010110010010111|B>>4|
|3|11|1011001001011110|B>>6|
|4|100|1100100101111010|B>>8|
|5|101|0010010111101011|B>>10|
|6|110|1001011110101100|B>>12|
|7|111|0101111010110010|B>>14|
|8|1000|1101000001100011|Base complex-conjugated (B*)|
|9|1001|0100000110001111|Base complex conjugated and right-shifted by 2 (B*>>2)|
|10|1010|0000011000111101|B*>>4|
|11|1011|0001100011110100|B*>>6|
|12|1100|0110001111010000|B*>>8|
|13|1101|1000111101000001|B*>>10|
|14|1110|0011110100000110|B*>>12|
|15|1111|1111010000011000|B*>>14|

##### Channel Coding

The Channel Coding GUI subsection contains controls related to channel coding.
Channel coding is a mechanism whereby redundant information is added to the bit
sequence, based on which the receiver can detect and correct bit errors. This
mechanism is also referred to as Forward Error Correction (FEC). The result of
FEC is increased sensitivity at the price of a longer data stream. Note that
convolutional code type requires a RAM buffer (allocated automatically in
_rail_config.c_), with the following size, depending on Constraint length:

|Constraint Length|Buffer Size (Bytes)|
|---|---|
|2|16|
|3|32|
|4|64|
|5|128|
|6|384|
|7|768|

###### FEC Algorithm

- Description: This drop down selection entry configures the FEC algorithm to be  
  used.
- Unit: Enumerated list  
  - **NONE**: No FEC is applied.  
  - **FEC_154G**: Implements convolutional coding with the following parameters.    
    This scheme is primarily devised for the 802.15.4 OQPSK 250 kbps PHY. This    
    FEC coding scheme is not recommended on Series 2 products and kept only for    
    backward compatibility.    
    - Code type: Non-recursive convolutional    
    - Generator polynomial 0: 0x0D    
    - Generator polynomial 1: 0x0E    
    - Constraint length: 5    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Enabled    
    Note that when this FEC coding scheme is utilized, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (i.e., two bits are generated for each input bit).  
  - **FEC_154G_K7**: Implements convolutional coding with the following    
    parameters. This scheme is primarily devised for the 802.15.4 OQPSK 250kbps    
    PHY. This FEC coding scheme is not recommended on Series 2 products and kept    
    only for backward compatibility.    
    - Code type: Non-recursive convolutional    
    - Generator polynomial 0: 0x6D    
    - Generator polynomial 1: 0x4F    
    - Constraint length: 7    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Enabled    
    Note that when this FEC coding scheme is used, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (that is, two bits are generated for each input bit).  
  - **FEC_154G_NRNSC_INTERLEAVING**: Implements convolutional coding with the    
    following parameters. This scheme is primarily devised for the 802.15.4    
    OQPSK 250kbps PHY. This FEC coding scheme is not recommended on Series 2    
    products and kept only for backward compatibility.    
    - Code type: Non-recursive convolutional    
    - Generator polynomial 0: 0x0F    
    - Generator polynomial 1: 0x0D    
    - Constraint length: 4    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Enabled    
    Note that when this FEC coding scheme is used, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (that is, two bits are generated for each input bit).  
  - **FEC_154G_RSC_INTERLEAVING**: Implements convolutional coding with the    
    following parameters. This scheme is primarily devised for the 802.15.4    
    OQPSK 250kbps PHY. This FEC coding scheme is not recommended on Series 2    
    products and kept only for backward compatibility.    
    - Code type: Non-recursive convolutional    
    - Generator polynomial 0: 0x0F    
    - Generator polynomial 1: 0x0D    
    - Constraint length: 4    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Enabled    
    Note that when this FEC coding scheme is used, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (that is, two bits are generated for each input bit).  
  - **FEC_154G_RSC_NO_INTERLEAVING**: Implements convolutional coding with the    
    following parameters. This scheme is primarily devised for the 802.15.4    
    OQPSK 250kbps PHY. This FEC coding scheme is not recommended on Series 2    
    products and kept only for backward compatibility.    
    - Code type: Recursive convolutional    
    - Generator polynomial 0: 0x0F    
    - Generator polynomial 1: 0x0D    
    - Constraint length: 4    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Disabled    
    Note that when this FEC coding scheme is used, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (that is, two bits are generated for each input bit).  
  - **FEC_K7_INTERLEAVING**: Implements convolutional coding with the following    
    parameters. This scheme is primarily devised for the 802.15.4 OQPSK 250kbps    
    PHY. This FEC coding scheme is not recommended on Series 2 products and kept    
    only for backward compatibility.    
    - Code type: Non-recursive convolutional    
    - Generator polynomial 0: 0x6D    
    - Generator polynomial 1: 0x4F    
    - Constraint length: 7    
    - Puncturing: None    
    - Coding rate: ½    
    - Interleaving: Enabled    
    Note that when this FEC coding scheme is used, the bitrate input in the    
    MODEM section must be set to twice the net data rate based on the coding    
    rate of ½ (that is, two bits are generated for each input bit).
- Applicability: Tx and Rx

##### Testing

The Testing GUI subsection contains controls that enable/disable special
configurations for particular tests. Note that enabling any of these controls
overrides a number of other configuration settings without notification.

###### Reconfigure for BER (Bit Error Rate) Testing

- Description: This control enables a BER testing mode that allows for  
  undertaking BER measurements on a **continuous PN9 sequence.** When this  
  checkbox is enabled, a special demodulator/detection configuration is set that  
  can lock onto the longest 1010 trail (and the subsequent pattern) in the PN9  
  sequence. In addition, a packet configuration is selected that "de-whitens"  
  the continuous PN9 sequence to a static all-zeroes signal. This signal is then  
  observed by the MCU and all the digital one "glitches" are counted as bit  
  errors. BER testing is supported by the RAILtest application. For more details  
  on how to run the tests, refer to [EFR32 RF Evaluation  
  Guide](https://docs.silabs.com/rail/latest/efr32-rf-eval-guide/).  
  **Note 1**: Whenever this option is enabled, the configuration can only be  
  used for BER testing purposes. If packet-based functionality is desired, a new  
  configuration without this option enabled must be generated and loaded.  
  RAILtest does not know what configuration is running "under" it. Therefore, it  
  is the user's responsibility to keep track of this.  
  **Note 2**: No frequency error compensation is done in this mode. Make sure  
  the frequency alignment is accurate between signal source and receiver.  
  **Note 3**: Only two state modulation formats are supported so you cannot use  
  this feature on 4FSK and OQPSK configurations.  
  **Note 4**: When testing OOK modulation, restart the BER testing from the  
  RAILtest application whenever the test signal power level changes. This is  
  needed for the receiver to update its slicing threshold.  
  **Note 5**: The feature only works with NRZ symbol coding, so make sure  
  Manchester coding or DSSS coding is disabled.
- Applicability: Rx

##### Advanced

The Advanced card group contains advanced controls that can be used for fine
tuning. Most apply to the demodulator side. If a value is to be tuned (that is,
stepped a few notches away from its initial value) its corresponding control
must be enabled by checking the box next to it. **The settings in this group are
meant for advanced users only.**

###### Timing Detection

Timing detection is responsible for recognizing a desired signal and extracting
the symbol timing information from it. It is implemented as a correlation
detector that correlates the expected and the real incoming signal continuously
and signals if it has found a valid correlation peak by asserting TIMING_DETECT.

The detector observes the incoming signal for a given observation period,
referred to as a timing window, and if the signal within this time period is
determined to be a desired signal, the detector issues TIMING_DETECT. A signal
is determined to be a desired one if the correlation value is higher than a
given threshold in the timing window and the demodulated symbol stream contains
fewer errors than a given threshold. At TIMING_DETECT, the symbol sampling
instant is also adjusted to the middle of the symbols.

Detection on additional timing windows (the number determined by the "Number of
Timing Windows to Detect" described below) must also yield a positive answer for
the detector to assert PREAMBLE_DETECT.

Both the length of the timing window and the number of times it has to
consecutively yield a positive answer for a valid PREAMBLE_DETECT are
configurable.

Once PREAMBLE_DETECT has been asserted, the search for SYNC WORD begins.

Once TIMING_DETECT has been asserted, the timing algorithm still runs
continuously to compensate for baud rate drifts in the packet. This mechanism is
referred to as timing resynchronization. Note that this mechanism does not
change the frequency of the nominal bit clock. It only adjusts its phase for
optimal sampling.

###### Number of Errors Allowed in a Timing Window (heading level 7)

- Description: This entry sets how many baud errors are allowed (i.e.,  
  tolerated) in the demodulated data stream over a timing sequence for valid  
  TIMING_DETECT. If DSSS symbol coding is enabled, the number of errors will  
  apply to chips as opposed to bauds.
- Unit: baud
- Min value: 0
- Max value: 4
- Applicability: Rx

###### Number of Symbols in Timing Window (heading level 7)

- Description: This entry adjusts the length of one timing window. By default,  
  the length and the bit sequence of a timing window are defined by two entries  
  in the Preamble card. The length is defined by entry “Preamble Pattern Length”  
  and the bit sequence is defined by entry “Preamble Base Pattern”. If Preamble  
  Pattern Length = 4 and Preamble Base Pattern = 5, the binary sequence will be  
  0101 in a timing window. Note that the number of symbols in a timing window  
  must be an integer multiple of Preamble Pattern Length. A special use case is  
  when the preamble is short, <20 bits. In this scenario, it is suggested to set  
  this field to 0, in which case the 2FSK modulated sync word will be used as  
  the timing qualifier sequence. To increase the accuracy of the timing  
  detection, use a longer sync word (try to include preamble bits as well).
- Unit: symbol
- Min value: 1 (a value of 0 means that sync word becomes the timing sequence)  
  Max value: 60
- Applicability: Rx

###### Timing Resync Period (heading level 7)

- Description: Once timing has been detected, the demodulator continues to  
  measure and adjust for baud rate differences. This mechanism is referred to as  
  timing resynchronization. This control configures how frequently new timing  
  information should be available for compensation purposes.
- Unit: timing sequence
- Min value: 1 (a value of 0 disables timing resynchronization) Max value: 15
- Applicability: Rx

###### Number of Timing Windows to Detect (heading level 7)

- Description: This entry defines the number of consecutive timing windows in  
  which detection must yield a positive answer for a valid PREAMBLE_DETECT. A  
  value of 1 means that TIMING_DETECT and PREAMBLE_DETECT get asserted at the  
  same time.
- Unit: timing window
- Min value: 1 (0 also means 1)
- Max value: 16
- Applicability: Rx

###### Timing Detection Threshold (heading level 7)

- Description: This is a relative threshold level against which the result of  
  the correlation measurement is checked. If the measured correlation is less  
  than this threshold, TIMING_DETECT is not asserted. Longer timing windows  
  require a higher threshold. This field affects the ratio of false detects  
  seen. A higher value means stronger qualification, but it can reduce receiver  
  sensitivity.
- Unit: N/A
- Min value: 0
- Max value: 255
- Applicability: Rx

###### Timing Samples Threshold (heading level 7)

- Description: Signal strength can be made to be a requirement for timing  
  detection. If this feature is enabled, TIMING_DETECT is not asserted unless  
  all samples taken within the observation window are above a certain threshold  
  level. With amplitude modulation formats (OOK), TIMING_DETECT is not asserted  
  unless the measured strong / weak signal periods match the baud rate period.  
  This entry sets a relative signal strength level for the above purposes.
- Unit: N/A
- Min value: 0
- Max value: 100
- Applicability: Rx

###### AGC

_AGC fields are only available for EFR32xG22 and series1 devices. We did some
experiments with fine tuning the AGC on newer parts manually, but we concluded
that the calculator provides equivalent or better results._

Automatic gain control (AGC) is responsible for adjusting the receiver gain to
an optimal level on any reception. The optimal level is the minimum gain at
which reception is still robust. This approach provides the most headroom for
blockers in the receive chain and thus results in good blocking performance.

The AGC consists of two control loops. One is the RF front end control loop,
also referred to as the FAST LOOP. The other is the channel filter control loop.
The main difference between the two is where exactly the power measurement is
taken in the receive chain the loop acts upon. As its name indicates, the FAST
LOOP is much faster than the channel filter control loop, as the latter includes
the propagation delay of the channel filter itself. This delay is inversely
proportional to the bandwidth. The AGC operation can be viewed as a coarse and
fast control in the FAST LOOP, complemented by a slower, more accurate control
in the channel filter loop.

###### AGC Hysteresis (heading level 7)

- Description: A hysteresis feature is provided for the AGC to prevent events  
  whereby the AGC keeps toggling between two gain configurations if the measured  
  power value is at or close to the switching threshold level. This phenomenon  
  is also referred to as AGC chattering. The measurement thresholds for gain  
  changes to opposite directions are shifted by as many dBs as indicated by this  
  entry.
- Unit: dB
- Min value: 0
- Max value: 8
- Applicability: Rx

###### AGC Power Target (heading level 7)

- Description: This is the target power level as measured by the channel filter  
  loop. The AGC drives the gain configuration so that this target value is  
  measured after the channel filter. A higher value gives stronger signal for  
  detection, but reduces headroom against high level interferer signals.
- Unit: dBm
- Min value: -40
- Max value: 8
- Applicability: Rx

###### AGC Speed (heading level 7)

- Description: This entry selects the operation mode of the AGC with regards to  
  its speed. The speed should be configured so AGC can settle before preamble  
  detect. As a consequence, the speed configuration is related to the length of  
  the preamble the receiver is expecting and also the bandwidth the receiver is  
  configured to.
- Unit: Enumerated list with self-explanatory items (NORMAL, FAST and SLOW).  
  Applicability: Rx

###### AGC Period (heading level 7)

- Description: The channel filter AGC loop measures the true signal power by  
  performing an RSSI (Radio Signal Strength Indicator) measurement. The AGC  
  period adjusts the length of the measurement window. The longer the  
  measurement window the more accurate the measurement will be; however, this  
  comes at a price of a longer preamble requirement at the Tx side. The AGC  
  period adjusts the measurement window in the following fashion: T_meas =  
  2^AGC_PERIOD, where the unit is one symbol.
- Unit: symbol time
- Min value: 0
- Max value: 7
- Applicability: Rx

###### AGC Settling Delay (heading level 7)

- Description: This time delay parameter configures the time between two gain  
  adjustment cycles in the channel filter loop. Ideally this parameter reflects  
  the delay through the channel filter and the demodulator. The idea is that the  
  effect of one gain adjustment must be propagated through the receive chain  
  before the next adjustment cycle starts. The unit of this parameter is the  
  AGC's clock period.
- Unit: AGC clock period
- Min value: 0
- Max value: 63
- Applicability: Rx

###### AGC Backoff Scheme (heading level 7)

- Description: This entry controls in which order the various gain blocks reduce  
  gain in the receive chain. This feature is only applicable to IC revision xG12  
  and above.  
  - **SCHEME_1**: This scheme is the default and recommended configuration.    
    Unless superior blocking performance is required, use this. This scheme    
    optimizes for sensitivity under all gain conditions. All the other schemes    
    trade off sensitivity (under blocking conditions) for blocking performance.    
    Note that sensitivity in non-blocking conditions is not affected. This is    
    the configuration xG1 IC revision is using.  
  - **SCHEME_2**: Not used.  
  - **SCHEME_3**: This scheme is used by the built-in BLE and Zigbee 2.4 GHz    
    PHYs.  
  - **SCHEME_4**: This scheme is recommended for ETSI category 1-compliant    
    narrowband applications in the 169 MHz band to meet the blocking    
    specifications without a SAW filter.
- Applicability Rx

###### AFC

_AFC fields are only available for EFR32xG22 and series1 devices. We did some
experiments with fine tuning the AFC on newer parts manually, but we concluded
that the calculator provides equivalent or better results._

Slightly differing crystal frequencies will cause frequency offsets between Tx
and Rx nodes at the carrier frequency. The receiver has a mechanism that can
compensate or cancel this frequency offset. Offset compensation happens inside
the demodulator. The measured frequency offset shifts the slicing threshold for
frequency and phase modulated signals. Offset cancellation happens with an
interaction between the demodulator and the PLL synthesizer whereby the measured
frequency offset (going through some gearing) directly adjusts the synthesizer
frequency. Offset compensation and offset cancellation are mutually exclusive.

Offset cancellation is referred to as automatic frequency control (AFC), while
offset compensation is referred to as INTERNAL compensation.

AFC yields better sensitivity performance in the entire frequency error range as
it tunes the receive filter onto the incoming signal. With INTERNAL
compensation, the receive filter is not tuned at all so when the incoming signal
gradually drifts out of the receive filter bandwidth, sensitivity also degrades
gracefully.

Neither AFC nor INTERNAL compensation is available on amplitude modulated
signals such as OOK.

Both the AFC and INTERNAL compensation algorithms can be frozen at particular
events during packet reception. This has the benefit that, once frequency offset
has been acquired and cancellation has been settled through the synthesizer with
AFC, there is no risk of losing frequency alignment to subsequent, less-accurate
offset measurements. A prime example is a packet payload with many repeating
consecutive symbols that make the frequency offset measurement difficult.

The events at which freezing is possible: TIMING_DETECT, PREAMBLE_DETECT and
FRAME_DETECT. FRAME_DETECT signals SYNC WORD detection.

Typically both AFC and INTERNAL compensation starts immediately upon entering
into Rx mode. AFC, however, also has a feature that makes the algorithm start
only at PREAMBLE_DETECT. This has the benefit that the AFC algorithm does not
“wander off” too far on noise before a valid packet arrives. A downside of this
approach is that the range of the AFC will be smaller as the preamble must be
detected without any offset compensation.

The controls in this card allow for fine-tuning some of the parameters of the
AFC and INTERNAL (frequency offset) compensation algorithms.

###### Frequency Offset Period (heading level 7)

- Description: This configuration provides gearing on the length of the  
  calculated elementary frequency error measurement window. The final  
  measurement window is elementary window * 2^Frequency_Offset_Period.  
  When only INTERNAL compensation is enabled, the length of the elementary  
  window equals the timing sequence. When AFC is enabled, the elementary window  
  is typically chosen to be 4-8 baud long.
- Unit: as per above
- Min value: 0
- Max value: 7
- Applicability: Rx

###### Frequency Compensation Mode (heading level 7)

- Description: This drop-down list enables selection on compensation mode,  
  freezing event and AFC starting event.  
  For AFC operation at least 40 bits of preamble is required.
- Unit: Enumerated list  
  - **Disabled**: This option disables both the AFC and interval compensation    
    mechanisms, which may be useful for debugging purposes.  
  - **INTERNAL_LOCK_AT_PREAMBLE_DETECT**: Internal compensation is enabled and    
    it gets frozen at PREAMBLE DETECT.  
  - **INTERNAL_LOCK_AT_FRAME_DETECT**: Internal compensation is enabled and it    
    gets frozen at FRAME DETECT (i.e., at SYNC WORD detect).  
  - **INTERNAL_ALWAYS_ON**: Internal compensation is enabled and it never gets    
    frozen. This is an option that is recommended in direct mode.  
  - **AFC_FREE_RUNNING**: AFC is enabled and it never gets frozen. This is an    
    option that may be used in direct mode with long (> 40 bit) preambles.  
  - **AFC_LOCK_AT_PREAMBLE_DETECT**: AFC is enabled and it gets frozen at    
    PREAMBLE_DETECT.  
  - **AFC_LOCK_AT_FRAME_DETECT**: AFC is enabled and it gets frozen at FRAME    
    DETECT (i.e., at SYNC WORD detect).  
  - **AFC_START_AT_PREAMBLE_LOCK_AT_FRAME_DETECT**: AFC gets enabled at PREAMBLE    
    DETECT and it gets frozen at FRAME DETECT (i.e., at SYNC WORD detect). This    
    may be a viable option for small frequency offsets in packet mode when    
    preamble length >= 40 and sync word is DC balanced.  
  - **AFC_START_AT_PREAMBLE_FREE_RUNNING**: AFC gets enabled at PREAMBLE DETECT    
    and it never gets frozen afterward. This may be a viable option for small    
    frequency offsets in packet mode when preamble length >= 40 and the payload    
    has very long DC balanced content (long enough that frequency drift could    
    potentially occur).
- Applicability: Rx

###### AFC Frequency Limit (heading level 7)

- Description: This control puts a limit on the absolute measured frequency  
  error beyond which no compensation occurs. This is useful for stopping the  
  radio from receiving packets above certain absolute frequency offsets (such as  
  packets in the adjacent channel).  
  **Note**: Setting this value to 0 disables the limiting mechanism.
- Unit: kHz
- Min value: 0
- Max value: 500
- Applicability: Rx

###### AFC Step Scale (heading level 7)

- Description: This configuration is only applicable when in AFC mode. The  
  control allows for scaling the default feedback gain to the PLL synthesizer.
- Unit: N/A
- Min value: 0
- Max value: 2
- Resolution: 0.01
- Applicability: Rx

###### AFC Period (heading level 7)

- Description: Controls the frequency offset average period for AFC.
- Unit: N/A
- Min value: 0
- Max value: 7
- Resolution: 1
- Applicability: Rx

###### Channel Bandwidth

###### Acquisition Channel Bandwidth‌ (heading level 7)

- Description: The channel filter bandwidth is calculated automatically from the  
  modulation and XO accuracy parameters. This control allows for manually  
  overriding it to a desired value. Note that there are restrictions on the  
  filter bandwidths so the closest available gets selected.  
  **Note 1**: The crystal accuracy input parameter is NOT used for OOK BW  
  automatic calculation. The target is BW 75*Data rate, favoring those legacy  
  applications using low data rate with inaccurate frequency sources.  
  **Note 2**: For FSK, a good rule of thumb is the Carson formula  
  (BW=2*Deviation+DataRate).  
  **Note 3**: For OOK, the bandwidth is calculated as  
  BW=5*ChipRate+2*CenterFrequency*RxCrystalAccuracy%.  
  **Note 4**: The actual bandwidth corresponds to the 3dB point of the channel  
  filter bandwidth and may differ from the desired bandwidth. The actual  
  bandwidth is different due to rounding and depending on the decimation  
  settings and other internal front-end settings.
- Unit: kHz
- Min value: 0.1
- Max value: 2530
- Applicability: Rx

###### IF Frequency (heading level 7)

- Description: Although the IF frequency is calculated automatically from the  
  modulation and XO accuracy parameters, this control allows for manually  
  overriding it to a desired value. This may be important if the image must not  
  fall on a specific frequency. Note that there are restrictions on the IF  
  frequency so the closest available gets selected.
- Unit: kHz
- Min value: 70
- Max value: 1900
- Applicability: Rx

###### LO Injection Side (heading level 7)

- Description: This control provides for changing the LO injection side in the  
  receiver. Changing the LO injection side mirrors the image receive band to the  
  other side of the wanted channel. Use this feature if a particular band of  
  interest is to be avoided on the image frequency.
- Unit: Self-explanatory enumerated list
- Applicability: Rx

###### Miscellaneous

###### TX PLL Bandwidth (heading level 7)

- Description: This control allows for manual adjustment on the PLL  
  synthesizer’s bandwidth in Tx mode. By default, the PLL bandwidth will be  
  configured to a value that can accommodate the whole modulation bandwidth of  
  the Tx signal. Adjust the Tx PLL bandwidth only if better out of band emission  
  performance is required. Note that reducing the PLL bandwidth may filter the  
  wanted signal too.
- Unit: Enumerated list where bandwidth values are stated in kHz. Min value: 250
- Max value: 3000
- Applicability: Tx

###### RX PLL Bandwidth (heading level 7)

- Description: This control allows for manual adjustment on the PLL  
  synthesizer’s bandwidth in Rx mode. By default, the PLL bandwidth will be  
  configured to 250 kHz in Rx mode. Adjust the Rx PLL bandwidth only if better  
  selectivity performance is required.
- Unit: Enumerated list where bandwidth values are stated in kHz. Min value: 250
- Max value: 3000
- Applicability: Rx

###### RSSI Update Period (heading level 7)

- Description: RSSI Update Period adjusts the length of the measurement window  
  and update interval in the following fashion: T_meas/update =  
  2^RSSI_Update_Period, where the unit is one symbol time. In other words, the  
  measured RSSI value will be averaged over the set time period.
- Unit: symbol time
- Min value: 0
- Max value: 15
- Applicability: Rx

###### Signal Quality Indicator Threshold (heading level 7)

- Description: The demodulator generates two signal quality indicator numbers  
  that are based on the measured correlation values on each symbol in the frame.  
  The first is the average correlation value as measured on the first eight  
  symbols in the frame (that is, after sync word). The second is the number of  
  symbols in the frame with a correlation value lower than the threshold set in  
  this entry. The signal quality indicator, referred to as link quality  
  indicator (LQI), can be accessed with the RAIL API function  
  [sl_rail_get_rx_packet_details()](https://docs.silabs.com/rail/latest/rail-api/packet-information#sl-rail-get-rx-packet-details).
- Unit: N/A
- Min value: 0
- Max value: 255
- Applicability: Rx

###### SRC Operation (heading level 7)

- Description: SRC stands for Sample Rate Converter. SRC is available on IC  
  revision xG12 and above. The purpose of the SRC is to adjust the sampling rate  
  in the demodulator so that an integer oversampling rate (OSR) is achieved  
  after channel filtering. Integer OSR helps symbol synchronization that in turn  
  has a beneficial effect on sensitivity. By default the SRC is enabled.  
  Disable the SRC if a revision xG1 compatible configuration is required and/or  
  signal propagation minimization is required (i.e., for fast clear channel  
  assessment by an RSSI measurement).
- Unit: Self-explanatory enumerated list
- Applicability: Rx

###### Enable FEC on Tx (heading level 7)

- Description: This feature should be used with IEEE 802.15.4 SUN FSK PHYs if  
  transmitted packet requires FEC.
- Applicability: Tx

###### Enable Dynamic FEC (heading level 7)

- Description: This feature should be used with IEEE 802.15.4 SUN FSK PHYs. If  
  this mode is enabled, two sync words are configured, indicating if FEC is used  
  on packet. Shall be used with the following initialization API:  
  ```c  
    sl_rail_ieee802154_config_g_options(rail_handle, SL_RAIL_IEEE802154_G_OPTIONS_ALL, SL_RAIL_IEEE802154_G_OPTION_DYN_FEC)  
  ```
- Applicability: Tx

###### Skip 2nd Antenna Check with Phase Demod Antenna Diversity  (heading level 7)

- Description: When this feature is enabled and the antenna diversity related  
  criteria, RSSI and Correlation values, are met on the received signal, the  
  signal is deemed sufficiently strong, and the current antenna will be used to  
  demodulate the packet. If the current RSSI and Correlation values do not fulfill  
  the conditions above, then the algorithm proceeds with evaluation of the signal  
  strength on the other antenna. If this feature is disabled, the antenna  
  diversity algorithm will unconditionally measure the RSSI and CORR values on the  
  other antenna.
- Applicability: Rx

###### Fast Preamble Detect  (heading level 7)

- Description: This feature was introduced on EFR32xG23 and currently only  
  supported by 2(G)FSK modulation and the OQPSK modulations under Long Range  
  profile. Enables fast preamble detection, which is necessary for channels  
  scanning or low duty cycle / (also referred as PSM, Preamble Sense Mode). In  
  order to turn on this feature, additional RAIL Signal Qualifier (SQ) functions  
  must be used, such as [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ](https://docs.silabs.com/rail/latest/rail-api/rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq) or  
  [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS](https://docs.silabs.com/rail/latest/rail-api/rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq-with-options).
- Applicability: Rx

###### ETSI Category 1 Compatibility (heading level 7)

- Description: This entry is very specific to ETSI Rx category 1 compliance in  
  the 169 MHz band. It boosts blocking performance to meet the -20 dBm  
  specification without the need of an external SAW filter.  
  Only enable this if you are developing a narrowband (≤ 12.5 kHz operating  
  channel) 169 MHz ETSI category 1 compliant receive application.
- Unit: Self-explanatory enumerated list
- Applicability: Rx

###### Target Oversampling Rate (heading level 7)

- Description: This entry sets a target value on the oversampling rate (OSR).  
  OSR is the number of signal samples in one symbol in the digital demodulator.  
  You may want to increase this value for better DR offset tolerance and / or  
  faster Rx chain propagation delay.
- Unit: ratio
- Min value: 3
- Max value: 8
- Applicability: Rx

###### OOK Slicer Level (heading level 7)

- Description: This entry configures the slicing threshold in OOK demodulation.  
  OOK demodulation is done through a PEAK detector that follows the  
  instantaneous RSSI stream with a fast attack (fast charge) slow decay (slow  
  discharge) algorithm. The slicing threshold is an RSSI level above which the  
  signal is considered a digital one and below a digital 0. The slicing  
  threshold is developed as the PEAK detector value minus the OOK slicer level  
  which is adjustable in this entry. Decreasing this value improves sensitivity  
  at the price of robustness. A higher value is more robust against fluctuations  
  on the amplitude of the incoming signal, but introduces an artificial  
  threshold above the noise level (determined by the channel filter bandwidth).  
  A lower value means less signal power is needed above noise, to generate a  
  logic 1, but noise itself also can hit the threshold, making the output also  
  noisy. From generation EFR32xG12 to EFR32xG22, this value is set dynamically  
  during reception and should not be set manually. From EFRxg23 and on, this  
  property is not active anymore, as the radio configurator for these models  
  calculates this value automatically, and reliable.
- Unit: 2 dB
- Min value: 1
- Max value: 10
- Applicability: Rx

###### IR Cal Power Level (heading level 7)

- Description: This parameter sets the PA power level raw code during image  
  calibration when the external calibrating signal loopback is selected. This  
  may be configured if a certain sub GHz PHY is operating above 462 MHz and the  
  Rx and Tx paths are not connected together outside the chip. Such applications  
  may include simple two antenna Rx/Tx designs, FEM (Front End Module)-based  
  designs and front-end RF switch designs (that is, antenna diversity). Note  
  that for this control to take effect, SHARED_RX_TX_PATH must be selected in  
  the Common Rx/Tx circuit drop-down menu (Antenna card in the Advanced group)  
  even though the design is SPLIT_RX_TX_PATH. Note also that in the 2.4 GHz  
  band, no on-chip IR calibration can be run, so this control is not applicable  
  there.
- Background: Above 462 MHz the IR calibrating signal is looped back to the Rx  
  outside of the chip as it is routed through the PA. This is the only way to  
  provide the neccessary SNR on the calibrating signal in this frequency band  
  for the calibration to reach optimal rejection. If the Rx and Tx paths are not  
  connected together (see control Common RX/TX circuit) outside the chip the  
  above scheme cannot work, and the calibrating signal is looped back inside the  
  chip as a fallback option. In this band, however, the internal loopback  
  calibration performance is capped at ~ 40 dB rejection. While this is still an  
  improvement on outlier parts, on average it is a degradation. This is the  
  default operation when SPLIT_RX_TX_PATH is selected.  
  This control is provided to overcome the limited performance on IR calibration  
  by increasing the PA power level for the external loopback calibration to  
  bridge the isolation gap between the unconnected Tx and Rx paths. The power  
  level can be adjusted in units of power level raw codes where 0 is the minimum  
  level and 248 (on 20 dBm parts) is the maximum level in the sub GHz space. As  
  isolation between the Tx and Rx paths may differ greatly between designs,  
  finding the right value is a manual process. The process must be done on the  
  exact HW configuration to be implemented when the calibration is run (that is,  
  antennae attached to antenna ports or antenna terminated with measuring  
  instruments at final test).  
  To find the correct power level, begin with the PA power level raw code 0 and  
  keep increasing the code. Read back the [calibration  
  coefficients](https://docs.silabs.com/rail/latest/group-calibration-e-f-r32#gafbea2dbbd13346e2d4bd6c30dea6977e)  
  and also measure image rejection. After a certain code level both image  
  rejection and calibration coefficients stabilize and remain stable until high  
  power levels where the rejection performance may degrade again due to  
  saturation in the Rx chain. Select a code on the plateau that gives sufficient  
  margin (such as 5 PA power level codes) on the lower end. For information the  
  minimum power level for optimal calibration on the Rx input is -54 dBm.  
  Note that IR calibration is a once in a product lifetime calibration. It may  
  be done in the field after the first power-up of the device. The above  
  described method, however, is **strictly recommended to be done at  
  manufacturing test** as the increased power level during calibration may  
  violate regulatory standard limits.  
  In summary the above described alternative IR calibration method shall be used  
  if  
  - the design is operating above 462 MHz (and below 1000 MHz) and  
  - the Rx and Tx paths are not connected outside of the chip and  
  - ~ 40 dB image rejection is not acceptable in the product and  
  - the calibration can be performed in-house at manufacturing test.
- Unit: [PA power level  
  code](https://docs.silabs.com/rail/latest/group-p-a-e-f-r32#ga37838bfd8f434aade272985edd3b745d)
- Min value: 0
- Max value: The calculator uses 254 as the limit, but the actual limit depends  
  on the PA, e.g., `SL_RAIL_TX_POWER_LEVEL_SUB_GHZ_HP_MAX`
- Applicability: Tx/Rx

###### Byte Position of Dynamic Length Byte (heading level 7)

- Description: By default, the variable length byte location is the same as the  
  last byte of the header. Enabling this field can be used to override that, and  
  set it directly.
- Unit: bytes
- Min value: 0
- Max value: 4096
- Applicability: Tx/Rx

###### Length of the First Word  (heading level 7)

- Description: On reception, create the first received bytes from less than 8  
  bits. This can be used to "bitshift" the frame. Upper bits are padded with 0 in  
  the downloaded frame.
- Example: To drop the first 19 bits of the received frame, set this to 3, and  
  ignore the first 3 byte of the downloaded frame.
- Unit: bits
- Min value: 1
- Max value: 8
- Applicability: Tx/Rx

###### Antenna

###### Antenna Diversity Mode (heading level 7)

- Description: This entry selects the operation mode for Rx antenna diversity.  
  EFR32 can select between two antennas (referred to as ANT0 and ANT1) for  
  packet transmission and for packet reception as well, to mitigate the effect  
  of fading due to multipath propagation experienced especially in indoor  
  environments. Rx and Tx antenna selection are independent of each other. Tx  
  selection is handled completely on the application side where a manual  
  override for Rx selection is also possible.
- Unit: Enumerated list  
  - **Disable**: This option disables automatic Rx antenna selection. Manual    
    selection is still possible.  
  - **ANTSELFIRST**: Enables the SFG mode. In this mode the receiver is    
    alternating between ANT0 and ANT1 during timing search while looking for a    
    valid timing pattern on Rx signal. As soon as a valid timing has been    
    detected, SFG selects the actually active antenna for the rest of the frame,    
    or until timing is lost. If timing is lost, the antenna is switched, and the    
    radio is restarted. So, as its name suggests, the antenna is selected on    
    which a valid timing pattern is detected first, regardless of signal quality    
    metrics and without any related measurements. Use this option only if the    
    preamble budget does not allow for selecting an SB algorithm.  
  - **ANTSELRSSI**: Enables SB mode with RSSI-based quality metric (SB-RSSI). In    
    SB mode the receiver alternates between ANT0 and ANT1 during the timing    
    search looking for a valid timing pattern on the Rx signal. When a valid    
    timing pattern is found, antenna diversity tries to select the best antenna    
    for receiving the rest of the frame. To achieve this, the signal quality for    
    the currently active antenna is saved/updated at every subsequent antenna    
    switch. Therefore at the first timing detect event the algorithm already has    
    a fresh quality metric for one antenna. To be able to perform a valid    
    comparison between ANT0 and ANT1, the radio switches simultaneously with the    
    timing detect event to the other antenna to perform a signal quality    
    evaluation/update there. Finally, antenna quality results get compared, and    
    the algorithm selects the better antenna for packet reception. If the better    
    antenna is the current antenna then the Rx operation carries on with packet    
    reception without further antenna switching. If the better antenna is the    
    other antenna then the radio switches onto that one, reacquires timing and    
    carries on with packet reception on that antenna.
- Applicability: Rx, not available on xG1 family.

###### Diversity Select-Best Repeat (heading level 7)

- Description: This option makes the Select-Best diversity algorithms always go  
  back to the antenna on which timing detection occurred first (aka the first  
  antenna) for a recheck on signal quality because the measurement might be  
  degraded as a result of a partially occupied measurement window by the Rx  
  signal. This feature is an extra insurance that the signal qualification  
  measurement is correct on the first antenna before evaluation and final  
  antenna selection.
- Unit: Enumerated list  
  - **REPEATFIRST**: Signal qualification measurement is repeated on the first    
    antenna.  
  - **NOREPEATFIRST**: Signal qualification measurement is not repeated on the    
    first antenna.
- Applicability: Rx, not available on xG1 family

The worst-case antenna diversity SB scenario:

1. Switch to antenna B, no preamble in the air, no timing detected.
2. Switch to antenna A, preamble arrives late, no timing detected.
3. Switch to antenna B, preamble is in the air, antenna signal is weak for  
   timing detection.
4. Switch to antenna A, timing detected and antenna quality QA1 measured.
5. Switch to antenna B, antenna quality QB measured.
6. (if **REPEATFIRST**) Switch to antenna A, measure antenna quality QA2. (if  
   **NOREPEATFIRST**) Go to 7.
7. (if **REPEATFIRST**) QA2<QB, switch to antenna B, otherwise stay on antenna  
   A. (if **NOREPEATFIRST**) QB<QA1, switch to antenna A, otherwise stay on  
   antenna B.
8. Start packet search (timing, preamble, sync) on the best antenna selected in  
   7.

This worst-case sequence can be used to find the required minimum length of
preamble for the select best diversity mode.

###### Common RX/TX Circuit (heading level 7)

- Description: This option is completely independent from the antenna diversity  
  feature, and only takes effect on the reference signal’s path used during the  
  I/Q mixer’s calibration process to achieve good image rejection (IR)  
  performance. In the subGHz frequency range of 462 MHz to 1000 MHz the IR (I/Q)  
  calibration uses by default a test signal that is looped back externally,  
  going through the PA module and the Tx and Rx pins/paths. Below 462 MHz the IR  
  calibration applies by default an internal (PLL) loop back path, only to  
  ensure good IR performance over the whole subGHz region.  
  **Note**: The internal loop back calibration performance is worse in the  
  frequency region above 500 MHz.  
  External (PA) calibration path cannot be applied when the Tx / Rx paths are  
  not connected together. (For a workaround see the **IR cal power level**  
  parameter.) In such cases the IR calibration must apply the internal (PLL)  
  loop back. This control makes it possible to manually override the default  
  behavior according to the actual board layout.
- Unit: Self-explanatory enumerated list
- Applicability: Rx

#### Special Radio Profile Related Properties

##### Bluetooth Low Energy Profile

###### Bluetooth LE PHY Features

- Description: Bluetooth defines multiple PHYs and some feature requires  
  specifically configured version of the given PHY. This can be selected here.

|Mode|Comment|
|---|---|
|LE_1M|The "normal" 1Mbps Bluetooth PHY|
|LE_2M|The "normal" 2Mbps Bluetooth PHY|
|CODED_125K|125kbps Long Range Coded PHY|
|CODED_500K|500kbps Long Range Coded PHY|
|HADM_1M|1Mbps PHY used for Channel Sounding|
|HADM_2M|2Mbps PHY used for Channel Sounding|
|AOX_1M|1Mbps PHY used for AoX|
|AOX_2M|2Mbps PHY used for AoX|

##### IEEE802154 Profiles

###### Zigbee PHY Feature Select 

- Description: Some Zigbee features require specifically configured PHY, those  
  can be selected here.

|Mode|Comment|
|---|---|
|COHERENT|The default configuration for Zigbee|
|ANTDIV|Zigbee PHY configured for Antenna Diversity|
|FEM|Zigbee PHY optimized for FEM usage with 10dB gain|
|ANTDIV_FEM|Combination of the above two|
|FCS|Fast Switching PHY, optimized for concurrent listening on two channels|

###### BPSK PHY Feature Select

- Description: Two BPSK mode is defined in IEEE 802.15.4, those can be selected  
  here.

|Mode|Comment|
|---|---|
|STANDARD_20KBPS|20 kbps, intended for the 868MHz band|
|STANDRAD_40KBPS|40 kbps, intended for the 915MHz band|

##### Long Range Profile

###### Long Range Mode

- Description: This enum sets the Long Range profiles, which establish data  
  rates. The following table contains the default configuration options on Long  
  Range Profile and the recommended Crystal Oscillator (XO) accuracy:

|Frequency Band [MHz]|Data Rate [kbps]|(TX + RX) XO Accuracy [ppm +/-]|
|---|---|---|
|434/490|1.2|2.5|
|434/490|2.4|5|
|434/490|4.8|10|
|434/490|9.6|20|
|434/490|19.2|40|
|868/915|1.2|1.25|
|868/915|4.8|5|
|868/915|9.6|10|
|868/915|19.2|20|
|868/915|38.4|40|
|868/915|80|40|

For more information on Long Range Profiles and performances, see the [Long
Range Configuration Reference
document](https://docs.silabs.com/rail/latest/efr32-series-2-long-range-configuration/).

- Unit: Enumerated list
- Applicability: Tx/Rx

##### Mbus Profile

###### Mbus Frame Format

Sets the frame format to use:

- FrameA: Frame format A (10B first block, 16B further blocks, CRC after each  
  block, length does not include CRCs)
- FrameB: Frame format B (10B first block, max 115B second block, optional  
  block. CRC after second and optional block, length includes CRCs)
- NoFormat: No frame decoder; fixed length mode. Length must be set with  
  [sl_rail_set_fixed_length()](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-set-fixed-length) before packet Tx and during packet Rx (e.g. using  
  [sl_rail_peek_rx_packet()](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-peek-rx-packet) to check the length field when it is received)

###### Mbus Mode

Sets the mode (modulation, deviation, bit rate, and so on). Possibilities are:

- ModeS_32p768k
- ModeT_M2O_100k
- ModeT_O2M_32p768k
- ModeR_4p8k
- ModeC_M2O_100k
- ModeC_O2M_50k
- ModeN1a_4p8K
- ModeN1c_2p4K
- ModeNg

###### Symbol Encoding

Sets the symbol coding:

- NRZ – No symbol coding
- Manchester – Manchester (zero is “10”). Also adds 2 bits of “10” postamble for  
  Tx packets
- 3 of 6 – 3 out of 6 coding. Not recommended for Tx as it does not send  
  postamble.

###### Enable Dual Syncword Detection

Enable Dual Syncword Detection Enables second sync word for ModeC, ModeN, and
ModeF

###### Mbus Postamble Length

Configures the postamble length in sets of two alternating chips (i.e. either
‘01’ or ‘10’). This is required for modeS and modeT, and a maximum of 4 pairs (8
chips) can be transmitted.

###### Preamble Length Total

Total length of the preamble in bits. Since EN13757-4 only specifies the minimum
preamble length for a number of modes (which is used by our preconfigured
modes), this setting can be used to configure it for a longer preamble.

##### Sidewalk Profile

###### Sidewalk Mode 

This option is for future use.

##### Wi-SUN Profiles

###### Wi-SUN Regulatory Domain

- Description: Configures the frequency band according to the selected region.
- Unit: Enumerated list
- Applicability: Tx/Rx

###### Wi-SUN Operating Class

> **Note**: Only for Wi-SUN FAN 1.0 Profile

- Description: Configures the center frequency and channel spacing within the  
  Regulatory Domain.
- Unit: Self-explanatory enumerated list
- Applicability: Tx/Rx

###### Wi-SUN Operating Mode in FAN 1.0 

> **Note**: Only for Wi-SUN FAN 1.0 Profile, though HAN profile has the same
> input with more limited options

- Description: Configures the Wi-SUN mode. This protocol uses 2FSK modulation  
  with different frequency and modes based on region. The following table shows  
  the modes and the associated modulation index and data rate:

|PHY Operating Modes|Symbol Rate (ksymb/s)|Modulation Index|
|---|---|---|
|1a|50|0.5|
|1b|50|1.0|
|2a|100|0.5|
|2b|100|1.0|
|3|150|0.5|
|4a|200|0.5|
|4b|200|1.0|
|5|300|0.5|

- Unit: Self-explanatory enumerated list
- Applicability: Tx/Rx

###### Wi-SUN Operating Mode in HAN 

> **Note**: Only for Wi-SUN HAN Profile, though FAN 1.0 profile has the same
> input with more options

- Description: Configures the Wi-SUN mode. This protocol uses 2FSK modulation  
  with different frequency and modes based on region. The following table shows  
  the modes and the associated modulation index and data rate:

|PHY Operating Modes|Symbol Rate (ksymb/s)|Modulation Index|
|---|---|---|
|1b|50|1.0|
|2b|100|1.0|

- Unit: Self-explanatory enumerated list
- Applicability: Tx/Rx

###### Wi-SUN Operating Mode ID

> **Note**: Only for Wi-SUN FAN 1.1 Profile in Channel Group settings.

- Description: Configures the Wi-SUN mode by selecting the unique 8-bit value  
  used to identify the Wi-SUN PHY operating modes defined by the Wi-SUN  
  specification. This protocol uses 2FSK or OFDM based on the selected operating  
  mode. For 2FSK, Table 2.15 shows the modes and the associated modulation index  
  and data rate. For OFDM, Table 2.16 shows the modes and the corresponding OFDM  
  Modes and MCS indexes. As shown in Table 2.17, the OFDM Option selects the  
  channel parameters. During Rx, the used MCS is automatically detected, while in  
  Tx, the MCS index is selected through RAIL. OFDM is only available on EFR32FG25  
  devices.

|Operating Mode ID|Symbol Rate (ksymb/s)|Modulation Index|FEC|
|---|---|---|---|
|1|50|0.5|FALSE|
|2|50|1|FALSE|
|3|100|0.5|FALSE|
|4|100|1|FALSE|
|5|150|0.5|FALSE|
|6|200|0.5|FALSE|
|7|200|1|FALSE|
|8|300|0.5|FALSE|
|17|50|0.5|TRUE|
|18|50|1|TRUE|
|19|100|0.5|TRUE|
|20|100|1|TRUE|
|21|150|0.5|TRUE|
|22|200|0.5|TRUE|
|23|200|1|TRUE|
|24|300|0.5|TRUE|

|Operating Mode ID|OFDM Option|MCS|
|---|---|---|
|34-38|1|2-6|
|51-54|2|3-6|
|68-70|3|4-6|
|84-86|4|4-6|

| |OPT1|OPT2|OPT3|OPT4|
|---|---|---|---|---|
|DFT size|128|64|32|16|
|Number of sub-carriers|104|52|26|14|
|Channel width (kHz)|1094|552|281|156|
|Channel spacing (kHz)|1200|800|400|200|
|MCS0 (kbps)|100|50|25|12.5|
|MCS1 (kbps)|200|100|50|25|
|MCS2 (kbps)|400|200|100|50|
|MCS3 (kbps)|800|400|200|100|
|MCS4 (kbps)|1200|600|300|150|
|MCS5 (kbps)|1600|800|400|200|
|MCS6 (kbps)|2400|1200|600|300|

- Applicability: Tx/Rx

###### Wi-SUN Channel Plan ID

> **Note**: Only for Wi-SUN FAN 1.1 Profile in Channel Group settings.

- Description: This entry selects the unique 6-bit value used to identify the  
  regulatory channel plan defined by the Wi-SUN specification.
- Unit: Enumerated list
- Applicability: Tx/Rx

###### Concurrent OFDM Option

> **Note**: Currently only available on EFR32FG25 in Wi-SUN FAN 1.1 Profile
> Channel Group settings for the following Operating Mode and Channel Plan
> combinations:

|Regulatory Domain|FSK Operating Mode ID|Channel Plan ID|Available Concurrent OFDM Option|
|---|---|---|---|
|EU|1|32, 34, 36|OPT4|
|NA|2|1|OPT1|
|JP|4|22|OPT3|

- Description: Selects the alternate OFDM PHY settings. For further details on  
  Concurrent Detection Mode, see [Getting Started with Concurrent Mode on  
  EFR32FG25 using  
  RAILtest](https://docs.silabs.com/wisun/latest/wisun-concurrent-mode-with-railtest).
- Unit: Enumerated list
- Applicability: Tx/Rx

##### SUN OQPSK Profile

###### FCS Type (CRC)

- Description: This field selects the frame check sequence length.
- Unit: Enumerated list  
  - **TWO_BYTE**: 2-octet FCS used.  
  - **FOUR_BYTE**: 4-octet FCS used.
- Applicability: Tx/Rx

###### SUN OQPSK Chiprate

- Description: This field sets the OQPSK chiprate.

|Chiprate (KCPS)|Rate Mode|Data Rate (kbps)|
|---|---|---|
|100 KCPS|RM0|6.25|
|100 KCPS|RM1|12.5|
|100 KCPS|RM2|25|
|100 KCPS|RM3|50|
|1000 KCPS|RM0|31.25|
|1000 KCPS|RM1|125|
|1000 KCPS|RM2|250|
|1000 KCPS|RM3|500|

- Unit: Enumerated list
- Applicability: Tx/Rx

#### Length Configuration

The radio support 3 different modes to configure the length of the packet:

1. Fixed length: The length of the packet can be changed with a dedicated RAIL  
   API.
2. Variable length: The length of the packet is in a field in the packet,  
   usually at the beginning.
3. Frame type: We define a few different packet lengths, that we encode into  
   maximum 3 bits.

This mode can be selected from a dropdown menu in the [Frame
General](03-radio-parameters#frame-length-algorithm) card.

The packet itself can be built up from a _header_ and a _payload_. In some
cases, when talking about packet length we could mean the sum of both lengths or
just the length of the payload. This chapter will highlight which meaning is
used for the given mode.

Note**: The amount of data you load into the transmit buffer **does not** change
the configured length. If it is less than the configured length, you will
receive a [SL_RAIL_EVENT_TX_UNDERFLOW](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-tx-underflow) event during transmission. Length
configuration applies to both receiver and transmitter.

##### Fixed Length

All packets have the same payload length, which is configured by the [Fixed
Payload Size](03-radio-parameters#fixed-payload-size) field on the **Frame
Fixed Length** card. This card is automatically hidden when a different length
algorithm is selected. This input only configures the length of the payload,
without the header.

In fixed length mode, the length can be changed during runtime with
[sl_rail_set_fixed_length()](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-set-fixed-length). However, RAIL does not handle the header and
payload separately, so this API sets the sum of these two.

##### Variable Length

In variable length mode, the length is defined by the Length field. It stores
the length of the payload (without the header). The length field is at maximum
12 bits long, normally stored near the end of the header. Therefore, the header
must be enabled when variable length mode is used (this happens automatically,
if header was disabled when switching to variable length mode).

The length field can start at any bit in the header but the last bit of the
field must be at most 7 bits from the end of the header. The length field can
use different endianness from the frame and a static offset can be added or
subtracted from the field. All of these can be configured on the [**Frame
Variable Length**](03-radio-parameters#frame-variable-length) card, which
is automatically enabled upon selecting this algorithm.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/length-field.png)

If the [sl_rail_set_fixed_length()](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-set-fixed-length) is used with variable length mode, the radio
will switch to fixed length mode. Returning to variable length mode is possible
by calling [sl_rail_set_fixed_length()](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-set-fixed-length) with the parameter
[SL_RAIL_SET_FIXED_LENGTH_INVALID](https://docs.silabs.com/rail/latest/rail-api/radio-configuration#sl-rail-set-fixed-length-invalid).

###### Length Decoding Process

To correctly configure variable length mode, it is useful to understand the
length decoding process. The radio first receives the Header, and extracts the
last 2 bytes of it for length decoding. If the header is only 1 byte, the
decoder prefixes it with 0x00.

1. If [Variable Length Byte  
   Endian](03-radio-parameters#variable-length-byte-endian) is set to LSB  
   first, it swaps the bytes (it does not do anything on a single byte length  
   field).
2. It reverses the bit endianness of both bytes, if [Variable Length Bit  
   Endian](03-radio-parameters#variable-length-bit-endian) is not the same  
   as [Frame Bit Endian](03-radio-parameters#frame-bit-endian).
3. Shifts right by [Variable Length Bit  
   Location](03-radio-parameters#variable-length-bit-location) number of  
   bits.
4. Masks with an all-one mask with the length of [Variable Length Bit  
   Size](03-radio-parameters#variable-length-bit-size).
5. Adds the value of the [Variable Frame Length  
   Adjust](03-radio-parameters#variable-frame-length-adjust) (which might  
   be negative) to the result.
6. If the resulting length is less than [Minimum  
   Length](03-radio-parameters#minimum-length) or more than [Maximum  
   Length](03-radio-parameters#maximum-length), it aborts the reception,  
   and generates a [SL_RAIL_EVENT_RX_FRAME_ERROR](https://docs.silabs.com/rail/latest/rail-api/events#sl-rail-event-rx-frame-error), otherwise it continuous  
   reception with the length.

Because [Variable Length Bit
Location](03-radio-parameters#variable-length-bit-location) is maximum 7
bits, **the last bit of the length field must be in the last byte** of the
header.

An element on the Frame Variable Length card will show the 2 bytes used by the
length decoder and how the length field is located in it.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/v6-length-field-light.png)

If the header must be used for other purposes (e.g., first few bytes are not
whitened, but the length field is), the length field location can be configured
independently from the header size with the [Byte Position of Dynamic Length
Byte](03-radio-parameters#byte-position-of-dynamic-length-byte) field.

##### Frame Type

The details of this method are configured on the [**Frame Type
Length**](03-radio-parameters#frame-type-length) card, automatically
enabled on selecting this algorithm.

This is an option whereby the frame length information is available in the frame
itself in a coded fashion. The code is then resolved by the radio hardware into
preconfigured length settings. We call this code _Frame Type_. The Frame Type
can be up to 3 bits long, which means up to 8 frame lengths can be configured.
Additionally, address filtering can be configured on each frame.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/frame-type-light.png)

This mode is handled slightly differently from RAIL, compared to Fixed and
Variable length modes. While in fixed and variable length mode, the length
decoder works the same in both receive and transmit, FRAME_TYPE mode is only
active in receive. When transmitting, the radio will ignore the length bits and
instead transmit the full FIFO.

The following options can be configured on the Frame Type field:

- [Number of Frame Type  
  Bits](03-radio-parameters#number-of-frame-type-bits): Sets the length of  
  the Frame Type.
- [Frame Type Location](03-radio-parameters#frame-type-location): Sets the  
  location (in Bytes) of the Frame Type.
- [Frame Type Bit0 Location](03-radio-parameters#frame-type-bit0-location):  
  Sets the location (in bits) of the Frame Type.

For each Frame Type, the following can be configured:

- [Enable](03-radio-parameters#frame-typex-enable): Enables or disables the  
  given frame type .
- [Address Filter](03-radio-parameters#frame-typex-address-filter): Uncheck  
  it to disable the address filter on these types (that is, the address filter  
  is enabled from RAIL, but these frame types would not be filtered).
- [Length](03-radio-parameters#frame-typex-length): Sets the length of the  
  frame coded by the given frame type.

#### About Antenna Diversity

An EFR32 can select between two antennas (referred to as ANT0 and ANT1) for
packet transmission and for packet reception, to mitigate the effect of fading
due to multipath propagation experienced particularly in indoor environments. Rx
and Tx antenna selection are independent of each other. Tx selection is handled
completely on the application side where a manual override for Rx selection is
also possible.

Indoor fading typically causes 5-6 dB reduction in received signal strength. In
practice this means that if one antenna falls into a “dead spot”, resulting in
bad or no reception, switching to the other one can result in an improved link
performance assuming correct antenna placement. Fading conditions vary over time
due to moving objects and people, therefore a dynamic and agile antenna
validation and selection feature is needed.

The Antenna Diversity feature facilitates two kinds of automatic methods for Rx
antenna selection on top of the manual one, namely the Select-First-Good (SFG)
and the Select-Best (SB) algorithms. Only SB takes into account signal quality
for antenna selection, where signal/antenna quality is based on RSSI
measurements.

When antenna diversity is enabled, the radio keeps toggling in Rx between the
two antennas until timing detect occurs on one of them. For more information,
see [Timing Detection](03-radio-parameters#timing-detection). Only the
switching pattern and selection strategy differs for the two main modes, SFG and
SB.

**Note**: The radio reverts back to SFG whenever the input signal level is
perceived by the AGC block to be high enough for proper detection. This is
typically between -65 to -80 dBm, well above sensitivity levels. When low signal
levels are reached, antenna diversity will switch its operation mode back to the
requested and preferred one automatically.

For deterministic operation, after every antenna switching not only the timing
detection but the AGC block plus DC and frequency compensation are also
restarted. Therefore a **proper antenna dwell time, and thus the preamble
length, will be a main factor in using antenna diversity effectively.** The
latter is critical in giving enough time to complete the detection and selection
process before the sync word arrival, in every possible situation. Different
modes require different amount of preamble time for their proper operation.

The required preamble length is dependent on:

- Length of the timing sequence used for Timing Detection
- AGC and detection block settle times at antenna switching
- Internal processing time
- RSSI measurement time

**At any point during or after the selection process, when timing is lost,
antenna switch will occur and the operation restarts, in other words the radio
goes back to timing search.**

The antenna dwell time is automatically determined by the configured timing
detection scheme, AGC and RSSI measurement settings, and highly correlates with
the timing window length.

> **Note**: The internal base profile PHYs were created without antenna diversity
> in mind. Thus at least the timing detection scheme (number of symbols in timing
> window, number of timing windows to detect, timing samples threshold), preamble
> length, AGC settling delay, and RSSI measurement settings must be reviewed under
> the Advanced tab of the radio configurator when enabling antenna diversity.
> Since the driving event behind antenna diversity is timing detection, a robust
> yet fast timing detection scheme is required to save preamble time in general
> and to avoid false timing detects triggering unnecessary antenna selection
> process resulting in possible packet miss.

> **Note**: Due to the short antenna dwell times Automatic Frequency Cancellation
> feature is not available, only the Internal Frequency Compensation can be used.

After timing detection is asserted on one antenna the algorithm can follow
various paths based on the configuration in Antenna Diversity Mode.

Antenna switching can be internal or external. In case of external diversity, a
GPIO-controlled external switch is used to toggle between the antennas.
Conversely, internal switching is done by toggling internal RF paths that are
connected to the antennas. Both of these modes utilize hardware to determine the
best source option.

> **Note**: Internal antenna diversity is only available on Series 2 devices: xG21
> and xG23. For xG28, this feature is applicable only to certain parts, where each
> RF path goes to a different antenna.

##### Antenna Diversity Application Support

The various Silicon Labs software stacks and SDKs such as EmberZNet, Silicon
Labs Thread, and Flex support antenna diversity on different levels and with
different feature lists. For those implementations please consult the
corresponding documentation regarding antenna diversity feature support, for
example [AN1181: Configuring Antenna Diversity for
EmberZNet](https://www.silabs.com/documents/public/application-notes/an1181-configuring-antenna-diversity-for-wireless.pdf).

Custom and/or stackless implementations should rely on the RAIL API in using
antenna diversity. We give a quick summary here, but for specifics please search
the RAIL documentation available here:
[https://docs.silabs.com](https://docs.silabs.com/).

To use antenna diversity with RAIL, the [sl_rail_config_antenna()](https://docs.silabs.com/rail/latest/rail-api/antenna-control#sl-rail-config-antenna) API can be
used to configure the GPIO pins that will drive the external RF switch. In case
of internal RF path switching, the `default_rf_path` field of
[sl_rail_antenna_config_t](https://docs.silabs.com/rail/latest/rail-api/sl-rail-antenna-config-t) should be set to `SL_RAIL_ANTENNA_AUTO'`.

As shown in the images below, antenna diversity can be also configured from
Software Components. Use **RAIL Utility, Default Internal RF Path
Configuration** with **RF Path Mode** set to **Auto** for the internal one and
**RAIL Utility, Antenna Diversity Configuration** for configuring the external
switch.

![screenshot](/proprietary-radio-configurator-guide/0.1/images/internal-diversity-light.png)

![screenshot](/proprietary-radio-configurator-guide/0.1/images/external-diversity-light.png)

The Rx behavior of the radio can be configured with
[sl_rail_config_rx_options()](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-config-rx-options) passing either [SL_RAIL_RX_OPTION_ANTENNA_0](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-antenna-0),
[SL_RAIL_RX_OPTION_ANTENNA_1](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-antenna-1) for static, manual antenna selection (meaning Rx
diversity off); or [SL_RAIL_RX_OPTION_ANTENNA_AUTO](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-antenna-auto) for dynamic, automatic
selection as an argument (meaning Rx diversity on). The `antenna_id` field of
[sl_rail_rx_packet_details_t](https://docs.silabs.com/rail/latest/rail-api/sl-rail-rx-packet-details-t) indicates on which antenna was the packet
received.

The algorithm of Rx antenna diversity itself, when enabled, is governed by the
configuration in the Radio Configurator's Antenna card (Advanced group).

The antenna selection for a Tx operation is handled at the Tx starting API
functions like [sl_rail_start_tx()](https://docs.silabs.com/rail/latest/rail-api/packet-tx#sl-rail-start-tx) and similar by passing options
[SL_RAIL_RX_OPTION_ANTENNA_0](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-antenna-0) or [SL_RAIL_RX_OPTION_ANTENNA_1](https://docs.silabs.com/rail/latest/rail-api/receive#sl-rail-rx-option-antenna-1). If neither or
both of these option is set at the function call then Tx takes place on the
antenna defined/determined by the last Rx or Tx operation. So, by default (not
passing an antenna-related Tx option) all Tx operation takes place on the
antenna where the last packet was received by antenna diversity.

The Auto-ACK message is transmitted on the antenna where the ACK-ed frame in
question was received by antenna diversity.

#### Multi-PHY Configuration Example‌

Consider the following requirements:

1. Five channels (channels 0-4) FSK with 300 kHz channel spacing, starting at  
   905 MHz, using the built-in 50 kbps 915 MHz PHY of the base profile as a  
   base.
2. Add another channel (channel 5) with the same setup as the first group, but  
   at 907 MHz, as a special channel distance.
3. Add one more channel (channel 6) where the same config is used but with 32B  
   length packets. This should be at 908MHz
4. On the 908 MHz channel it should be possible to receive frames with both 50  
   kbps and 100 kbps bitrates. Note: In order to implement this an additional  
   channel definition (channel 7) is required.

To create a configuration covering these requirements, do the following in the
Radio Configurator, where each step corresponds to a requirement above:

1. To set up the protocol according to the requirements in 1 above:  
   1. Select the 915M 50 Kbps PHY as shown in the following figure:    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step1-light.png)  
   2. Enable customization and set up a 905 MHz base frequency with 300 kHz    
      channel spacing:    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step2-light.png)  
   3. With this setup, by default we have one channel group with 21 channels    
      from 0 to 20, so change the last channel number to 4 on the channels    
      overview:    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step3-light.png)
2. 907 MHz cannot be defined with the group created in the first step, as it  
   does not follow the 300 kHz channel spacing. We can however create a new  
   channel group that starts from a different base frequency. Channel groups can  
   be created by either the copy or new channel group buttons:  
   ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step4-light.png)  
   1. Create a new channel group with a single channel (channel 5) at 907MHz:    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step5-light.png)    
      Note the    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/icon-revert.png)    
      and    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/icon-pencil.png)    
      icons. The arrow allows to revert the change we did (to the config    
      inherited from the protocol), while the pencil tells us that this is a    
      field that was changed in the _Protocol Configuration_ as well.
3. Create the 908 MHz channel the same way as in step 2, set up the base  
   frequency to 908 MHz, and the first and last channel to 6. This time however,  
   we also change the payload size:  
   ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step6-light.png)  
   This generates two small configuration difference arrays (delta configs),  
   which configure the frame length between the channel 6 and the channels 0-5.  
   RAIL will load one of these config deltas automatically when you switch  
   between channels of different channel groups (see  
   `sl_rail_channel_config_entry.phy_config_delta_add` in the RAIL API  
   documentation).
4. The bitrate of channel 6 is the default 50 kbps inherited from the protocol.  
   It cannot set to both 50 and 100 kbps, but a new channel 7 can be created on  
   the same frequency, with a different bitrate using a new channel group.  
   1. Create and set up a channel group for channel 7 by copying channel 6,    
      changing the channel number to 7 and modify the bitrate:    
      ![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step7-light.png)    
      We also changed the deviation here, to keep the same modulation index.    
      **RAIL will always load the same amount of configuration data when    
      changing between channel groups. In this example, RAIL will reconfigure    
      the bitrate even when changing between channel 6 and 7, which have the    
      same bitrate.** If config change or channel change is time critical, it is    
      recommended to review the generated rail_config.c, making sure we only    
      have delta configs where we really need them.

If we go back to the protocol configuration, you can see the channels you set up
on the channels overview:

![screenshot](/proprietary-radio-configurator-guide/0.1/images/multiphy-step8-light.png)

As discussed earlier, channel 6 and 7 are on the same frequency, so they are not
channels in the traditional sense. We use RAIL's config loading capability to
define these virtual channels that will allow us to load radio configuration
changes.

### EFR32 Series 1 Long Range Configuration Reference

#### EFR32 Series 1 Long Range Configuration Reference

**NOTE: This section replaces _UG460: EFR32 Series 1 Long Range Configuration Reference_. Not recommended for new designs. For new designs, see [EFR32 Series 2 Long Range Configuration Reference](/rail/{build-docspace-version}/efr32-series-2-long-range-configuration).**

To help customers achieve the crucial design element of maximum effective range, Silicon Labs has developed a Long Range radio profile for the EFR32 Series 1 family of Wireless MCU devices. This guide introduces the profile, describes its development, and examines underlying details that enable it to realize extended range. It also includes an exercise to build a Range Test example using Simplicity Studio 5 and to explore the Long Range profile, so that you can quickly begin implementation in your next project.

This guide is designed for developers who would like to test long range performance on EFR32 Series 1 devices using Simplicity Studio 5 and Silicon Labs development hardware. It provides instructions to get started using the example applications provided with the Gecko SDK Suite (GSDK) v3.

##### Key Points

- Learn about DSSS
- Learn about the Long Range Profile
- Learn about the Radio Configurator
- Create a Range Test application with a long range PHY

#### Introduction

One of the most important performance metrics for an IoT application is maximum usable range. Practically speaking, this refers to the maximum distance at which messages can be received without a loss of information. The achievable range is impacted by many different factors:

- Hardware influences, including:  
  - Antenna physical parameters (size, shape, directivity, gain)  
  - Battery physical parameters (size, capacity, load current, and so on)
- Propagation attributes of the radio signal (carrier frequency, humidity, obstacles, and so on)
- Transmit power
- Receiver sensitivity

To maximize usable range, when developing the Long Range (LR) profile Silicon Labs targeted the last item above, receiver sensitivity, which is affected by multiple input parameters:

- Frame length: The amount of data to be transported
- Data rate: The timeframe available to transport the data
- Data rate offset tolerance: How much the data rate can change during reception
- Frequency offset tolerance: How severely the carrier frequency can vary during the reception
- Selectivity and blocking: Robustness against interferer signals

Though many paths can be taken to improve RX sensitivity, Silicon Labs avoided hardware changes and instead focused on radio configuration modifications. This reliance on PHY development insulated the Long Range profile from additional external hardware dependencies, making the LR PHY benefits available to a broader selection of applications.

The construction of these PHYs is detailed in [Using the Long Range Profile in Simplicity Studio 5](03-using-the-long-range-profile-in-simplicity-studio-5) provides instructions on evaluating the Long Range Profile using new Silicon Labs development tools and hardware. [Measured Performance of the Long Range PHYs](04-measured-performance-of-the-long-range-phys) reviews real-world measured performance with the LR PHYs.

#### Development of the EFR32 Long Range PHYs

The fundamental approach to extend usable range in the LR Profile was to decrease receiver bandwidth, while keeping key signal parameters for the demodulator, such as modulation index for FSK, intact. A few rules of thumb help to visualize what was available for this effort:

- Reducing bandwidth by half improves sensitivity by 3 dB
- Reducing bandwidth by 90% (to 1/10th of the original) boosts sensitivity by 10 dB

A straightforward compromise to achieve bandwidth reduction is to decrease the data rate. By cutting bandwidth in favor of sensitivity, one has to also contend with the resulting degradation in frequency offset tolerance. Moreover, such narrow-band PHYs require very accurate and stable clock references (for example, a 0.5 ppm TCXO), and those elements are more costly. In terms of RF immunity, the effect of going narrow band is mixed, with some improvement in selectivity and blocking offset by extended exposure time to interferers due to the reduced data rate.

Importantly, all of these drawbacks can be mitigated by using Direct Sequence Spectral Spreading (DSSS). This technique, which is available for all major modulation formats on the EFR32, is explored in the following section.

##### DSSS: Theory of Operation

DSSS is a technique to increase the bandwidth of a transmitted signal, and thereby decrease its power spectral density. It is beneficial for the receiver side as well, as the robustness (immunity against interferer signals) significantly improves. This section reviews the DSSS implementation on EFR32 Series 1 devices.

###### TX Side

![Transmission of 802.15.4 Signals Using DSSS](/efr32-series-1-long-range-configuration/0.1/images/sld798-image1.png)

The above figure shows how a DSSS-based signal is constructed. As a practical demonstration vehicle, this example uses the 802.15.4 Zigbee packet format.

The baseband input signal is a narrow band, low data rate signal stream (its spectrum plot represented by the green cone). This bitstream is fed into a DSSS encoder, which replaces every 4 bits of the bitstream with a 32-bit symbol, often referred to as 32 “chips”.

Transmitting 1 symbol takes the same amount of time as transmitting 4 bits of the original data stream. This means that the “chip rate” is 8x higher than the original data rate, a multiplier often referred to as the Spreading Factor.

The blue rectangle (spectrum plot of baseband input signal after DSSS encoding) demonstrates that the original narrow band signal has become much wider (though not quite 8x), with less power density. The resulting data stream with the chip rate is then fed into the modulator and radiated over the air. Therefore, by increasing the link's in-air baud rate, the same data can be transmitted with the same net data rate, over the same period of time, but using a much wider band and lower power spectral density.

###### RX Side

![Reception of 802.15.4 Signals Using DSSS](/efr32-series-1-long-range-configuration/0.1/images/sld798-image2.png)

The above figure shows reception of the DSSS-encoded transmission detailed in the previous section. The demodulator retrieves the data stream from the OQPSK signal. The bits are changing with the chip rate, and the stream may contain errors due to the presence of noise and interferers in the air.

The plot at the top left corner of the above figure demonstrates the spectral conditions while receiving a DSSS packet. The red pyramid indicates the presence of a strong narrowband interferer, while the yellow trapezium represents the wideband noise.

This corrupted chip stream is fed into the DSSS Decoder, which replaces every 32-chip long symbol with a 4 bit pattern, thus restoring the original data stream. Despite errors in the chip stream, the decoder can still identify the correct 32-chip symbols due to the 8x redundancy presented by the scaling factor.

The spectrum plot at the top right corner of the figure shows that the original green cone has been restored by this de-spreading procedure, while the red cone has been “smeared” with the noise. As a result, SNR is increased, which compensates for the increased noise power experienced by the demodulator due to the high in-air bandwidth.

##### DSSS: Practical Impacts

As a result of using DSSS, an application is subject to the following considerations:

- Co-channel and adjacent channel selectivity improve by a factor of the coding gain (3 to 8 dB, depending on spreading factor)
- A less accurate (cheaper) crystal can be used for the clock reference
- Higher TX power can be used in cases where the regulatory limit is defined as maximum allowed power spectral density
- DSSS alone does not technically improve RX sensitivity to in-air signals:  
  - Receiving a 1 kbps data stream exhibits the same RX sensitivity whether or not the signal content is DSSS-encoded  
  - DSSS increases the symbol rate and bandwidth of the signal physically present in the air, which actually degrades reception at the RX side, but this consequence is compensated by the DSSS **processing gain** in the receiver

##### Scaling the 802.15.4 PHY

To leverage the benefits of DSSS and develop robust Long Range options for EFR32 Series 1 devices, Silicon Labs began with the highly optimized 802.15.4 Zigbee PHY, and derived a series of radio configurations to serve a variety of sensitivity and tolerance requirements. Essentially, the data rate (and therefore the occupied bandwidth) has been scaled down, while retaining the same Zigbee coding scheme: OQPSK, DSSS SF=8, and 32-bit symbol length with a 4-bit symbol map. The resulting PHY configurations are available for xG12 / xG13 / xG14 variants of the Series 1 family.

The following table shows one group of PHYs optimized for a lower frequency band, and another group optimized at a higher frequency band. Notably, the stated performance is maintained when setting the carrier frequency to anywhere within each band.

The table indicates the required XO accuracy for the TX and RX side COMBINED. Practically speaking, the value in the table should be SPLIT between TX and RX sides. This presents a cost savings opportunity on nodes manufactured in large quantities vs low volume base stations, where you can asymmetrically distribute the XO accuracy budget to reduce the cost of high volume elements.

> **Note**: The last item, 80 kbps for 915MHz, can be used to pass FCC 15.247 requirements without the need for frequency hopping, as the occupied bandwidth of the signal is > 500 kHz.

**Table: PHY Configuration Options on the Long Range Profile**

|Frequency Band[MHz]|Data Rate[kbps]|(TX + RX) XO Accuracy[ppm +/-]|
|---|---|---|
|434/490|1.2|2.5|
|434/490|2.4|5|
|434/490|4.8|10|
|434/490|9.6|20|
|434/490|19.2|40|
|868/915|1.2|1.25|
|868/915|4.8|5|
|868/915|9.6|10|
|868/915|19.2|20|
|868/915|38.4|40|
|868/915|80|40|

##### Radio Boards Supporting Long Range PHY Evaluation

Many configurations within the Long Range Profile can be successfully demonstrated on any radio board with a supported EFR32 Series 1 SoC and suitable sub-GHz band support. However, for those users who would like to test the best possible narrow band PHY configurations, radio boards that satisfy the XO requirements in the table above are also available for purchase. The following table specifies the configurations Silicon Labs currently offers.

**Table: Radio Boards with TCXO**

|Ordering Part Number|Board ID|Board Configuration|
|---|---|---|
|SLWRB4261A|BRD4261A|EFR32FG14 Dual-Band 2400 / 490 MHz +19.5dBm|
|SLWRB4262A|BRD4262A|EFR32FG14 Dual-Band 2400 / 915 MHz +19.5dBm|
|SLWRB4262B|BRD4262B|EFR32FG14 Dual-Band 2400 / 868 MHz +19.5dBm|

These boards are equipped with a high performance (+/- 0.5 ppm accuracy) TCXO for the HFXO reference, as shown by the schematics in the following figure. The TCXO supply is connected to pin PC9 on the SoC, which enables the EFR32 to shut down the TCXO when not in use to save power. If the customer application needs PC9 for a different purpose, the TCXO power supply can instead be connected directly to the VMCU rail (via the R209 solder dot seen in the following figure).

![TCXO Connection to EFR32](/efr32-series-1-long-range-configuration/0.1/images/sld798-image4.png)

![TCXO Power Supply](/efr32-series-1-long-range-configuration/0.1/images/sld798-image5.png)

![Figure: TCXO-based Radio Board and Wireless Starter Kit (WTSK) Board](/efr32-series-1-long-range-configuration/0.1/images/sld798-image7.png)

#### Using the Long Range Profile in Simplicity Studio 5

##### Long Range Profile in the Radio Configurator

Simplicity Studio 5 (SSv5) makes it easy to access Long Range PHY configurations by selecting the new "Long Range" profile in the Radio Configurator interface. If you need a refresher, see the [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/) and [Proprietary Radio Configurator Guide](/rail/{build-docspace-version}/proprietary-radio-configurator-guide) for more information on building an example wireless application with the Radio Configurator.

![Long Range Profile in the Radio Configuration](/efr32-series-1-long-range-configuration/0.1/images/sld798-image8.png)

Click the **Select radio profile** drop-down field, and select **Long Range Profile**. Note that PHYs in this profile have reduced configuration options (carrier frequency, and FEC enable), described here:

- Carrier frequency can be set to anywhere within each band – baseband performance will be sustained at all frequencies within a given band. However, be aware that external components can exhibit a frequency dependence.  
  - 425MHz to 525MHz, or 860MHz to 930 MHz
- FEC (Forward Error Correction) can be enabled for any of the PHY configurations:  
  - FEC in EFR32 Series 1 simply doubles the number of transmitted symbols. Enabling FEC does not automatically adjust the data rate. To maintain the original effective throughput, manually select a data rate that is twice the original rate.  
  - FEC does not increase sensitivity, but it can protect against missing bits due to interferer signals.
- Silicon Labs Connect does not currently support FEC, so if you plan to use these PHYs with Connect, do not enable FEC.

The next section provides a procedure to construct a complete example application with which to evaluate PHYs in the Long Range Profile using two EFR32 radio boards.

##### Build a Range Test Example Application

This section describes the steps to build a Range Test application, and is based on [UG147: Range Test Demo User's Guide](https://www.silabs.com/documents/public/user-guides/ug147-flex-gecko-range-test-demo.pdf). Additional guidance on using the Range Test application can be found in [this article.](https://www.silabs.com/community/projects.entry.html/2016/03/21/setting_up_rangetes-b9gm) The procedure assumes that you have downloaded the Flex SDK, and have connected the two boards required for this example, as described in the [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/).

1. Click the “Example Projects” tab to see the projects available for the selected target hardware.
2. Scroll down or use the example filter to locate the “Flex (RAIL) – Range Test” project, then click **CREATE**.  
   ![Build a Range Test Example Application 1](/efr32-series-1-long-range-configuration/0.1/images/sld798-image9.png)
3. Enter the name of the project you want to create, or just leave it as the default, “range_test”..
4. Click **FINISH** to create the new project.  
   ![Build a Range Test Example Application 2](/efr32-series-1-long-range-configuration/0.1/images/sld798-image10.png)
5. Once the project is created, SSv5 opens the Simplicity IDE perspective, and the radio configuration GUI appears. From the Project Explorer view you can see the project files that have been generated.  
   ![Build a Range Test Example Application 3](/efr32-series-1-long-range-configuration/0.1/images/sld798-image11.png)  
   If you close this tab, the Radio Configurator can be accessed again at any time via the Software Components tab. Click the Advanced Configurators item, then Radio Configurator (alternatively, you can simply search for configurator using the search input at the top right of the .slcp frame). Once this Radio Configurator gateway element has been located, simply click **OPEN** to its right and proceed to the next step.  
   ![Build a Range Test Example Application 4](/efr32-series-1-long-range-configuration/0.1/images/sld798-image12.png)  
   If you have a radio board with a TCXO on it, SSv5 automatically preconfigures your project to support it and adds the code segments enabling the TCXO to the application. For reference, the configuration can be manually overridden via the Board Control component.  
   ![Build a Range Test Example Application 5](/efr32-series-1-long-range-configuration/0.1/images/sld798-image13.png)
6. Before configuring a Long Range PHY, you must adjust the selected radio profile for the project. On the Navigation Panel, click **Protocol Configuration**. You should see the **General Settings** and **Channel Overview** cards open in the editor window on the right.
7. On the **General Settings** card, click the **Select radio profile** drop-down field, and select **Long Range Profile.**  
   ![Build a Range Test Example Application 6](/efr32-series-1-long-range-configuration/0.1/images/sld798-image14.png)
8. On the Select radio PHY field, choose one of the predefined long range configurations, keeping the following guidance in mind:  
   - For 434-490 MHz boards, select a 434 MHz config.  
   - For 868-915 MHz boards, select a 915 MHz config.  
   - Note that Silicon Labs typical radio boards have a +/- 10ppm crystal as a reference. Refer to the "PHY Configuration Options on the Long Range Profile" table in [Development of the EFR32 Long Range PHYs](02-development-of-the-efr32-long-range-phys) to verify support for your preferred PHY using two (2) +/- 10ppm radio boards (+/- 20ppm combined). If your PHY of choice requires tighter tolerance, use the TCXO-equipped radio boards listed in the "Radio Boards with TCXO" table in [Radio Boards Supporting Long Range PHY Evaluation](02-development-of-the-efr32-long-range-phys#radio-boards-supporting-long-range-phy-evaluation).  
   ![Build a Range Test Example Application 7](/efr32-series-1-long-range-configuration/0.1/images/sld798-image15.png)
9. Enable the **Customized** switch, to allow fine tuning of the selected PHY config.
10. On the **Operational Frequency** card, set the **Base Channel Frequency** according to your planned operating band.
11. On the **Other settings** card, you have the option to override the data rate selection and/or to enable FEC.  
    (Note: On an EFR32, enabling FEC doubles the number of transmitted symbols, but does not automatically adjust the data rate. To retain the original (before enabling FEC) effective throughput with FEC, you must manually select a doubled data rate.)  
    ![Build a Range Test Example Application 8](/efr32-series-1-long-range-configuration/0.1/images/sld798-image16.png)
12. Build the project by clicking the hammer toolbar button.
13. Once built, flash the generated hex file to the target by right-clicking the <_project name_>.hex file in the “GNU ARM v7.2.1 – Debug” folder, and selecting **Flash to Device…**  
    ![Build a Range Test Example Application 9](/efr32-series-1-long-range-configuration/0.1/images/sld798-image17.png)
14. The Flash Programmer will open. Click **Program** to download the code to the target.  
    ![Build a Range Test Example Application 10](/efr32-series-1-long-range-configuration/0.1/images/sld798-image18.png)
15. Now flash the same .hex file to your second radio board. Select the other WSTK mainboard as the target device, and click **Program**.  
    ![Build a Range Test Example Application 11](/efr32-series-1-long-range-configuration/0.1/images/sld798-image19.png)

#### Measured Performance of the Long Range PHYs

##### Conducted Testing

The following table presents the following measurement results collected on real silicon with the PHYs available in the LR Profile:

- Receiver sensitivity corresponding to 1% packet error rate (PER)
- Overall required link (Rx+Tx) XO accuracy requirement calculated from frequency offset tolerances

|Frequency Band[MHz]|Data Rate[kbps]|Measured Sensitivity[dBm]|(TX + RX) XO Accuracy[ppm +/-]|
|---|---|---|---|
|434/490|1.2|-128|2.5|
|434/490|2.4|-124.5|5|
|434/490|4.8|-122.5|10|
|434/490|9.6|-120.5|20|
|434/490|19.2|-117|40|
|868/915|1.2|-128|1.25|
|868/915|4.8|-120.5|5|
|868/915|9.6|-118|10|
|868/915|19.2|-115|20|
|868/915|38.4|-112|40|
|868/915|80|-107.5|80|

Full characterization is ongoing but based on the available results, CW blocking at 2 MHz / 10 MHz - with wanted signal at +3 dB above sensitivity - is expected to be -51 / -36 dBm, respectively, for the high bands and -53 / -37 dBm for the low bands.

Packet error rate waterfall and frequency offset tolerance curves are provided in the following two figures for the 4.8 and 19.2 kbps PHYs in the 434 and 915 MHz bands.

![LR PHY Packet Error Rate (PER) Waterfall Curves](/efr32-series-1-long-range-configuration/0.1/images/sld798-image20.png)

![LR PHY Frequency Offset Tolerance Measurement Results](/efr32-series-1-long-range-configuration/0.1/images/sld798-image21.png)

In the figure above, signal is 3 dB above sensitivity level. TCXO – generator residual frequency offset was not compensated here.

### EFR32 Series 2 Long Range Configuration Reference

#### EFR32 Series 2 Long Range Configuration Reference

**NOTE: This section replaces _UG460.2: EFR32 Series 2 Long Range Configuration Reference_. Further updates to this user guide will be provided here.**

To help customers achieve the crucial design element of maximum effective range, Silicon Labs has a Long Range radio profile for the EFR32 Series 2 family of Wireless MCU devices, fully compatible with the existing solution on Series 1. From the current lineup, only SubGHz capable ones are supported, namely FG23/FG25/FG28. This guide introduces the profile, describes its development, and examines underlying details that enable it to realize extended range. It also includes an exercise to build a Range Test example using Simplicity Studio 5 and to explore the Long Range profile, so that you can quickly begin implementation in your next project.

This guide is designed for developers who would like to test long range performance on EFR32 Series 2 devices using Simplicity Studio 5 and Silicon Labs development hardware. It provides instructions to get started using the example applications provided with the Gecko SDK Suite (GSDK) v4.

##### Keys Points

- Learn about DSSS
- Learn about the Long Range Profile
- Learn about the Radio Configurator
- Create a Range Test application with a long range PHY
- Overview measured performance metrics

#### Introduction

One of the most important performance metrics for an IoT application is maximum usable range. Practically speaking, this refers to the maximum distance at which messages can be received without a loss of information. The achievable range is impacted by many different factors:

- Hardware influences, including:  
  - Antenna physical parameters (size, shape, directivity, gain)  
  - Battery physical parameters (size, capacity, load current, and so on)
- Propagation attributes of the radio signal (carrier frequency, humidity, obstacles, and so on)
- Transmit power
- Receiver sensitivity

To maximize usable range, when developing the Long Range (LR) profile Silicon Labs targeted the last item above, receiver sensitivity, which is affected by multiple input parameters:

- Frame length: The amount of data to be transported
- Data rate: The timeframe available to transport the data
- Baud rate offset tolerance: How much the data rate can change during reception
- Frequency offset tolerance: How severely the carrier frequency can vary during the reception
- Selectivity and blocking: Robustness against interferer signals

Though many paths can be taken to improve RX sensitivity, Silicon Labs avoided hardware changes and instead focused on radio configuration modifications. This reliance on PHY development insulated the Long Range profile from additional external hardware dependencies, making the LR PHY benefits available to a broader selection of applications.

The construction of these PHYs is detailed in [Using the Long Range Profile in Simplicity Studio 5](03-using-the-long-range-profile-in-simplicity-studio-5) provides instructions on evaluating the Long Range Profile using new Silicon Labs development tools and hardware. [Measured Performance of the Long Range PHYs](04-measured-performance-of-the-long-range-phys-on-fg23) reviews real-world measured performance with the LR PHYs.

#### Development of the EFR32 Long Range PHYs

The fundamental approach to extend usable range is to decrease receiver bandwidth, while keeping key signal parameters for the demodulator, such as modulation index for FSK, intact. A few rules of thumb help to visualize what is possible by this effort:

- Reducing bandwidth by half improves sensitivity by 3 dB
- Reducing bandwidth by 90% (to 1/10th of the original) boosts sensitivity by 10 dB

A straightforward compromise to achieve bandwidth reduction is to decrease the data rate. By cutting bandwidth in favor of sensitivity, one has to also contend with the resulting degradation in frequency offset tolerance. Therefore, such narrow-band PHYs require very accurate and stable clock references (for example, a 0.5 ppm TCXO), and those elements are more costly. In terms of RF immunity, the effect of going narrow band is mixed, with some improvement in selectivity and blocking offset by extended packet time and exposure to interferers due to the reduced data rate.

Importantly, all of these drawbacks can be mitigated by using Direct Sequence Spectral Spreading (DSSS). This technique, which is available for all major modulation formats on the EFR32, is explored in the following section.

##### DSSS: Theory of Operation

DSSS is a technique to increase the bandwidth of a transmitted signal, and thereby decrease its power spectral density. It is beneficial for the receiver side as well, as the robustness (immunity against interferer signals) significantly improves. This section reviews the DSSS implementation on EFR32 Series 2 devices.

###### TX Side

![Transmission of 802.15.4 Signals Using DSSS](/efr32-series-2-long-range-configuration/0.1/images/sld799-image1.png)

The above figure shows how a DSSS-based signal is constructed. As a practical demonstration vehicle, this example uses the 802.15.4 Zigbee packet format.

The baseband input signal is a narrow band, low data rate signal stream (its spectrum plot represented by the green cone). This bitstream is fed into a DSSS encoder, which replaces every 4 bits of the bitstream with a 32-bit symbol, often referred to as 32 “chips”.

Transmitting 1 symbol takes the same amount of time as transmitting 4 bits of the original data stream. This means that the “chip rate” is 8x higher than the original data rate, a multiplier often referred to as the Spreading Factor.

The blue rectangle (spectrum plot of baseband input signal after DSSS encoding) demonstrates that the original narrow band signal has become much wider (though not quite 8x), with less power density. The resulting data stream with the chip rate is then fed into the modulator and radiated over the air. Therefore, by increasing the link's in-air baud rate, the same data can be transmitted with the same net data rate, over the same period of time, but using a much wider band and lower power spectral density.

###### RX Side

![Reception of 802.15.4 Signals Using DSSS](/efr32-series-2-long-range-configuration/0.1/images/sld799-image2.png)

The above figure shows reception of the DSSS-encoded transmission detailed in the previous section. The demodulator retrieves the data stream from the OQPSK signal. The bits are changing with the chip rate, and the stream may contain errors due to the presence of noise and interferers in the air.

The plot at the top left corner of the above figure demonstrates the spectral conditions while receiving a DSSS packet. The red pyramid indicates the presence of a strong narrowband interferer, while the yellow trapezium represents the wideband noise.

This corrupted chip stream is fed into the DSSS Decoder, which replaces every 32-chip long symbol with a 4-bit pattern in restoring the original data stream. Up to a given error rate in the chip stream, the decoder can still identify the correct 32-chip symbols due to the 8x redundancy presented by the scaling factor.

The spectrum plot at the top right corner of the figure shows that the original green cone has been restored by this de-spreading procedure, while the red cone has been “smeared” with the noise. As a result, SNR is increased, which compensates for the increased noise power experienced by the demodulator due to the high in-air bandwidth.

##### DSSS: Practical Impacts

As a result of using DSSS, an application is subject to the following considerations:

- Co-channel and adjacent channel selectivity improve by a factor of the coding gain (3 to 8 dB, depending on spreading factor).
- A less accurate (cheaper) crystal can be used for the clock reference.
- Higher TX power can be used in cases where the regulatory limit is defined as maximum allowed power spectral density.
- DSSS alone does not technically improve RX sensitivity to in-air signals:  
  - Receiving a 1 kbps data stream exhibits the same RX sensitivity whether or not the signal content is DSSS-encoded.  
  - DSSS increases the symbol rate and bandwidth of the signal physically present in the air, which actually degrades reception at the RX side, but this consequence is compensated by the DSSS **processing gain** in the receiver.

##### Scaling Down the 802.15.4 O-QPSK PHY

To leverage the benefits of DSSS and develop Long Range options for EFR32 Series 2 devices, Silicon Labs began with the highly optimized 2.4 GHz 802.15.4 Zigbee OQPSK PHY and derived a series of radio configurations to serve a variety of sensitivity and tolerance requirements. Essentially, the data rate (and therefore the occupied bandwidth) has been scaled down, while retaining the same Zigbee coding scheme: OQPSK, DSSS SF=8, and 32-bit symbol length with a 4-bit symbol map. The resulting PHY configurations are currently available for FG23 / FG25 / FG28 variants of the Series 2 family.

The following table shows one group of PHYs optimized for a lower frequency band, and another group optimized at a higher frequency band. Notably, the stated performance is maintained when setting the carrier frequency to anywhere within each band.

The table indicates the required XO accuracy for the TX and RX side _combined_, an offset budget of a given LR link. This presents a cost savings opportunity on nodes manufactured in large quantities vs low volume base stations, where you can asymmetrically distribute the XO accuracy budget to reduce the cost of high-volume elements. Most commonly in practice, the value in the table is _split_ between TX and RX devices.

> **Note**: The last item, 80 kbps for 915MHz, can be used to pass FCC 15.247 requirements without the need for frequency hopping, as the occupied bandwidth (- 6 dB) of the signal is >= 500 kHz.

|Frequency Band[MHz]|Data Rate[kbps]|(TX + RX) XO Accuracy[ppm +/-]|
|---|---|---|
|434/490|1.2|2.5|
|434/490|2.4|5|
|434/490|4.8|10|
|434/490|9.6|20|
|434/490|19.2|40|
|868/915|2.4|2.5|
|868/915|4.8|5|
|868/915|9.6|10|
|868/915|19.2|20|
|868/915|38.4|40|
|868/915|80|80|

##### Radio Boards Supporting Long Range PHY Evaluation

Many configurations within the Long Range Profile can be successfully demonstrated on any radio board with a supported EFR32 Series 2 SoC and suitable sub-GHz band support.

- Please note that Silicon Labs typical radio boards have a +/- 10ppm crystal as a reference.
- Refer to PHY config XO tolerances in the table above to verify support for your preferred PHY using two (2) +/- 10ppm radio boards (+/- 20ppm combined).
- If your PHY of choice requires tighter tolerance applying a TCXO is recommended.

For reference, the following table specifies development boards Silicon Labs used for testing, but as said, any sub-GHz capable board with FG23/FG25/FG28 on it can be used. For the test, Silicon Labs used 0.5 ppm TCXO.

|Ordering Part Number|Board ID|Board Configuration|
|---|---|---|
|xG23-RB4204D|BRD4204D|EFR32ZG23 868-915 MHz 14 dBm Radio Board|
|FG23-RB4265A|BRD4265A|EFR32FG23 433 MHz 10 dBm Radio Board|

#### Using the Long Range Profile in Simplicity Studio 5

##### Long Range Profile in the Radio Configurator

Simplicity Studio 5 (SSv5) makes it easy to access Long Range PHY configurations by selecting the Long Range profile in the Radio Configurator interface. If you need a refresher, see the [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/) and [Proprietary Radio Configurator Guide](/rail/{build-docspace-version}/proprietary-radio-configurator-guide) for more information on building an example wireless application with the Radio Configurator.

![Long Range Profile in the Radio Configurator](/efr32-series-2-long-range-configuration/0.1/images/sld799-image3.png)

Click the **Select radio profile** dropdown and select **Long Range Profile**. Note that PHYs in this profile have reduced configuration options (carrier frequency, and FEC enable), described here:

- Carrier frequency can be set to anywhere within each band – baseband performance will be sustained at all frequencies within a given band. However, be aware that external components (antenna matching for example) can exhibit a frequency dependence.
- FEC (Forward Error Correction) can be enabled for any of the PHY configurations:  
  - Current FEC options in EFR32 Series 2 are convolutional codes with a rate of ½, doubling the number of transmitted symbols after the sync word. Enabling FEC does not automatically adjust the data rate. To maintain the original effective throughput, manually select a data rate that is twice the original rate.  
  - FEC does not increase sensitivity, but it can protect against bit errors over the payload due to interferer signals.

The next section provides a procedure to construct a complete example application with which to evaluate PHYs in the Long Range Profile using two EFR32 radio boards.

##### Build a Range Test Example Application

This section describes the steps to build a Range Test application, and is based on [UG147: Range Test Demo User's Guide](https://www.silabs.com/documents/public/user-guides/ug147-flex-gecko-range-test-demo.pdf). Additional guidance on using the Range Test application can be found in [this article](https://www.silabs.com/community/projects.entry.html/2016/03/21/setting_up_rangetes-b9gm). The procedure assumes that you have downloaded the Flex SDK, and have connected the two boards required for this example, as described in the [Simplicity Studio 5 User’s Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-overview/).

1. Click the **Example Projects & Demos** tab to see the projects available for the selected target hardware.
2. Scroll down or use the example filter to locate the “RAIL – SoC Range Test” project, and then click **CREATE**.  
   ![Build a Range Test Example Application 1](/efr32-series-2-long-range-configuration/0.1/images/sld799-image4.png)
3. Enter the name of the project you want to create, or just leave it as the default, “range_test”.
4. Click **FINISH** to create the new project.  
   ![Build a Range Test Example Application 2](/efr32-series-2-long-range-configuration/0.1/images/sld799-image5.png)
5. Once the project is created, SSv5 opens the Simplicity IDE perspective, and the radio configuration GUI appears. From the Project Explorer view, you can see the project files that have been generated.  
   ![Build a Range Test Example Application 3](/efr32-series-2-long-range-configuration/0.1/images/sld799-image6.png)  
   If you close this tab, the Radio Configurator can be accessed again at any time via the Software Components tab. Click the Advanced Configurators item, then Radio Configurator (alternatively, you can simply search for configurator using the search input at the top right of the .slcp frame). Once this Radio Configurator gateway element has been located, simply click **OPEN** to its right and proceed to the next step.  
   ![Build a Range Test Example Application 4](/efr32-series-2-long-range-configuration/0.1/images/sld799-image7.png)  
   If you have a radio board with a TCXO on it, change the HFXO software component’s **Mode** to **External sine wave**.  
   ![Build a Range Test Example Application 5](/efr32-series-2-long-range-configuration/0.1/images/sld799-image8.png)
6. Before configuring a Long Range PHY, you must adjust the selected radio profile for the project. On the Navigation Panel, click **Protocol Configuration**. You should see the **General Settings** and **Channel Overview** cards open in the editor window on the right.
7. On the **General Settings** card, click the **Select radio profile** drop-down field, and select **Long Range Profile.**  
   ![Build a Range Test Application 6](/efr32-series-2-long-range-configuration/0.1/images/sld799-image9.png)
8. On the Select radio PHY field, choose one of the predefined long range configurations, keeping the following guidance in mind:  
   - For 434-490 MHz boards, select a 490 MHz config.  
   - For 868-915 MHz boards, select a 915 MHz config.  
   ![Build a Range Test Application 7](/efr32-series-2-long-range-configuration/0.1/images/sld799-image10.png)
9. Enable the **Customized** switch to allow fine tuning of the selected PHY config.
10. On the **Operational Frequency** card, set the **Base Channel Frequency** according to your planned operating band.
11. On the **Crystal** card, set the XO frequency.
12. On the **Other settings** card, you have the option to override the data rate selection and/or to enable FEC.  
    > **Note**: On an EFR32, enabling FEC doubles the number of transmitted symbols after the sync word, but does not automatically adjust the data rate. To retain the original (before enabling FEC) effective throughput with FEC, you must manually select a doubled data rate.  
    ![Build a Range Test Application 8](/efr32-series-2-long-range-configuration/0.1/images/sld799-image11.png)
13. Build the project by clicking the hammer toolbar button.
14. Once built, flash the generated hex file to the target by right-clicking the <_project name_>.hex file in the “GNU ARM v7.2.1 – Debug” folder, and selecting **Flash to Device…**.  
    ![Build a Range Test Application 9](/efr32-series-2-long-range-configuration/0.1/images/sld799-image12.png)
15. The Flash Programmer will open. Click **Program** to download the code to the target.  
    ![Build a Range Test Application 10](/efr32-series-2-long-range-configuration/0.1/images/sld799-image13.png)
16. Now flash the same .hex file to your second radio board. Select the other WSTK mainboard as the target device, and click **Program**.

#### Measured Performance of the Long Range PHYs on FG23

##### Conducted Testing

The following table presents the following measurement results collected on real silicon with the PHYs available in the LR Profile:

- Receiver sensitivity corresponding to 1% packet error rate (PER) with 22 byte payload (CRC incl.)
- No FEC applied due to the short payload
- Similar or better sensitivity numbers can be expected on FG25 and FG28 for the current LR profile PHYs
- Overall required link (Rx + Tx) XO accuracy requirement calculated from frequency offset tolerance captures with wanted signal at 3 dB above sensitivity level
- 0.5 ppm, 39 MHz TCXO was used on our dev boards listed in [Radio Boards Supporting Long Range PHY Evaluation](02-development-of-the-efr32-long-range-phys#radio-boards-supporting-long-range-phy-evaluation) used during testing

|Frequency Band[MHz]|Data Rate[kbps]|Measured Sensitivity[dBm]|(TX + RX) XO Accuracy[ppm +/-]|
|---|---|---|---|
|434/490|1.2|-131.5|2.5|
|434/490|2.4|-129|5|
|434/490|4.8|-126|10|
|434/490|9.6|-123|20|
|434/490|19.2|-120|40|
|868/915|2.4|-128|2.5|
|868/915|4.8|-125|5|
|868/915|9.6|-122|10|
|868/915|19.2|-119.5|20|
|868/915|38.4|-116.5|40|
|868/915|80|-113.5|80|

The following tables present basic blocking performance metrics for the 4.8 kbps and the 80 kbps LR PHYs as reference, measured with CW tone as interferer with wanted signal at 3 dB above sensitivity levels. The accuracy of the results is <= +/- 1 dB.

**Table: CW blocking performance of 4.8 kbps LR PHY @ 915 MHz**

| |CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|
|---|---|---|---|---|---|---|---|---|
|PER [%]|1|-1|3|-3|10|-10|20|-20|
|<= 1|79 dB|80 dB|87 dB|87 dB|87 dB|86 dB|88 dB|88 dB|
|>= 95|85 dB|85 dB|92 dB|92 dB|92 dB|92 dB|94 dB|94 dB|

**Table: CW blocking performance of 80 kbps LR PHY @ 915 MHz**

| |CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|CW blocker offset [MHz]|
|---|---|---|---|---|---|---|---|---|
|PER [%]|1|-1|3|-3|10|-10|20|-20|
|<= 1|54 dB|65 dB|71 dB|73 dB|76 dB|76 dB|77 dB|77 dB|
|>= 95|58 dB|69 dB|74 dB|77 dB|82 dB|82 dB|84 dB|84 dB|

> **Note**: the 80 kbps PHY, as all others, has a spreading factor of 8, resulting in a 640 kcps with an Rx BW of 800 kHz. The IF frequency is 450 kHz, injection side is high-side, therefore the image frequency is located at 900 kHz above the carrier. This means that we have a ~800 kHz wide region around 900 kHz above the carrier where the image rejection performance is the dominant factor in blocking performance This explains the asymmetric results at +1 / -1 MHz.

As a reference, packet error rate-based waterfall and frequency offset tolerance curves are provided in the following two figures for the 4.8 and 19.2 kbps PHYs in the 490 and 915 MHz bands.

![LR PHY Packet Error Rate (PER) Waterfall Curves](/efr32-series-2-long-range-configuration/0.1/images/sld799-image14.png)

![LR PHY Frequency Offset Tolerance Measurement Results at Sensitivity Level](/efr32-series-2-long-range-configuration/0.1/images/sld799-image15.png)

> **Note**: In general, the expected tolerable frequency offset across LR PHYs, at 3 dB above sensitivity levels is +/- symbol rate in Hz. For example, the 4.8 kbps PHY should tolerate +/- 4.8 kHz frequency offset with wanted signal at 3 dB above sensitivity level. The required XO accuracy reflects this fact.

### EFR32 RF Evaluation Guide

#### EFR32 RF Evaluation Guide

**This section replaces _AN972: EFR32 RF Evaluation Guide_. Further updates to this application note will be provided here.**

This evaluation guide provides an easy way to evaluate the performance of the Wireless Gecko EFR32 devices using the Silicon Labs Radio Abstraction Interface Layer (RAIL). RAILtest is a standalone test application, which is used for testing radio functionality, as well as peripherals, deep sleep states, and so on. Basic transmit and receive commands allow customers to fully evaluate the receiving and transmitting performance and to test RF functionality of development kit hardware or customer hardware. Note that some of the lab tests require RF test equipment, such as a spectrum analyzer and RF signal generator. It is a useful test application to be used for basic testing of your custom EFR32 design and characterization. The test can be used in the laboratory to measure the basic RF parameters of the radio (output power, sensitivity, and so on).

This evaluation guide describes how to install the RAILtest application to EFR32 devices and demonstrates how to make frequently-required, conducted transmission and reception tests using the RAILtest application.

> **Note**: Measuring over-the-air range performance of EFR32 devices, please refer to the Range Test application,  available  in  Simplicity  Studio.  Refer  to _UG147: Range Test Demo User's Guide_ for its usage.

The following measurements will be covered on the transmission side:

- Tx power
- Phase Noise
- Power Spectral Density Mask
- Spurious Emission
- Transient power

The following measurements will be covered on the reception side:

- Rx sensitivity
- Selectivity
- Blocking
- Intermodulation
- Maximum input power

Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

#### Running Simplicity Studio

Simplicity Studio 5 and Flex SDK v 3.x introduced a number of new features and enhancements. This chapter describes how to use Simplicity Studio 5 and Flex SDK v3.x as well as the older Simplicity Studio 4 and Flex SDK 2.x for testing.

Before beginning, you should have installed Simplicity Studio and the Flex SDK according to the instructions in the relevant quick-start guide: _QSG138: Proprietary Flex SDK v2.x Quick Start Guide_ or [Proprietary Flex SDK v3.x Quick Start Guide](/rail/3.1.0/proprietary-flex-sdk-v3x-quick-start-guide).

Before running RAILtest in either version, the test target must be configured according to the following instructions:

To start, set up an EFR32 development kit radio board with a mainboard for Wireless Starter Kits (WSTK). Once you have installed all the required software you can connect your EFR32 development kit hardware to your PC using a mini-USB cable. Make sure the 3-way power switch in the bottom left is set to AEM.

If you want to connect to your WSTK over Ethernet, plug in an Ethernet cable as well at this time. The IP address will be printed to the LCD screen during startup of the WSTK but may be lost when the app starts. To see this again, reboot the WSTK and press the reset button for several seconds to prevent the EFR32 from loading its application.

##### Select RAILtest Application

###### Start Project In Simplicity Studio 6

1. When Simplicity Studio 6 opens, select **RAIL** in the sliding menu under **Start A New Project**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-1.png)
2. Scroll down to find **RAIL - SoC RAILtest** and click **CREATE**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-2.png)
3. Choose a target device (Connected or Virtual) and click **Next**. If you have more than one device connected, select based on the serial number. After connecting the WSTK to the PC, the Start Screen on the LCD shows the device's serial number.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-3.png)
4. Rename the project and/or change the location or Target IDE, if desired. Click **Finish**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-4.png)

###### Start Project In Simplicity Studio 5

1. When Simplicity Studio 5 opens, select the target in the Debug Adapters view. If you have more than one device connected, select based on the serial number. After connecting the WSTK to the PC, the Start Screen on the LCD shows the device's serial number.
2. Click the **OVERVIEW** tab if it is not already selected.
3. Click **Create New Project**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image2.png)
4. Select the **Flex (RAIL) - RAILtest** application, and click **Next**. You can use keywords or filters to find the application.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image3.png)
5. Rename the project and/or change the location, if desired. Click **Finish**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image4.png)

###### Start Project In Simplicity Studio 4

1. When Simplicity Studio 4 opens, select the target in the Debug Adapters view. If you have more than one device connected, select based on the serial number. After connecting the WSTK to the PC, the Start Screen on the LCD shows the device's serial number.
2. In the Launcher (default) perspective, if it is not already selected, click the **Getting Started** tab.
3. Click **New Project**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image5.png)
4. Select **Silicon Labs Flex SDK** as the application type.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image6.png)
5. Click **Next**.
6. Select the Flex SDK version you would like to use (preferably the latest one).  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image7.png)
7. Click **Next**.
8. Select the **RAIL: RAILTEST** application.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image8.png)
9. Click **Next**.
10. In the Project Configuration dialog, specify a location for your application.  
    ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image9.png)  
    **Note**: the location must be on the same Windows partition as the stack.
11. Specify a name for your application.
12. Click **Next**.
13. The Project Setup dialog shows the various build configurations available. Check one of the initial build configuration to include in the project. (You can edit these later through the 'Manage Configurations' command.)  
    ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image10.png)
14. Click **Finish**.

> **Note**: You must have a Toolchain and Build target selected and configured for the **Finish** control to enable. If you do not see **Finish** enabled, check your Toolchains and Build targets by clicking the links at the bottom of the dialog.

##### Configure and Generate the Application

###### Configure and Generate In Simplicity Studio 6

After creating the project, the Simplicity IDE perspective opens. The project explorer view is on the left side, opened by clicking on **PROJECTS**. It contains all the files for the opened projects. Connected devices can also be managed on the left side under **DEVICES**. By default the project's _<project_name>.slcp_ and _radio_settings.radioconf_ files are already opened. The project is defined in the .slcp file.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-5.png)

If the Radio Configurator is not open, on the project .slcp tab click the **CONFIGURATION TOOLS** tab, and click **Open** on the Radio Configurator card.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-6.png)

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-7.png)

Projects are configured by installing and uninstalling components, and configuring installed components. The **SOFTWARE COMPONENTS** tab displays categories of components on the left, and details about the selected component on the right. Several filters as well as a keyword search are available to help you explore the various component categories.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-8.png)

Simplicity Studio 6 disables buttons, LEDs and the LCD display in the RAILtest application by default. These features help the user to interact with RAILtest application and are enabled by default in older versions of Simplicity Studio. To enable these features, you may install the following software components: Button 0 (as btn0), Button 1 (as btn1), LED 0 (as led0), LED 1 (as led1) and RAILtest Graphics.

> **Note**: Feature availability may differ on different boards.

These components are in the following component categories:

- Platform > Driver > Simple Button > btn0 and btn1
- Platform > Driver > Simple LED > led0 and led1
- Platform > Radio > RAILtest, Graphics

> **Note**: These may install more than one dependency, depending on their function.

For example, to install a Simple Button:

1. On the **SOFTWARE COMPONENTS** tab, enter _button_ in the search field in the top right corner.
2. Select the Simple Button component and click **Install**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-9.png)
3. Name the component instance, then click **Done**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-10.png)

Project files autogenerate as you add, remove, or configure components.

###### Configure and Generate In Simplicity Studio 5

After creating the project, the Simplicity IDE perspective opens. You can switch between Simplicity IDE and Launcher perspectives using the controls in the top right corner. The project explorer view is on the top left. It contains all the files for the opened projects. By default the project's _<project_name>.slcp_ and _radio_settings.radioconf_ files are already opened. The project is defined in the .slcp file. These two files replace Simplicity Studio 4's .isc extension file.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image11.png)

If the Radio Configurator is not open, on the project .slcp tab click the **CONFIGURATION TOOLS** tab, and click **Open** on the Radio Configurator card. See [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide) for more information.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image12.png)

Projects are configured by installing and uninstalling components, and configuring installed components. The **SOFTWARE COMPONENTS** tab displays categories of components on the left, and details about the selected component on the right. Several filters as well as a keyword search are available to help you explore the various component categories.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image13.png)

Simplicity Studio 5 disables buttons, LEDs and the LCD display in the RAILtest application by default. These features help the user to interact with RAILtest application and are enabled by default in older versions of Simplicity Studio. To enable these features, you may install the following software components: Button 0 (as btn0), Button 1 (as btn1), LED 0 (as led0), LED 1 (as led1) and RAILtest Graphics.

> **Note**: Feature availability may differ on different boards.

These components are in the following component categories:

- Platform > Driver > Simple Button > btn0 and btn1
- Platform > Driver > Simple LED > led0 and led1
- Platform > Radio > RAILtest, Graphics

> **Note**: These may install more than one dependency, depending on their function.

For example, to install a Simple Button:

1. On the **SOFTWARE COMPONENTS** tab, enter _button_ in the search field in the top right corner.
2. Select the Simple Button component and click **Install**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image14.png)
3. Name the component instance, then click **Done**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image15.png)

Project files autogenerate as you add, remove, or configure components.

###### Configure and Generate in Simplicity Studio 4

When you finish creating your sample application, an Application Builder General tab opens.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image16.png)

1. In the General tab, if the architecture parameters shown for MCU and Radio and Board Type are not correct for your target device, click **Edit Architecture** to change the parameters. In general, the initial configuration settings for sample applications should be correct.
2. The RAIL application framework allows you to modify the PHY configuration for the application. Select the **Radio Configuration** tab to modify the PHY configuration for your application. For more information on how to set the modem parameters, please refer to _AN971: EFR32 Radio Configurator User's Guide_.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image17.png)
3. Click **Generate** in the upper right corner of the Application Builder window. Note that whenever the Build Configuration has been changed, you have to click **Generate** again.
4. Select if you want to overwrite any of the existing files. Click **OK**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image18.png)
5. The next dialog shows the generated files. Click **OK** to continue.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image19.png)

##### Build the Application

In Simplicity Studio 6, the Visual Studio Extension is used to build applications. On the project folder, click **Build** (the hammer icon)

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-vsc1.png)

To flash the built program to the target device, click **Flash** and chosse the target board and binary file.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-vsc2.png)

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-vsc3.png)

In Simplicity Studio 5, either right-click the .slcp file in the Project Explorer view and click **Build**, or with the project open, click **Build** (hammer icon) in the toolbar.

In Simplicity Studio 4, double-click on app_main.c in the Project Explorer view to open it in the editor. Click **Build** (hammer icon) in the toolbar.

Wait until the build process is finished.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image20.png)

Verify that the project has built without any error in the Console view at the bottom of the Simplicity IDE or in Visual Studio Code.

##### Load the Binary onto your Device/Flash Programming

If a full erase is not necessary, click Debug (bug icon) in the menu bar. This flashes the project into the board if it was successfully built. This will only update the program memory.

Once the project is flashed, the board can be started by clicking Resume in the menu bar.

Alternatively:

1. In the Debug Adapters perspective, select the target device.
2. With  the  device  selected, open the Flash Programmer through the Launcher perspective's Compatible Tools tab or by clicking Flash Programmer (chip icon) in the Simplicity IDE menu bar.
3. The Flash Programmer opens. Select the file type.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image21.png)
4. Navigate to the .bin or .hex image you wish to upload.
5. Click **Erase** to make sure that any previous bootloader or other non-volatile data is erased before your new image is uploaded.
6. Click **Program** to program the flash.
7. You will be notified once the upload is complete.

After starting the demo, the screen shows three parameters: Rx Count, Tx Count, and Channel Number.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image22.png)

##### Serial Port Communication

The RAILtest application should be accessed using a standard serial port terminal. The default version uses the WSTK's built-in serial port to provide access to this, so do not attempt to connect directly to the UART GPIOs.

The serial port can be accessed using Ethernet or USB. Both provide the same level of functionality so it is completely up to you what to use.

- For USB, plug the device into your computer and find the Virtual COM port that is created. It will show up as a "JLink CDC UART Port" in the Device Manager. The Virtual COM port should work with any UART settings, but the physical UART is configured by default for 115200 8-N-1 if you want to match that. For UART-based communication, you can use any terminal emulator program that supports serial port communication, like TeraTerm or PuTTY.
- Simplicity Studio contains a built-in terminal as well. To run it, right-click on the device on the Debug Adapters view and click **Launch Console**. The RAILtest API should be accessible from the Serial 1 port.
- For Ethernet, use a telnet client to connect to port 4901 on the WSTK. You can use a program like PuTTY for this or the standard command line telnet client.

##### Console View

Once the RAILtest application is loaded onto the EFR32 you can interact with the RAILtest application using the Command Line Interface.

If you use Simplicity Studio 6, you can connect via console using Visual Studio Code. In the Extension, under **DEVICES**, you can choose your connected device. In **Terminal**, you can find **vcom** and there you can communicate with the board.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-ssv6-vsc4.png)

In Simplicity Studio 4 and 5, the Console View will give you a CLI interface in Simplicity Studio's Network Analyzer Perspective so that you can interact directly with the RAILtest application.

1. Right-click the device in the Debug Adapters view.
2. Select **Connect** (if you are not already connected) and then **Launch Console**. To get a prompt on the Console Serial 1 tab, press **Enter**.  
   ![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image23.png)

#### Basics of the RAILtest Application

The RAILtest application provides a simple tool for testing the radio and the functionality of the RAIL library. For any advanced usage you must write your own software against the RAIL library and create a custom radio configuration. The RAILtest application is further described in [RAILtest User's Guide](/rail/3.1.0/railtest-users-guide).

> **Note**: If you are going to use the WSTK as a mobile device to run the RAILtest application, it is recommended that you connect an external AA battery pack or a USB power bank to the WSTK board. The coin cell battery will not have enough power to do long-term testing using sample applications like RAILtest.

##### CLI

The most powerful way to interact with the sample application is using the provided command line interface. The setup instructions in earlier sections describes how to connect to this interface.

##### Command Input

The syntax for this interface is the standard command [arg0, arg1, ...] syntax, where the number and type of arguments depend on the specific command. Numeric values can be prefixed with 0x to indicate hexadecimal values. Note that the maximum number of arguments to any command is 9 and the maximum length of a command line is 255 characters.

Use the `help` command to see a full listing of available command options.

##### Command Output

All responses to commands are formatted in a human readable yet parsable format. There are two variations of this format: single- and multi-line. Both of these follow these rules.

- Start and end with curly braces { }.
- List the command name, enclosed in parentheses ( ).
- Contain any number of tag/value pairs enclosed in curly braces { }.
- Carriage returns and line feeds are treated as whitespace by any parser.

###### Single Response

Used when there is only a single response to a command.

- There is a single start/end curly brace wrapper.
- Tag/value pairs are wrapped in a single set of curly braces, separated by a colon {tag:value}.

Example:

```sh
> getchannel
{{(getchannel)}{channel:4}}
```

###### Multi Response

Used when a command may have multiple responses, for example when reading a block of memory or receiving multiple packets.

- Response starts with a header, delimited by a hash # at the start of the line.
- Header includes the command name, followed by any tags individually wrapped with curly braces { }.
- Following the header, any number of responses can be provided.
- Data lines do not contain the command name or tags, only the values that correspond to the tags in the order described in the header.

Example:

```sh
> getmemw 0x20000000 4
#{{(getmemw)}{address}{value}}
{{0x20000000}{0x0000e530}}
{{0x20000004}{0x000051c6}
{{0x20000008}{0x0000c939}
{{0x2000000c}{0x0000e090}}
```

#### Transmission Test

##### Transmitted Signal Types

The device is capable to generate continuous unmodulated signal (CW mode, also referred as single tone or sinus wave signal), packets (packet mode) and a continuous pseudo random stream (PN9 mode). The following table helps to decide which transmission mode should be used for a corresponding measurement.

| |CW mode|PN9 mode|Packet mode|
|---|---|---|---|
|Tx Power|x|─|─|
|Power Spectral Density Mask|─|x|─|
|Phase Noise|x|─|─|
|Spurious Emission|x|─|─|
|Transient Power|─|─|x|

The following sections describe how to turn these modes on, and how to modify some corresponding parameters to customize the output signal.

##### Output a Continuous Unmodulated Tone

CW mode is used to test the output power of the test card and observe the unmodulated carrier spectrum. In this mode, only the frequency and the output power are configurable parameters. There are two modes for CW generation. One is designed to generate CW signal [tone] with the best possible quality. The other is specifically designed to measure phase noise of the device [phaseNoise]. For more information on phase noise measurement, see [Phase Noise Measurement](#phase-noise-measurement). The difference between these two modes of CW signal generation is the PLL bandwidth settings. In the [phaseNoise] CW mode, the PLL bandwidth is the same as the current radio settings. With this method the generated CW signal provides information on how the PLL behaves when transmitting packets during operation.

> **Note**: Before setting power and some other parameters, the device must be in idle receiver mode, by calling rx 0 .

Set Receiver to Idle:

```sh
rx 0 {{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:539309681}}
```

Enable CW Mode:

```sh
setTxStream 1 0    [enable] [streamMode] Enable(1 0) or Disable(0 0) a CW tone from the radio.
```

The command above also sets the PLL bandwidth to narrower than it's set on the actual radio configuration to produce better quality CW tone.

Enable CW Signal for Phase Noise Measurement:

```sh
setTxStream 1 3    [enable] Enable(1 3) or Disable(0 3) a tone from the radio with the same PLL bandwidth as the current PHY configuration.
```

Set Tx Power:

The `setPower` command can be used to change the output power; enter the desired power in deci dBm.

> **Note**: You can check the Tx power limitation with the `getPower` command. The radio state must be IDLE for Rx and Tx side. Call `rx 0` and `SetXxTone 0` first.

```sh
setPower       s    [power] Set the current transmit power in deci dBm
```

Set Channel:

A way to change the frequency is to change the channel. The specific channel configuration depends on the PHY configuration you have chosen for your test app. To switch between channels, use the `setChannel [num]` command. In addition, you can use button PB1 to cycle between channels. (The channel spacing value is used for relative frequency configuration to configure a frequency so many channel spacing away from the base channel frequency.)

To get the current radio channel, use this command:

```sh
getchannel    Get the current radio channel
```

To set another radio channel, use this command:

```sh
setchannel u    Set the current radio channel
```

Set Frequency:

To modify the frequency to a value not defined in the channel list, set the application into the FREQUENCY_OVERRIDE debug mode via debugMode, which tells the application to ignore the current channel selection. Once in the FREQUENCY_OVERRIDE debug mode, you can use the `freqOverride` command to switch to another center frequency.

> **Note**: The `freqOverride` command requires you to be in FREQUENCY_OVERRIDE debug mode.

> **Note**: The radio state must be IDLE in order for the channel to be changed or the frequency to be modified. Call `rx 0` first.

Example:

```sh
rx                0               [enable] Enable(1) or Disable(0) receive mode
setDebugMode      1               [mode] 1 = Frequency Override. 0 = Disable debug mode
freqOverride      2404000000      [freq] Change to freq specified in Hz. Requires debug mode to be enabled.
```

Set Different PHY Configuration:

To switch between PHYs in a multi PHY configuration, use the `setConfigIndex` command.

Example:

```sh
> setConfigIndex 0
{{(setConfigIndex)}{configIndex:0}{firstAvailableChannel:0}}
```

##### Output a Continuous Modulated PN9 Stream

In this mode, the modulation content is generated internally using a pseudo-random (PN9 sequence) bit generator. The primary purpose of this mode is to observe the modulated spectrum without having to provide data for the radio. This mode is usually used to test the power spectral density mask.

In this mode, only the frequency and the output power are configurable parameters. To change these parameters, refer to [Output a Continuous Unmodulated Tone](#output-a-continuous-unmodulated-tone).

Enable PN9 mode:

```c
setTxStream        Enable/Disable a PN9 stream from the radio
```

##### Output Packets

The application starts in packet mode with the receiver enabled. In this mode we receive and transmit packets using the radio's frame controller hardware.

To transmit a specified number of packets, use this command:

```sh
tx       w       [n] Transmit n packets. If n is 0 transmit infinitely
```

Or press button PB0. If you hold PB0 for a couple of seconds or run the `tx 0` command, you can toggle the continuous transmit mode.

In this mode, the frequency, the output power, delay in between each transmitted packet, the length, and the value of the bytes to send are configurable parameters. To change the frequency and the output power parameters, refer to [Output a Continuous Unmodulated Tone](#output-a-continuous-unmodulated-tone).

When transmitting multiple packets or infinite packets there is a configurable delay in between each transmit. By default this is 250 ms, but it can be set with the following command:

```sh
setTxDelay       w       [delay] Set the inter-packet delay in milliseconds for repeated Tx
```

Get the inter-packet delay in milliseconds for repeated Tx, use the getTxDelay command.

If the desired delay is lower than you can set with setTxDelay, all the peripherals must be disabled to improve performance.

```sh
setPeripheralEnable       u       [enable] Turn LEDs and LCD on/off
```

The application by default sends a fixed packet, but it is possible to override the values via `setTxPayload`. The command allows you to modify the values of the payload at specific offsets. For instance to modify the first 4 bytes sent in the packet to be 0x01 0x02 0x03 0x04, this is the command:

```sh
setTxPayload 0 0x01 0x02 0x03 0x04
```

> **Note**: To view the currently configured TX Packet information, use the following command:

```c
printTxPacket       Print the current Tx data and length
```

A byte in the payload holds the length of the packet for variable length schemes. The length byte in IEEE 802.15.4 is the first byte; this is what you can set using the `setTxPayload` command. The length byte also covers the CRC length of the packet, and the length parameter covers the length byte; this is what you can set using the `setTxLength` command.

All in all, here is an example to set 3-byte payload to 0x01 0x02 0x03, while using IEEE 802.15.4 configuration:

```sh
setTxLength 4
setTxPayload 0 0x05 0x01 0x02 0x03
```

A spectrum analyzer is used to view the over the air sent packets of the radio. It must be connected through a proper RF cable to the RF connector of the radio board.

![Analog FM Demodulation of the Sent Data](/efr32-rf-eval-guide/0.2/images/sld723-image24.png)

##### Tx Power Measurement

A common way to measure the transmitted power of a device is to transmit a CW signal, then measure the transmitted signal with a spectrum analyzer or an RF power meter device. The measurements should be conducted, and proper RF cabling is necessary.

A spectrum analyzer is used to measure the transmit performances of the radio and must be connected through a proper RF cable to the RF connector of the radio board. In this example the transmitted power is measured in the CW signals 5MHz frequency range and the CW signal is marked with a marker (Mkr 3). The transmitted power is displayed on the right upper corner, where the marker is placed.

![Unmodulated CW Signal Measured with Spectrum Analyzer](/efr32-rf-eval-guide/0.2/images/sld723-image25.png)

##### Power Spectral Density Mask Measurement

Power Spectral Density (PSD) gives feedback about the transmitted signal's spectrum usage. PSD is usually measured with a PN stream. However, Silicon Labs recommends measuring the device's PSD by enabling the PN9 stream. A spectrum analyzer is used to measure the power spectral density mask of the radio and must be connected through a proper RF cable to the RF connector of the radio board. RF cable loss should be compensated for accurate Tx power output level measurement. The proper reference level and span of the device is required as well.

![PN9 Modulated Signal (2GFSK, 1Mbps Data Rate, ± 500 kHz Deviation)](/efr32-rf-eval-guide/0.2/images/sld723-image26.png)

The figure above shows the demodulated signal when the radio board works in PN9 mode. The data rate is 1 Mbps; the deviation is 500 kHz, and the modulation type is 2GFSK.

##### Phase Noise Measurement

Phase noise (PN) is a frequency domain representation of a signal's jitter. Phase noise is usually measured when a reference signal's quality is specified. PN measurement gives a feedback on how the - ideally - stable reference signal or other CW signal's frequency changes in a short period of time. PN is usually represented as a frequency-amplitude graph or a notable point - from the graph - is presented in dBc/Hz.

![Phase Noise Measurement Example](/efr32-rf-eval-guide/0.2/images/sld723-image27.png)

Phase noise is measured with a spectrum analyzer, optimally one with a phase noise measurement feature. Proper connectors and cables are obligatory for this measurement. The PN graph usually contains only one side of the center frequency, as both sides are nearly identical. Frequency is usually represented logarithmically.

EFR32 devices' phase noise is usually measured, giving a feedback of the carrier's quality. If PN is measured on an EFR device, a CW signal is transmitted for measuring. PN not only effects the Tx performance but also the Rx side. The PN gives feedback on the oscillator quality, hence the transmit side and receiver side are affected as well. High PN on the transmitter side results in bad EVM and on the receiver side results in poor sensitivity, as PN is added to the noise level.

> **Note**: Use RAILtest's special CW mode for phase noise measurement described in [Output a Continuous Unmodulated Tone](#output-a-continuous-unmodulated-tone).

##### Spurious Emission Measurement

Spurious emissions are unwanted emissions at frequencies other than those of the transmitted channel. Spurious emission measurement is done by measuring the observed (transmitted) channel and its' neighbor while transmitting packets. A spectrum analyzer is used for measuring and at each frequency at which a spurious component is detected, the power level is measured and noted. The measured frequency bandwidth is typically2-10X as the occupied channel bandwidth. Some RF spectrum analyzers have a spurious emission measurements feature, to make performing these measurements easier. Spurious measurements are often taken while standard packets are transmitted, but some region's standard requires a different type of transmitted signal.

![3.5. Spurious Emission Occurs as Spikes in the Measured Spectrum](/efr32-rf-eval-guide/0.2/images/sld723-image28.png)

##### Transient Power

Transient power is power appearing in frequencies other than the occupied channel when the transmitter is turned on or off. Transient power is expressed in dBm and measured at specific offset frequencies from the carrier. Standards usually describe offset frequencies with a maximum tolerated power of transient power.

Transient power can be measured with a spectrum analyzer, used in zero span mode. Zero span mode is used to measure a specific frequency. By changing the resolution bandwidth parameter of the analyzer, the measured frequency region can be set. A higher resolution bandwidth enables acquiring a wider frequency region, and allowing more power to the analyzer.

The EFR32 device is used in packet mode and sent at least 5 to 10 packets. The spectrum analyzer must be set to measure all of them with one measurement, by changing measurement / sweep time. After measurement the peak value must be recorded.

The following is an example of the measurement.

![Transient Power Measurement 1](/efr32-rf-eval-guide/0.2/images/sld723-image29.png)

![Transient Power Measurement 2](/efr32-rf-eval-guide/0.2/images/sld723-image30.png)

The first figure is a measurement at 78 kHz and the second is at 1275 kHz offset from the carrier frequency of the signal. The signal's power is 16 dBm. The measurement shows that at both settings the maximum power is around -28 to -30 dBm. It is important to take in account that the resolution bandwidth (RBW) is not the same at the two measurements and this should be compensated in some cases. In this case, the power density at the second measurement must be less than the first one, but a wider frequency range is measured. Larger RBW result in more power being received at the wider frequency range.

##### Enable Direct Mode

In direct mode, the radio will still attempt to decode received packets, but the data bit streams are input to and output from the chip in real-time on a physical I/O pin. This is often useful in legacy systems that do not use a conventional packet structure, or when the host MCU must perform customized packet handling or processing. In TX Direct mode, the TX modulation data is applied to an input pin of the chip and processed in 'real time' (that is, not stored in a register for transmission at a later time).

The GPIOs for direct mode are fixed for now to the following pins.

```sh
DIN - EFR32_PC10 -> EXP_HEADER15/WSTK_P12
DOUT - EFR32_PC11 -> EXP_HEADER16/WSTK_P13
```

The data on these pins is asynchronous and can be connected directly to a UART. To enter direct mode issue the `directMode 1` command after starting the app. To leave direct  mode use `directMode 0`. To transmit, enable the transmitter by issuing `directTx 1` and later stop it with `directTx 0`. Receive is controlled using the standard `rx 1/0` command, but is enabled by default when not transmitting.

In this mode, only the frequency and the output power are configurable parameters. To change these parameters, refer to [Output a Continuous Unmodulated Tone](#output-a-continuous-unmodulated-tone).

#### Reception Test

Packet Error Rate (PER) and Bit Error Rate (BER) are error ratios that could measure various reception tests

| |PER|BER|
|---|---|---|
|Rx sensitivity|triggered and non-triggered|x|
|Selectivity|x|x|
|Blocking|x|x|
|Intermodulation|x|x|
|Maximum input Power|x|x|

EFR devices have a special mode to measure BER, with additional functions that can be used to calculate and measure BER easily. However, Silicon Labs does not recommend using this mode for RF evaluation, as regular frame detection does not occur in this mode. Instead, measuring PER with the normal operational mode turned on is recommended. Measuring PER gives more accurate feedback about how the EFR radio configuration perform, as it is testing in a mode that will be operational in the field after deployment.

##### PER Measurement

###### Basics of the Packet Error Rate

To measure PER, the accurate packet symbols must be known. PER [%] is calculated by the following:

![equation](/efr32-rf-eval-guide/0.2/images/sld723-equation.png)

##### where

Perror  = the number of packets not received correctly

Psent  = the number of packets sent and the result is displayed as a percentage.

PER measurement requires an accurate device that is able to send the packets the receiver under test (RUT) expects to receive. An RF vector signal generator is a good fit for these measurements.

Typical PER measurement procedure using RAILtest:

1. Record the packet that should be transmitted to the RUT (receiver under test) and load it to the RF signal generator.
2. Connect the RF signal generator and the RUT with the proper RF cable.
3. Send 100 to 1000 packets to the RUT. (P sent)
4. View the received number of packets by using `status` (RAILtest) command for example. The _RxCount_ value gives the successfully received number of packets. (P sent  - packets received = P error)
5. Calculate PER.

Using the `status` command, _RxCount_ is the number of successfully received packets. _SyncDetect_ is the number of sync word detection and _FrameErrors_ is the number of CRC errors acquired.

###### Record a Transmitted Packet

To know how a packet is assembled on an EFR32 device, it is practical to record a transmitted packet. A packet can be captured and demodulated with an RF vector spectrum analyzer from the EFR32 device's RF port, or the transmitted symbols could be wired to a GPIO pin before being sent to the modulator. The second option offers an easy way to see the transmitted baseband packet symbols before the modulation and upconversion to RF frequencies.

To port the transmitted packet symbols to the GPIO port, the PRS channels should be configured by using the setDebugSignal command. Use the setDebugSignal help command to learn more about the function. For additional information about PRS channels, see the Silicon Labs knowledgebase about _RAIL Tutorial: Debugging_ or the EFR32 page of the RAIL API documentation.

For example (using EFRxG13):

setDebugSignal PC11 TXACTIVE > PC11 GPIO pin active when TX is active

setdebugsignal PB2 CUSTOM_PRS 0x2a 0x5 > Data Clock is routed to PB2 GPIO

setdebugsignal PB3 CUSTOM_PRS 0x2a 0x6 > Data (Tx packet) is routed PB2 GPIO

During transmission, the data clock and data is recorded on the respective GPIO pins:

![image](/efr32-rf-eval-guide/0.2/images/sld723-image31.png)

###### Non-Triggered PER

By default the application starts in packet mode with the receiver enabled. In this mode we receive and transmit packets using the radio's frame controller hardware. If a packet is received, the payload content and length, the RSSI, the CRC status, and the time can be read from the receiver response.

Example:

```sh
{{(rxPacket)}{len:16}{timeUs:290402914}{timePos:4}{crc:Pass}{rssi:-50}
{lqi:240}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:254}
{payload: 0x0f 0x0e 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x99 0xaa 0xbb
0xcc 0xdd 0xee }}
```

This test also involves an RF signal generator, which can transmit predefined packets. In this mode, the radio is set to receive and the generator must send packets. If the radio does not receive the packet, there is no RX response. To view the number of received packets, CRC errors, and sync detect errors, use the status command.

Example:

```sh
{{(status)}{UserTxCount:38}{AckTxCount:0}{UserTxAborted:0}{AckTxAborted:0}{UserTxBlocked:0}
{AckTxBlocked:0}{UserTxUnderflow:0}{AckTxUnderflow:0}{RxCount:0}{SyncDetect:8}{NoRxBuffer:0}{RfSensed:0}
{ackTimeout:0}{ackTxFpSet:0}{ackTxFpFail:0}{ackTxFpAddrFail:0}{RfState:Rx}{RAIL_state_active:0}
{RAIL_state_rx:1}{RAIL_state_tx:0}{Channel:0}{AppMode:None}{TimingLost:0}{TimingDetect:0}{FrameErrors:8}
{RxFifoFull:0}{RxOverflow:0}{AddrFilt:0}{Aborted:0}{RxBeams:0}{DataRequests:0}{Calibrations:1}
{TxChannelBusy:0}{TxClear:0}{TxCca:0}{TxRetry:0}{UserTxStarted:38}}
```

To reset all the counters use:

```sh
resetCounters       Resets the Tx and Rx counters
```

If a long and fast test needs to be run, it is better to disable the Rx responses, to make the communication and the test faster.

```sh
setNotifications setRxNotification                    [enable] Enable(1) or Disable(0) status prints that happen asynchronously (rxPacket, txEnd, txError)
```

###### Triggered PER

RAILtest can be used to determine the packet error rate (PER) for a given setup. The Wireless Gecko is capable of triggering a connected RF signal generator to transmit a specific number of packets with a configured trigger interval, counting the correctly received packets, and calculating the actual PER value.

To set up this test, a piece of test equipment needs to be configured to send a packet on the rising edge of a GPIO. That should be connected to PC7 on the EFR32, or PC3 on the WSTK. `perRx 100 10000` will configure the Packet Error Rate test to send 100 packets, waiting 10000 μs between each packet. At the end of the test, the app will give an output indicating that PER mode has finished, and the statistics on the test can be recovered with `perStatus` and `status`. Note that calling `perRx 0 0` will cancel an ongoing test, and that calling perRx will have the same effect as calling `resetCounters`.

By adjusting the output power of the generator, the sensitivity of the radio can be determined. It is usually defined for a 1% or 20% packet error rate.

![Packet Error Rate Measurement Setup](/efr32-rf-eval-guide/0.2/images/sld723-image32.png)

##### BER Measurement

###### Running Bit Error Test from the CLI

The sensitivity of the radio can be measured with a continuously-looped PN sequence (x^9 + x^5 + 1). This mode is called bit error rate (BER). The EFR32 hardware has the ability to enter BER receive mode for diagnostic purposes. The radio is set into continuous receive mode. The RF data needs to be fed to the RX SMA of the test card or radio board. By adjusting the output power of the signal generator or an EFR32, the sensitivity of the radio can be measured (it is typically measured for 10^-3 BER). See [RAILtest User's Guide](/rail/3.1.0/railtest-users-guide) for further information about BER testing mode.

###### BER Measurement Procedure

To run the BER test successfully, a radio configuration specific to BER mode must be generated by the radio configurator. To enable BER testing mode by default on reset or startup:

**In Simplicity Studio 5 and 6**:

In the Radio Configurator, on the General Settings card enable **Customized**, and then on the Testing card enable **Reconfigure for BER testing**.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image33.png)

**In Simplicity Studio 4**:

Check **Reconfigure for BER testing** on the Radio Configuration tab.

![screenshot](/efr32-rf-eval-guide/0.2/images/sld723-image34.png)

##### Sensitivity Measurement

Sensitivity of a device is the minimum level of received RF power that the device is capable of receiving. Sensitivity is often expressed in dBm. It is usually defined for a 1% or 20% packet error rate, which means that at the sensitivity level (in dBm) the receiver is capable to produce 1% or 20% PER. By adjusting the output power of the generator, the sensitivity of the radio can be determined.

![Sensitivity Measurement](/efr32-rf-eval-guide/0.2/images/sld723-image35.png)

From this graph it can be determined that the sensitivity of a device at 20% PER is -104 dBm. In practice the sensitivity of a device depends on the radio configuration, such as modulation, deviance, and frequency.

To measure the sensitivity of a receiver, PER must be measured at various receiver power levels, in practice between 0 to -120 dBm values with 1 to 5 dB steps.

The measurement results are more accurate if the RF signal generators power steps finer and more packets are sent at each power step. In the above example, the PF power step is 1 dB and 100 packets were sent at each frequency step.

##### Other Receiver Measurements

The measurement specifications may differ based on the standards for different regions, and are described in more detail in other documents.

###### Selectivity

Selectivity is a measure of the capability of the receiver to operate correctly while an unwanted signal is present at an adjacent channel.

Measurement procedure: Two generators are used for this measurement. One is generating packets on the operating channel at the sensitivity level of the receiver +3 dB. The second generator is generating an unmodulated signal on the nearest adjacent channel. The maximum power of the second generator at which the RUT (Receiver Under Test) is not able to receive the packets of the first generator is the selectivity, expressed in dBm.

###### Blocking

Blocking is a measure of the capability of the receiver to operate correctly while an unwanted signal is present at frequencies other than at an adjacent channel or spurious responses are.

Measurement procedure: Two generators are used for this measurement. One generates packets on the operating channel at the sensitivity level of the receiver +3dB. The other generates an unmodulated signal on a specified frequency offset, based on the local region's specification. The maximum power of the second generator at which the receiver under test is not able to receive the packets of the first generator is the blocking level, expressed in dBm.

###### Intermodulation

The intermodulation response is a measure of the ability of the receiver to receive a wanted modulated signal, without exceeding a given degradation due to the presence of two or more unwanted signals with a specific frequency relationship to the wanted signal frequency.

###### Maximum Input Power

Maximum input power is a measure of the maximum power at which the receiver is able to receive the packets without degradation of the signal quality.

##### RSSI Curve

Received signal strength indicator (RSSI) is an estimate of the signal strength in the channel to which the receiver is tuned. The RSSI value can be read with 0.25 dB resolution per bit. The RSSI may be read at any time while the radio is in Receive mode. The RSSI is not latched, but continuously updated while in Receive mode.

To read the RSSI value, use the following command:

```sh
getRssi       Get RSSI in dBm if the receiver is turned on.
```

Example:

```sh
> getRssi
getRssi
{{(getRssi)}{rssi:-94}}

> >
```

Note that a systematic offset (see figure below) will appear in the RSSI value returned by the RAILtest command due to matching network, radio configuration, and so on. You must profile the board and account for the offset when using the returned value.

![RSSI Curve](/efr32-rf-eval-guide/0.2/images/sld723-image36.png)

###### Customer Production Test: Transmission Power

The high resolution RSSI enables accurate channel power comparison measurement that can be useful for production tests transmission power without an instrument.

Measurement procedure:

1. Load the RAILtest application on two EFR32 nodes.
2. Set both nodes to the same channel with the `setchannel n` command, where "n" is the channel number.
3. Issue the `setTxTone` command on the first node to set CW mode.
4. Read the RSSI level on the second node with the `getRssi` command.

## Silicon Labs RAIL API Reference Guide

### EFR32

While RAIL attempts to be chip-agnostic, certain hardware specifics can't be overlooked. Where possible, missing features will be simulated in software, but performance characteristics may vary. This section covers EFR32-specific content including hardware-specific configurations or calibrations.

#### Clocks

##### High-Frequency Clocks

The clock tree driving the radio subsystem (see the chip specific reference manual) must be sourced from the HFXO or an HFXO-referenced clock source. The radio clock frequency must be either the HFXO's or twice the HFXO's. This generally means that you must switch your HFCLK source to the HFXO before calling [sl_rail_init()](general#sl-rail-init) and make sure to leave the CMU->HFPRESC set to 1 to prevent dividing down the radio clock. You are free to scale the peripheral (CMU->HFPERPRESC) or Cortex (CMU->HFCOREPRESC) clocks using their prescalars, which are further down the clock tree. Keep in mind that this may introduce extra wait states when interacting with the radio and slow down some operations.

RAIL's built-in radio configuration PHYs for BLE, IEEE 802.15.4, and other protocols generally require the HFXO frequency to be 38.4 MHz except for EFR32xG25 and EFR32xG28 which require 39.0 MHz. A few platforms support a variety of HFXO frequencies for their built-in PHYs, selectable via the [Built-in PHYs for alternate HFXO frequencies](rail-util-built-in-phys) component. If using only proprietary radio configuration PHYs, RAIL does not require a particular HFXO frequency but it's strongly suggested to be within the 38.4 MHz to 40 MHz range, and of course that frequency will need to be made known to the radio calculator when generating such proprietary PHYs.

If using the DPLL on EFR32 Series-2 platforms, it is best to configure cmuDPLLLockMode_Phase where the frequency error will tend to 0. Using cmuDPLLLockMode_Freq should be avoided because it can cause issues with applications requiring very precise frequencies like proprietary protocols or Bluetooth. On EFR32xG22 going to EM1P sleep mode is precluded when an 80MHz HRFRCO PLL system clock is selected because it can cause a noticeable clock drift which impacts radio timing and tuning.

##### Low-Frequency Clocks

RAIL can use a low-frequency clock on the EFR32 to synchronize its time base across EM2 sleep. This only happens if you call [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) with [sl_rail_timer_sync_config_t::sleep](sl-rail-timer-sync-config-t#sleep) set to [sl_rail_sleep_config_t::SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#sl-rail-sleep-config-timersync-enabled). The slower the clock source, the longer it will take to synchronize because the process requires several ticks of the RTCC clock. When calling [sl_rail_config_sleep()](sleep#sl-rail-config-sleep), the code will first try to set up the timer with the LFXO if it's started, then fall back to the LFRCO, and finally assert if no LF clocks are running.

#### Receive and Transmit FIFO Buffers

EFR32 needs circular FIFO buffers for transmit data, receive data, and a receive packet queue for per-packet metadata. The transmit and receive buffers require 32-bit (4-byte) alignment; applications should use [sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) or [SL_RAIL_DECLARE_FIFO_BUFFER()](data-management#sl-rail-declare-fifo-buffer) to ensure conformance. The receive packet queue requires 64-bit (8-byte) alignment; applications should use [sl_rail_packet_queue_entry_t](data-management#sl-rail-packet-queue-entry-t) for declaring such.

The transmit FIFO buffers must be a power-of-2 bytes in size between 64 and 4096 bytes if FIFO mode ([sl_rail_tx_data_config_t::tx_method](sl-rail-tx-data-config-t#tx-method)[sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode)) is utilized or if the application relies on its circular wrapping behavior; otherwise the TX FIFOs may be of any size up to 4096 bytes when transmit operations are always initiated from the beginning of that FIFO. The transmit FIFO may be set at [sl_rail_init()](general#sl-rail-init) time via appropriate [sl_rail_config_t](sl-rail-config-t) field settings or later via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo). It must be established before any transmit operation is started. A packet for transmit may either be loaded all at once or in pieces using [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold) may also be used with the [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) event to load data as space becomes available in the FIFO during transmission.

The receive FIFO buffer and receive packet queue must both always be a power-of-2 bytes in size between 64 and 4096 bytes inclusive (i.e, the packet queue must have a power-of-2 number of entries between 8 and 512 inclusive). The chosen receive buffer size limits the maximum size of receive packets in packet mode and determines the size of the receive FIFO in FIFO mode. Because each receive packet has several bytes of overhead, you can only receive up to one (buffer size - overhead) byte packet without switching to FIFO mode. In FIFO mode, you must read out packet data as you approach this limit and store it off to reconstruct the full packet later. The per-packet overhead is platform-dependent and ranges between 8 and 11 bytes but this may increase so best to budget for worst-case 16 bytes of overhead.

RAIL provides a built-in receive FIFO buffer [sl_rail_builtin_rx_fifo_ptr](data-management#sl-rail-builtin-rx-fifo-ptr) of [SL_RAIL_BUILTIN_RX_FIFO_BYTES](data-management#sl-rail-builtin-rx-fifo-bytes-1) (512) and a built-in receive packet queue [sl_rail_builtin_rx_packet_queue_ptr](data-management#sl-rail-builtin-rx-packet-queue-ptr) of [SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES](data-management#sl-rail-builtin-rx-packet-queue-entries-1) (16) entries that protocols can use and share. Protocols or applications may alternatively allocate their own receive buffers/queues of more desirable sizes, established either at [sl_rail_init()](general#sl-rail-init) time via appropriate [sl_rail_config_t](sl-rail-config-t) field settings or later via [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) and/or [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue).

An entry is made in the packet queue on every packet completion (successful or not) signaled to the application. If the application calls [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet) that entry is held along with any of its packet data in the receive FIFO. When either the receive FIFO or packet queue fills or overflows, [SL_RAIL_EVENT_RX_FIFO_FULL](events#sl-rail-event-rx-fifo-full) or [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) occur at packet completion time, respectively.

RAIL also provides each protocol an internal transmit Auto-ACK FIFO whose default size is [SL_RAIL_DEFAULT_AUTO_ACK_FIFO_BYTES](auto-ack#sl-rail-default-auto-ack-fifo-bytes) (64) bytes. A protocol can establish a larger FIFO if needed via [sl_rail_set_auto_ack_fifo()](auto-ack#sl-rail-set-auto-ack-fifo). This FIFO is never used circularly; the entire Auto-ACK packet must fit within it starting at the FIFO's base address. Applications can write to it using [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo). The RAM address and size of this FIFO can be obtained via [sl_rail_get_auto_ack_fifo()](auto-ack#sl-rail-get-auto-ack-fifo) to support writing directly into its RAM and using [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo) to just tell RAIL how much data to send from it.

#### Data Reception Sources

When receiving data, you can configure hardware to provide data from three different hardware sources.

First, you can configure the hardware to provide a packet of information. This configuration uses the built-in demodulator and frame controller. Use [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) to enable this receive source.

Second, you can configure hardware to provide data directly from the demodulator. In this mode, hardware demodulation is used, but the user is responsible for implementing frame controller functionality. In other words, preamble detection, sync word detection, CRC validation, and so on must be performed in software by the application. All data returned is represented as 8-bit 2's-compliment values. Use [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA](data-management#sl-rail-rx-data-source-demod-data) to enable the receive source.

Third, you can configure hardware to provide data directly from the I and Q ADCs. In this mode, the user is responsible for implementing demodulator and frame controller functionality. The receive signal hardware has a 19-bit dynamic range. The user can select whether to return the upper 16 bits of the 19-bit value ([sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB](data-management#sl-rail-rx-data-source-iqdata-filtmsb)) or the lower 16 bits ([sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB](data-management#sl-rail-rx-data-source-iqdata-filtlsb)). All data returned is represented as 16-bit 2s-complement values. The I and Q values are put into the buffer in an alternating fashion where the first 16-bit value is the first I ADC value and the second 16-bit value is the first Q ADC value, and so on.

#### Interrupt Vectors

The RAIL library for EFR32 implements all of the interrupt vectors for radio peripherals, which is required for the RAIL library to function correctly. RAIL does not, however, set the priorities of these interrupt vectors. The others must be handled by your application using the CMSIS NVIC_SetPriority() API or direct manipulation of the NVIC. Below is the full list of interrupts used by the radio. You **must** run them all except FRC_PRI_IRQHandler at the same priority which is what all Silicon Labs RAIL applications do by default. You are free to choose what that priority is based on the requirements of your application (e.g., putting them below FreeRTOS OS atomic for access to OS functions in RAIL callbacks). Keep in mind that putting the radio interrupts at too low a priority can cause missed packets and other radio performance issues. A restriction on EFR32 Series-2 is that you must not disable radio interrupts for longer than a quarter of the RAIL timebase (2^32/4 microseconds or 18 minutes) to ensure proper timekeeping. See [RAIL_EFR32xG2x_Interrupts](rail-efr32x-g2x-interrupts) for more information.

#### Chip-Specific Initialization

##### EFR32 Hardware Initialization

EFR32 includes Platform code to create a basic HAL layer. A lot of this initialization code is completely up to you, but there are a couple of requirements when building a RAIL app. Specifically, the radio will only work if you are running off a high-precision crystal oscillator. Since some APIs will assume this is running, make sure to initialize and switch to the crystal before calling any radio APIs.

##### Radio-Specific Initialization

You may initialize the packet trace interface (PTI) for use in debugging. Currently [sl_rail_config_pti()](pti#sl-rail-config-pti) initialization depends on the board configuration and must be manually called at startup. If not using the [Callbacks Utility](rail-util-callbacks) plugin with [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) you must also initialize the power amplifier (PA) prior to attempting a transmit operation. This is done by calling [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init) sometime after [sl_rail_init()](general#sl-rail-init) and before transmitting.

###### Power Amplifier (PA) Configuration

Unlike earlier versions of RAIL where the primary transmit power APIs were platform-specific hardware power-level and individual PA focused with dBm conversion APIs subordinate, RAIL 3 makes units of dBm the primary API focus with PA selection subordinate, automatic, and more flexible, mostly hidden from user APIs within the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin and its tables. The former PA auto-mode APIs are gone – incorporated directly into the selected RAIL 3 PA table(s).

The [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin performs PA table initialization, establishing the table(s) from [RAIL 3 PA Power Conversion Tables Utility](sl-rail-util-pa-tables) to use on a platform via [sl_rail_util_pa_init()](pa-power-conversions#sl-rail-util-pa-init). Applications not using the [Callbacks Utility](rail-util-callbacks) plugin should follow up with a call to [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init) after [sl_rail_init()](general#sl-rail-init) and before attempting to transmit. That function establishes the default PA voltage and ramp time, though an application can also call [sl_rail_set_tx_pa_voltage()](pa#sl-rail-set-tx-pa-voltage) or [sl_rail_set_tx_pa_ramp_time()](pa#sl-rail-set-tx-pa-ramp-time) directly.

The RAIL library uses [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry), implemented in the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin, to map the desired deci-dBm to the best platform-specific PA and power-level using the conversion table appropriate for the [sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t) band being used to transmit (2.4-GHz, Sub-GHz, or Sub-GHz OFDM on EFR32xG25).

The per-platform per-PA-mode set of tables that RAIL provides in the [RAIL 3 PA Power Conversion Tables Utility](sl-rail-util-pa-tables) plugin are tuned to Silicon Labs boards. For custom boards, they should be re-measured to generate new tables taking into account the differences in the RF path that may exist. For even more custom use cases, customers are free to rewrite the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin implementation to suit their needs, as long as [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) is implemented as per its API specification.

###### Packet Trace Interface (PTI) Initialization

Packet trace on the EFR32 provides a mechanism for viewing transmitted and received radio packets for network sniffing or debugging. It can also be captured by a WSTK and sent to Simplicity Studio for viewing data in its Network Analyzer tool.

To use this functionality, configure the pins to use for this output and, optionally, how to format data. Note that the WSTK **requires** the following output format: 

```c
Mode: 8 bit UART mode
Baudrate: 1.6 Mbps
Framing Signal: Enabled

```

 Introducing changes is currently unsupported by the WSTK. Other output formats are currently unsupported.

To choose the pins, look in the applicable data sheet and select a valid route location for the FRC_DOUT and FRC_DFRAME signals. These map to PTI.DATA and PTI.FRAME on the WSTK respectively. Once you've found pins that work for your hardware, configure each signal's port and pin fields in the [sl_rail_pti_config_t](sl-rail-pti-config-t) PTI initialization structure passed into [sl_rail_config_pti()](pti#sl-rail-config-pti). When using the WSTK for example, initialize as follows:

```c
#include "sl_rail.h"
#include "sl_gpio.h"

void init_pti(void)
{
  sl_rail_pti_config_t pti_config =   {
    .mode = SL_RAIL_PTI_MODE_UART, // Only supported output mode for the WSTK
    .baud = 1600000,               // Choose 1.6 Mbps for the WSTK
    .dout_port   = SL_GPIO_PORT_B, // PB12
    .dout_pin    = 12,             // PB12
  //.dclk_port   = not unused in UART mode,
  //.dclk_pin    = not unused in UART mode,
    .dframe_port = SL_GPIO_PORT_B, // PB13
    .dframe_pin  = 13,             // PB13
  };

  // Initialize the Packet Trace Interface (PTI) for the EFR32
  sl_rail_config_pti(SL_RAIL_EFR32_HANDLE, &pti_config);

  // Enable Packet Trace (PTI)
  sl_rail_enable_pti(SL_RAIL_EFR32_HANDLE, true);
}

```

###### Other Radio GPIO Functions

Various useful signals related to the radio can be output on a GPIO using the Peripheral Reflex System (PRS). PRS is an advanced system where you can route signals to channels and then output those channels to a number of configurable locations. For more information, see the PRS chapter in the reference manual.

A list of some of the most interesting PRS signals related to the radio is shown below along with how to enable them in the PRS. The definition for these signals for a given chip can be found in the release at `platform/Device/SiliconLabs/<chipFamily>/Include/<chipFamily>_prs_signals.h` where `<chipFamily>` would be the beginning of the part number (EFR32MG21 for example).

|Signal|Summary|
|---|---|
|PRS_RAC_ACTIVE|Radio enabled|
|PRS_RAC_TX|Transmit mode enabled|
|PRS_RAC_RX|Receive mode enabled|
|PRS_RAC_LNAEN|LNA enabled for RX|
|PRS_RAC_PAEN|PA enabled for TX|
|PRS_MODEM_FRAMEDET|Frame detected|
|PRS_MODEM_PREDET|Preamble detected|
|PRS_MODEM_TIMDET|Timing detected|
|PRS_MODEM_FRAMESENT|Frame sent|
|PRS_MODEM_SYNCSENT|Sync word sent|
|PRS_MODEM_PRESENT|Preamble sent|

The example below shows how to configure a PRS channel to output RAC_RX on a GPIO. In this example, the WSTK is used with the BRD4153A radio board. The code below will put RAC_RX on PRS Channel 0 and output PRS Channel 0 on pin PC10 which is wired to WSTK_P12 and EXP_HEADER15 on the WSTK.

```c
#include "em_device.h"
#include "sl_gpio.h"
#include "em_cmu.h"
#include "em_prs.h"

void enableDebugGpios(void)
{
  // Turn on the PRS and GPIO clocks to access their registers.
  CMU_ClockEnable(cmuClock_PRS, true);
  CMU_ClockEnable(cmuClock_GPIO, true);

  // Configure PC10 as an output.
  sl_gpio_set_pin_mode(PC10, SL_GPIO_MODE_PUSH_PULL, false);

  // Configure PRS Channel 0 to output RAC_RX.
  PRS_SourceSignalSet(0,
                      ((PRS_RAC_RX & _PRS_CH_CTRL_SOURCESEL_MASK)
                       >> _PRS_CH_CTRL_SOURCESEL_SHIFT),
                      ((PRS_RAC_RX & _PRS_CH_CTRL_SIGSEL_MASK)
                       >> _PRS_CH_CTRL_SIGSEL_SHIFT),
                      prsEdgeOff);

  // Configure PRS Channel 0 to use output location 12 (PC10 - see data sheet).
  PRS->ROUTELOC0 &= ~_PRS_ROUTELOC0_CH0LOC_MASK;
  PRS->ROUTELOC0 |= PRS_ROUTELOC0_CH0LOC_LOC12;

  // Enable PRS Channel 0.
  PRS->ROUTEPEN |= PRS_ROUTEPEN_CH0PEN;
}

```

##### Required Dependencies

Most of the RAIL library is self-contained, however, there are some dependencies on external functions, such as functions from the C standard library, EMLIB, and CMSIS. Below is a complete list of these dependencies. Note that changing the implementation of any of these functions while maintaining their functionality could still impact RAIL operation.

|Group|Functions|
|---|---|
|CMSIS|`SystemHFRCODPLLClockGet()`<br />`SystemHFXOClockGet()`<br />`SystemSYSCLKGet()`|
|DRIVER (sl_gpio)|`sl_gpio_set_pin_mode()`<br />`sl_gpio_clear_pin()`<br />`sl_gpio_set_pin()`|
|EMLIB (em_cmu)|`CMU_ClockEnable()`<br />`CMU_ClockFreqGet()`<br />`CMU_HFXOCoreBiasCurrentCalibrate`<br />`CMU_HFXOCTuneDeltaGet()`<br />`CMU_HFXOCTuneDeltaSet()`<br />`CMU_HFXOCTuneGet()`<br />`CMU_HFXOCTuneSet()`|
|EMLIB (em_core)|`CORE_EnterCritical()`<br />`CORE_ExitCritical()`<br />`CORE_EnterAtomic()`<br />`CORE_ExitAtomic()`|
|EMLIB (em_emu)|`EMU_DCDCSetPFMXTimeoutMaxCtrl()`|
|EMLIB (em_ldma)|`LDMA_StartTransfer()`<br />`LSMA_StopTransfer()`<br />`LDMA_TransferDone()`|
|EMLIB (em_prs)|`PRS_ConnectConsumer()`<br />`PRS_ConnectSignal()`<br />`PRS_GetFreeChannel`<br />`PRS_SourceAsyncSignalSet`|
|EMLIB (em_system)|`SYSTEM_ChipRevisionGet()`|
|EMLIB (em_timer)|`TIMER_Init()`<br />`TIMER_Reset()`|
|SERVICE (sl_power_manager)|`sl_power_manager_subscribe_em_transition_event()<br>`sl_power_manager_unsubscribe_em_transition_event`\ilinebr </td> </tr> <tr class="markdownTableRowOdd"> <td class="markdownTableBodyNone"> SERVICE (sl_sleeptimer) \ilinebr </td> <td class="markdownTableBodyNone">`sl_sleeptimer_get_tick_count()`<br>`sl_sleeptimer_get_timer_frequency()`<br>`sl_sleeptimer_start_timer()`<br>`sl_sleeptimer_stop_timer()`<br>`sl_sleeptimer_tick_to_ms()`\ilinebr </td> </tr> <tr class="markdownTableRowEven"> <td class="markdownTableBodyNone"> stdlib \ilinebr </td> <td class="markdownTableBodyNone">`memcmp()`<br>`memcpy()`<br>`memset()`|

##### Peripherals Consumed by RAIL

Certain functionality in RAIL requires some of the chip's peripherals. The specifics of these requirements are enumerated below.

###### TrustZone Considerations

RAIL internally accesses CMU, EMU, GPIO, HFXO and LDMA as noted above, along with its own radio-related peripherals, using TrustZone non-secure addresses. On TrustZone platforms (all Series 2) Trustzone must be initialized/enabled and these peripherals configured non-secure. RAIL does not support trustzone_unaware applications. Furthermore these peripherals' configurations should not be locked by the peripherals' corresponding LOCK register.

Certain platforms where [SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#sl-rail-supports-trustzone-secure-peripherals-1) is true may allow an application to use RAIL when some of these non-radio peripherals are configured secure. In this case some RAIL code must be executed as secure and some RAIL functionality is necessarily limited depending on which peripherals are made secure. Refer to [TrustZone](trust-zone) for more details.

###### RAIL Timer Synchronization

If you call [sl_rail_config_sleep](sleep#sl-rail-config-sleep) with [sl_rail_timer_sync_config_t::sleep](sl-rail-timer-sync-config-t#sleep) set to [sl_rail_sleep_config_t::SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#sl-rail-sleep-config-timersync-enabled) to keep the clock synchronized across sleep RAIL must use the PRS and RTCC.

- On all platforms, PRS channel 7 is used to perform the synchronization. This channel is only initialized one time when calling [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) so you must not change it after that or the synchronization may fail.
- On the EFR32xG21 platform, the timer synchronization also uses RTCC channel 0. This channel should not be used by the application after a call to [sl_rail_sleep()](sleep#sl-rail-sleep) and before the corresponding [sl_rail_wake()](sleep#sl-rail-wake) call. The application is also responsible for enabling this top level interrupt if they want it to serve as a wake source and implementing an interrupt handler that clears the RTCC_IFC_CC0 flag in the RTCC->IF register any time it is pended to prevent the chip from getting stuck in the handler. RAIL does not need to be tied into the interrupt handler in any other way.

###### DCDC

If you enable or disable the DCDC peripheral, you must follow it by calling [sl_rail_changed_dcdc()](retiming#sl-rail-changed-dcdc). This API indicates that the DCDC peripheral bus clock has changed allowing RAIL to react accordingly.

###### LDMA

RAIL's use of LDMA is generally optional and enabled only by calling [sl_rail_use_dma()](general#sl-rail-use-dma). It can be speed up [sl_rail_init()](general#sl-rail-init) initialization. Some RAIL features, like [sl_rail_ieee802154_config_rx_channel_switching()](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching) and related [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching), may require the use of LDMA and won't function without it being configured.

##### Entropy Generation

EFR32 supports true entropy collection using the radio via [sl_rail_get_radio_entropy()](general#sl-rail-get-radio-entropy). It is able to collect 1 bit per radio clock cycle while in receive mode. This means that the receiver must be enabled when collecting entropy. If you attempt to transmit or otherwise delay entry into receive, data collection will take longer. You can still receive packets while collecting entropy. This means that requesting random numbers longer than the length of your preamble and sync word may trigger a packet reception. This may be fixed in a future revision but for now it ensures a proper packet reception during a random data collection.

Due to the nature of random data collection, either the number of bytes or zero is returned after the full amount requested. Zero is returned if the radio is uninitialized and cannot be enabled for collection.

##### RAIL Timebase

EFR32 uses a dedicated radio timer to create the 1 microsecond granularity RAIL timebase exposed to users for performing things like scheduled transmit and receive operations. The underlying hardware timer ticks at roughly every 0.5 us on EFR32 Series-2 and 0.125 us on Series-3. The exact tick value depends on the high-frequency crystal in use so there may be a small rounding error. All internal APIs account for this error, so over long periods of time it is generally unnoticeable.

##### Radio Calibration

EFR32 supports image rejection (IR) calibrations, VCO temperature calibration, and HFXO compensation. You may choose to enable some or all depending on your use case. Using IRCAL and VCO_TEMPCAL is recommended for optimal performance of the radio.

###### Image Rejection Calibration (IRCAL)

This calibration should be run each time your PHY configuration changes. It is based on the modulation scheme, frequency band, and other radio settings. RAIL will request this by calling [sl_rail_config_t::events_callback](sl-rail-config-t#events-callback) with the [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) bit set and the [SL_RAIL_CAL_ONETIME_IR_CAL](calibration#sl-rail-cal-onetime-ir-cal) bit set in [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal).

Using a proper value for this will improve sensitivity by several dBm, so it's highly recommended.

It can take on the order of 700 ms to complete this calibration. You may want to save off a known good value for this calibration and load it each time you switch PHYs to save time.

This calibration should be initialized before calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) to ensure that it is properly configured by the time the first channel is set up. The initialization involves enabling the algorithm and passing in parameters to configure the algorithm for the specific PHY generated by the EFR32 Radio Configurator.

You cannot use the radio while this calibration is being performed or you may generate an incorrect calibration. Application code should ensure that the radio remains in the idle state during this calibration.

This calibration is only meaningful for Zigbee, BLE, and sub GHz radio configurations. For all others you should still enable the calibration but the algorithm will apply a safe, default, calibration value.

###### Image Rejection Calibration for Transmit (TXIRCAL)

This calibration is only meaningful for sub GHz radio configurations using SUN-OFDM PHYs and it should be run only once per multi-PHY configuration. For all other configurations this calibration won't run. RAIL will request this by calling [sl_rail_config_t::events_callback](sl-rail-config-t#events-callback) with the [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) bit set and the [SL_RAIL_CAL_ONETIME_IR_CAL](calibration#sl-rail-cal-onetime-ir-cal) bit set in [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal).

This feature is automatically run after IRCAL, when a SUN-OFDM PHY is configured. If a SUN-OFDM PHY exists in the multi-PHYs radio configuration, it is advised to first load this OFDM PHY and then call [sl_rail_calibrate()](calibration#sl-rail-calibrate), so that both the IRCAL and TXIRCAL are run immediately. Otherwise the calibration will be requested the first time an OFDM PHY is loaded.

Like IRCAL, using a proper value for this will improve sensitivity by several dBm, so it's highly recommended.

It can take on the order of 150 ms to complete this calibration. You may want to save off a known good value for this calibration and load it each time you switch multi-PHY configuration to save time.

You cannot use the radio while this calibration is being performed or you may generate an incorrect calibration. Application code should ensure that the radio remains in the idle state during this calibration.

###### VCO Temperature Calibration (VCO_TEMPCAL)

When staying in receive for a very long time and the temperature changes causing the radio to drift off-frequency, RAIL will request this calibration via [sl_rail_config_t::events_callback](sl-rail-config-t#events-callback) with the [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) bit set and the [SL_RAIL_CAL_TEMP_VCO](calibration#sl-rail-cal-temp-vco) bit set in sl_rail_cal_pending_get().

This calibration is automatically run every time receive is entered. If the application, by its nature, frequently re-enters receive mode, this calibration may not need to be enabled.

On EFR, the application will get this event when the absolute temperature crosses 0C degrees as well as when the temperature delta from the last calibration increases or decreases by 70C.

It is always recommended to enable and handle this calibration since it doesn't add much overhead and is much safer.

###### HFXO Temperature Compensation (HFXO_TEMPCOMP)

This optional feature requires plugin [Thermistor Utility](rail-util-thermistor). More details about the compensation are available in the plugin page.

When the temperature varies too much, HFXO frequency drifts, resulting in signal degradation. The compensation corrects the effects of this deviation in the radio, and is done in 2 steps (2 events).

The first event is [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) with the [SL_RAIL_CAL_TEMP_HFXO](calibration#sl-rail-cal-temp-hfxo) bit set in [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal). This signals the need to call [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement).

The second event occurs at the end of this measurement triggering [SL_RAIL_EVENT_THERMISTOR_DONE](events#sl-rail-event-thermistor-done) with the [SL_RAIL_CAL_COMPENSATE_HFXO](calibration#sl-rail-cal-compensate-hfxo) bit set in [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal). This signals the need to idle the radio and call [sl_rail_calibrate_hfxo()](calibration#sl-rail-calibrate-hfxo).

When enabled, [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) event is automatically set when the number of degrees set in either [sl_rail_hfxo_compensation_config_t::delta_nominal_celsius](sl-rail-hfxo-compensation-config-t#delta-nominal-celsius) or [sl_rail_hfxo_compensation_config_t::delta_critical_celsius](sl-rail-hfxo-compensation-config-t#delta-critical-celsius) are exceeded.

##### State Transition Timing

EFR32 allows automatic transitions from receive to transmit to precisely time transmitted packets after packet reception. During this process, internal calculations are performed which require the received packet's duration, from sync word to end of CRC, to be less than 32 ms. If received packets in a given protocol have an on-air time greater than 32 ms, the automatic transition from receive to transmit may not be used with that protocol because of incorrect timing of that transition.

##### RF SENSE

The RAIL library for EFR32 supports RF Sensing on EFR32xG22, EFR32xG27, and EFR32xG29 only. Enabling RF SENSE will enable the ULFRCO clock, if not already enabled.

###### Energy Detection Mode

This RF SENSE mode detects the presence of RF energy and triggers an event if that energy is continuously present for certain duration of time. The RF SENSE energy duration ranges from 1 ms - 128 ms as a power of 2. Based on the user's RF SENSE duration (senseTime) input, the duration is checked against the actual period and the next higher period. If the senseTime is greater than or equal to ((actualPeriod + nextHigherPeriod) / 2), the next higher duration is chosen. The energy detection threshold can be configured for high sensitivity (low noise environment) or low sensitivity (high noise environment) by selecting the appropriate RF Band via [sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t). The thresholds for each can be adjusted from their defaults via the globals [sl_rail_rf_sense_high_sensitivity_value](rf-sense#sl-rail-rf-sense-high-sensitivity-value) and [sl_rail_rf_sense_low_sensitivity_value](rf-sense#sl-rail-rf-sense-low-sensitivity-value).

###### Selective Mode

This RF_SENSE mode uses 0.5 kbps Manchester encoded OOK detection which allows the chip to wake up upon detecting particular preamble and sync word pattern sent using OOK.

The transmitting node, which can be any 2.4GHz capable platform except EFR32xG21, must be configured to use the OOK based RF SENSE PHY for waking up the chip, via [sl_rail_config_rf_sense_selective_ook_wakeup_phy()](rf-sense#sl-rail-config-rf-sense-selective-ook-wakeup-phy), followed by setting the transmit FIFO to include the Preamble Byte and the sync word (1 byte - 4 bytes), using [sl_rail_set_rf_sense_selective_ook_wakeup_payload()](rf-sense#sl-rail-set-rf-sense-selective-ook-wakeup-payload).

### RAIL Multiprotocol

#### Overview

As of version 2.1, the RAIL library supports dynamic multiprotocol. In dynamic multiprotocol, an application can allocate multiple RAIL instances and configure them independently. Some radio operations are then arbitrated by a radio scheduler, which is internal to RAIL, to allow the different instances to coexist. The scheduler attempts to allow as many of these operations to run as possible by moving them around within the bounds allowed by the protocol.

#### Radio Scheduler

The radio scheduler is critical for multiprotocol operation. Its job is to arbitrate all radio operations, switch radio configurations, and ensure that radio operations run at the time requested. Not every RAIL function is a radio operation considered by the scheduler. Simple state update functions, such as [sl_rail_set_tx_power_dbm()](pa#sl-rail-set-tx-power-dbm), will directly change the hardware if active or update the state cache if inactive to have that change take affect the next time this protocol is activated. The following RAIL functions are handled by the scheduler:

- [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi)
- [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx)
- [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx)
- [sl_rail_start_rx()](receive#sl-rail-start-rx)
- [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx)
- [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx)
- [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx)
- [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx)
- [sl_rail_start_tx()](packet-tx#sl-rail-start-tx)
- [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream)

To arbitrate the radio operations, the scheduler uses a start time along with a priority, slip_time, and transaction_time to schedule the operation. The start time comes from the above APIs implicitly or explicitly requested start time. For example, calling [sl_rail_start_tx()](packet-tx#sl-rail-start-tx) uses a start time of right now, while calling [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx) uses the [sl_rail_scheduled_tx_config_t::when](sl-rail-scheduled-tx-config-t#when) parameter field as the start time. The other three parameters are passed to the above RAIL functions in their [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) p_scheduler_info parameter. The scheduler attempts to run each task at its desired start time, but may also choose to run it up until start time + slip_time. If it cannot run the task within that window, it will trigger a [sl_rail_config_t::events_callback](sl-rail-config-t#events-callback) with the [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) event set once that window has passed.

The scheduler is preemptive and will always ensure that a higher-priority task runs over a lower-priority task, but it does not guarantee ordering of these tasks. For example, it could choose to run a short lower-priority task with a small slip_time before a higher-priority task with a long slip_time to reduce dropped operations. Once an operation is started by the radio scheduler, it will either run to completion and trigger a normal RAIL event callback to indicate it is done or it will be aborted by a higher-priority task and ended with a [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) event. Ultimately, the application is responsible for terminating most operations with a call to [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio). This call cleans up internal state and allows the scheduler to switch to a lower priority operation.

**Note**

- For the [sl_rail_scheduler_info_t::priority](sl-rail-scheduler-info-t#priority) parameter, 0 is the highest priority while 255 is the lowest.

##### Scheduler Operations

The APIs mentioned above can be classified as finite operations, infinite operations, and debug operations.

###### Finite Operations

Finite operations include the following APIs:

- [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi)
- [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx)
- [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx)
- [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx)
- [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx)
- [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx)
- [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx)
- [sl_rail_start_tx()](packet-tx#sl-rail-start-tx)

Finite operations make up the majority of the radio scheduler calls. A finite operation has a defined start time and either a defined or estimated end time. Each RAIL handle may only have one of these types of operations queued up at any time. The upper level application code is responsible for waiting until the previous operation has completed before starting a new one like in the single protocol RAIL library. If a new task is issued while a previous task is in progress, or if a higher-priority task interrupts an operation before the user has yielded, it will trigger the [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) event with an appropriate [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) (retrievable by calling [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status) within the event handler) and the operation will not be scheduled again.

Once a finite operation has begun, the scheduler will use the same priority until a new finite event is provided or a yield occurs. The scheduler will ensure that unnecessary switches do not occur if this next event is in the near future at the same or a higher priority. For more information see [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield).

###### Infinite Operations

Infinite operations include the following APIs:

- [sl_rail_start_rx()](receive#sl-rail-start-rx)

An infinite or background operation is treated by the scheduler as a radio state change. It still has a priority associated with it and will be started whenever it can be, but it will never fail. Another difference is that if this event is interrupted by a higher-priority task, it will be restarted whenever that task finishes where a finite task would be aborted.

Each RAIL handle may have only one infinite task but it may have both an infinite and finite or debug task at the same time. The one interesting aspect of this is that, if a finite task starts for this RAIL handle, the state will be updated to reflect what the infinite task has requested for that finite task's time period even if the infinite task is lower priority than another task in the system. For example, if you have one handle with a [sl_rail_start_rx()](receive#sl-rail-start-rx) of priority 5 and another handle with a [sl_rail_start_rx()](receive#sl-rail-start-rx) priority of 6 and a [sl_rail_start_tx()](packet-tx#sl-rail-start-tx) priority of 3, the scheduler will choose the second handle's finite transmit task. While running this transmit task though, the receiver will be set to on so that, as soon as this transmit completes, the radio will transition from transmit into receive. It will remain in receive until the finite operation yields at which time the first handle's receive will take precedence.

This implementation is intended to get the radio to stay in receive for a very long time on one of the RAIL handles. It is generally only advisable to do this on one radio configuration at a time and for this to be the lowest-priority task. For well defined receive events, such as looking for an ACK scheduled receive, windows or state transitions will generally work better.

**Note**

- A known bug exists with turning on an infinite task during a finite task. For now, you must always configure the infinite task first to ensure it takes effect.
- If using state transitions that can lead from receive to idle, the user must tell the scheduler that this happened with a call to [sl_rail_idle()](state-transitions#sl-rail-idle-1). This restriction will hopefully be removed in future versions.

###### Debug Operations

Debug operations include the following APIs:

- [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream)

Debug operations are somewhat special because they don't allow the user to pass a [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) structure to them. Instead, they implicitly provide a start time of now and use the highest possible priority. This means that they will have the highest priority and interrupt most other protocol operations to switch into the test mode. Nothing can preempt them once started because the scheduler does not allow tasks of equal priority to preempt. These operations can be stoped by calling [sl_rail_stop_tx_stream()](diagnostic#sl-rail-stop-tx-stream), [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio), or [sl_rail_idle()](state-transitions#sl-rail-idle-1).

The modal nature of these debug operations is intentional to prevent multiple tone or stream operations from happening concurrently. It is expected that the user will manage these test modes from a higher level to prevent the different protocols from using tone or stream at the same time.

##### Yielding the Radio

Yielding is used by finite radio scheduler operations. Once an operation is started, that operation will run until explicitly yielded by the upper layer or interrupted by a higher-priority task. A yield is forced by a call to [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) or [sl_rail_idle()](state-transitions#sl-rail-idle-1). It is important that the application yield the radio as soon as it's done to allow lower-priority tasks to run.

Yielding is not handled by RAIL since terminating an operation can be application-specific. While RAIL may know that an individual transmit or receive operation is completed, there are sometimes other reasons to prevent a switch or to run a follow on operation. For example, if you are using ACKing you may want to wait for the [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent) after a receive packet instead of yielding right after the receive. This also allows you to chain together many protocol-specific operations without the scheduler constantly context switching. If you do schedule a follow on operation that is far in the future, the scheduler will also be smart enough to treat this as a yield and slot in other lower-priority operations.

This does mean that you must carefully look through the [Events](events) in RAIL and subscribe to any that can impact your state machine. Specifically, things like transmit or receive success conditions, transmit and receive error conditions, and scheduler events ([SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status), [SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled), and [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled)) are important to keep track of. These would likely be needed in any upper layer to properly update the internal state machine as well so they're likely already in the implementation.

#### Building a Multiprotocol Application

The RAIL API is the same whether the targeted application is using the multiprotocol version or not. This was done intentionally to make switching between the two versions simple. From a build perspective, choose the desired RAIL library binary file to link into the application. For multiprotocol applications, the file name is librail_multiprotocol_CHIP_COMPILER_release.a while for other applications the file name is librail_CHIP_COMPILER_release.a.

Optionally, non-multiprotocol applications can save memory by passing NULL for all [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) pointers in APIs.

Starting in RAIL 2.12, the RAIL multiprotocol library internally provides two statically allocated RAM state buffers supporting two protocols. If your multiprotocol application needs more than two protocols, additional state buffers for them must be provided by calling [sl_rail_add_state_buffer_3()](general#sl-rail-add-state-buffer-3) or [sl_rail_add_state_buffer_4()](general#sl-rail-add-state-buffer-4) prior to calling [sl_rail_init()](general#sl-rail-init) for these protocols. If more than four protocols are needed, contact Silicon Labs for advice.

#### Example

Below is a simple example showing how to initialize two RAIL protocols and have one stay in infinite receive while the other one periodically transmits a packet at a higher priority.

```c
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h" // in sl_rail_util_pa plugin
#include "rail_config.h" // Generated by radio calculator

#define TX_FIFO_BYTES (128)  // Any power of 2 from [64, 4096] on the EFR32

static sl_rail_handle_t rail_handle_1 = SL_RAIL_EFR32_HANDLE;
static sl_rail_handle_t rail_handle_2 = SL_RAIL_EFR32_HANDLE;

static sl_rail_tx_power_t tx_power_ddbm = 200; // Default to 20 dBm

static SL_RAIL_DECLARE_FIFO_BUFFER(aligned_tx_fifo_1, TX_FIFO_BYTES);
static uint8_t *tx_fifo_1 = (uint8_t *)aligned_tx_fifo_1; // For byte access
static SL_RAIL_DECLARE_FIFO_BUFFER(aligned_tx_fifo_2, TX_FIFO_BYTES);
static uint8_t *tx_fifo_2 = (uint8_t *)aligned_tx_fifo_2; // For byte access

// Boolean to track when a packet has been sent.
static bool packet_send_complete = true;

static void radio_event_handler(sl_rail_handle_t rail_handle,
                                sl_rail_events_t events)
{
  // Note that two different callbacks above could be used,
  // but this example only uses one which is split based on the handle.
  if (rail_handle == rail_handle_1) {
    // Handle events for protocol 1.
    // NOTE: Since in infinite receive, the radio does not have to be yielded
    // here as below. If this were changed, the radio would have to be yielded here.
  } else if (rail_handle == rail_handle_2) {
    // Handle any packet completion event (success or failure) and set us up
    // to send another packet.
    if (events & (SL_RAIL_EVENT_TX_PACKET_SENT
                  | SL_RAIL_EVENT_TX_ABORTED
                  | SL_RAIL_EVENT_TX_UNDERFLOW
                  | SL_RAIL_EVENT_SCHEDULER_STATUS)) {
      packet_send_complete = true;
      sl_rail_yield_radio(rail_handle);
    }
  }
}

// Initializes the two PHY configurations for the radio.
void radio_initialize(void)
{
  sl_rail_status_t status;
  // Creates each RAIL handle with their own configuration structures.
  // Below configs for each protocol utilize a shared RX FIFO and packet buffer
  // but have distinct TX FIFOs.
  sl_rail_config_t rail_config_1 = {
    .events_callback = &radio_event_handler,
  //.p_opaque_handle_0 = ... // app-specific if desired
  //.p_opaque_handle_1 = ... // app-specific if desired
  //.opaque_value = ... // app-specific if desired
    .rx_packet_queue_entries = SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes = SL_RAIL_BUILTIN_RX_FIFO_BYTES,
    .tx_fifo_bytes = sizeof(aligned_tx_fifo_1),
    .tx_fifo_init_bytes = 0U,
    .p_rx_packet_queue = sl_rail_builtin_rx_packet_queue_ptr,
    .p_rx_fifo_buffer = sl_rail_builtin_rx_fifo_ptr,
    .p_tx_fifo_buffer = aligned_tx_fifo_1,
  };
  sl_rail_config_t rail_config_1 = {
    .events_callback = &radio_event_handler,
  //.p_opaque_handle_0 = ... // app-specific if desired
  //.p_opaque_handle_1 = ... // app-specific if desired
  //.opaque_value = ... // app-specific if desired
    .rx_packet_queue_entries = SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes = SL_RAIL_BUILTIN_RX_FIFO_BYTES,
    .tx_fifo_bytes = sizeof(aligned_tx_fifo_2),
    .tx_fifo_init_bytes = 0U,
    .p_rx_packet_queue = sl_rail_builtin_rx_packet_queue_ptr,
    .p_rx_fifo_buffer = sl_rail_builtin_rx_fifo_ptr,
    .p_tx_fifo_buffer = aligned_tx_fifo_2,
  };
  sl_rail_util_pa_init(); // Establish PA conversion table(s)
  status = sl_rail_init(&rail_handle_1, &railconfig_1, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_init(&rail_handle_2, &railconfig_1, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  // Here rail_handle_1 and _2 have been converted to a real protocol instance handles

  // Configures radio according to the generated radio settings.
  status = sl_rail_config_channels(rail_handle_1, channelConfigs[0],
                                   &sl_rail_util_pa_on_channel_config_change);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_config_channels(rail_handle_2, channelConfigs[1],
                                   &sl_rail_util_pa_on_channel_config_change);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_set_tx_power_dbm(rail_handle_2, tx_power_ddbm);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Configures the most useful callbacks plus catch a few errors.
  status = sl_rail_config_events(rail_handle_1,
                                 SL_RAIL_EVENTS_ALL,
                                 (SL_RAIL_EVENT_TX_PACKET_SENT
                                  | SL_RAIL_EVENT_TX_ABORTED
                                  | SL_RAIL_EVENT_TX_UNDERFLOW
                                  | SL_RAIL_EVENT_SCHEDULER_STATUS
                                  | SL_RAIL_EVENT_RX_PACKET_RECEIVED
                                  | SL_RAIL_EVENT_RX_FRAME_ERROR));
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_config_events(rail_handle_2,
                                 SL_RAIL_EVENTS_ALL,
                                 (SL_RAIL_EVENT_TX_PACKET_SENT
                                  | SL_RAIL_EVENT_TX_ABORTED
                                  | SL_RAIL_EVENT_TX_UNDERFLOW
                                  | SL_RAIL_EVENT_SCHEDULER_STATUS
                                  | SL_RAIL_EVENT_RX_PACKET_RECEIVED
                                  | SL_RAIL_EVENT_RX_FRAME_ERROR));
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

int main(void)
{
  sl_rail_status_t status;
  sl_rail_scheduler_info_t scheduler_info;
  uint32_t send_time;

  // Initializes the radio and creates the two RAIL handles.
  radio_initialize();

  // Only set priority because transaction_time is meaningless for infinite
  // operations and slip_time has a reasonable default for relative operations.
  sl_rail_scheduler_info_t scheduler_info = {
    .priority = 200,
  };
  status = sl_rail_start_rx(rail_handle_1, 0, &scheduler_info);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Starts the first send 2 seconds after getting set up.
  send_time = sl_rail_get_time(rail_handle_2) + 2000000;

  // Issues a transmit periodically on the second RAIL handle.
  while (true) {
    if (packet_send_complete) {
      sl_rail_schedule_tx_config_t scheduled_tx_config = {
        .when = send_time,
        .mode = SL_RAIL_TIME_ABSOLUTE,
      };
      uint8_t packet_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 10 };

      // This assumes the Tx time is around 10 ms but should be tweaked based on
      // the specific PHY configuration.
      scheduler_info.priority = 100;
      scheduler_info.slip_time = 50000;
      scheduler_info.transactionTime = 10000;

      // Loads the transmit buffer with something to send.
      status = sl_rail_write_tx_fifo(rail_handle_2, packet_data,
                                     sizeof(packet_data), true);
      assert(status == SL_RAIL_STATUS_NO_ERROR);

      // Transmits this packet at the specified time or up to 50 ms late.
      status = sl_rail_start_scheduled_tx(rail_handle_2,
                                          0,
                                          SL_RAIL_TX_OPTIONS_DEFAULT,
                                          &scheduled_tx_config,
                                          &scheduler_info);
      if (status == SL_RAIL_STATUS_NO_ERROR) {
        packet_send_complete = false;
        send_time += 2000000; // Add 2 seconds to the previous time.
      } else {
        // In the current configuration this should never happen.
        assert(false);
      }
    }
  }

  return 0;
}

```

#### Understanding the Protocol Switch Time

Current EFR32 chips that run dynamic multiprotocol code only have a single radio in their hardware. As a result, when DMP switches protocols, it must fully reconfigure the radio accordingly. The time this reconfiguration takes, as well as the time it takes the scheduler to decide which radio task to run, and timings passed into RAIL via [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing) (idle_to_rx, idle_to_tx), make up the Protocol Switch Time. This is essentially the amount of time in advance the radio must be made aware of new tasks in order to execute them on time. If this time is not respected at higher layers, users may get a [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) that indicates a failed scheduled event. By default, RAIL uses [SL_RAIL_TRANSITION_TIME_US](multiprotocol-sixx3-xx#sl-rail-transition-time-us) as the time for all protocol switches. The following sections explain how to characterize this time for a specific app and reconfigure it.

##### Measuring the Protocol Switch Time

For users using only Silicon Labs provided standards-based stacks, the provided [SL_RAIL_TRANSITION_TIME_US](multiprotocol-sixx3-xx#sl-rail-transition-time-us) will be accurate. However, users implementing proprietary stacks or complex callbacks around scheduler events ([SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled), [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled), and [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status)) may need to recharacterize this time if they find that the current switch time is causing scheduling failures in their application. Users can empirically determine this time for their system with the following algorithm: On the EFR, set a small (e.g. 0) transition time using [sl_rail_set_transition_time()](multiprotocol#sl-rail-set-transition-time) (this API must be called before [sl_rail_init()](general#sl-rail-init) is called on any protocols). On protocol 1, enter infinite RX with [sl_rail_start_rx()](receive#sl-rail-start-rx). On protocol 2, request an absolutely scheduled TX for some time in future (e.g. `sl_rail_get_time(rail_handle_2) + 1000000`). For small transition time values, the application should get [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) on protocol 2, with a scheduler status of [SL_RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL](multiprotocol#sl-rail-scheduler-status-scheduled-tx-fail). Repeat this test (resetting the device each time between runs to ensure [sl_rail_set_transition_time()](multiprotocol#sl-rail-set-transition-time)) is called before [sl_rail_init()](general#sl-rail-init)) with increasing transition times. Eventually, for some large enough value, the application should begin getting [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) events, indicating that the supplied transition time was sufficient, and thus the radio was able to transition in time to complete the scheduled transmit at the correct time. Ideally this test should be run in both directions (i.e. repeat the test, swapping protocols 1 and 2).

Sample code for the above algorithm is provided below:

```c
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h" // in sl_rail_util_pa plugin
#include "rail_config.h" // Generated by radio calculator

#define TX_FIFO_BYTES (128)  // Any power of 2 from [64, 4096] on the EFR32

static sl_rail_handle_t rail_handle_1 = SL_RAIL_EFR32_HANDLE;
static sl_rail_handle_t rail_handle_2 = SL_RAIL_EFR32_HANDLE;

static SL_RAIL_DECLARE_FIFO_BUFFER(aligned_tx_fifo_1, TX_FIFO_BYTES);
static uint8_t *tx_fifo_1 = (uint8_t *)aligned_tx_fifo_1; // For byte access
static SL_RAIL_DECLARE_FIFO_BUFFER(aligned_tx_fifo_2, TX_FIFO_BYTES);
static uint8_t *tx_fifo_2 = (uint8_t *)aligned_tx_fifo_2; // For byte access

// Boolean to track when a packet has been sent.
static bool packet_send_complete = true;

uint32_t transition_time = 0;

void success(void) {
  // Indicate test success to user
}

void fail(void) {
  // Indicate test failure to user
}

static void radio_event_handler(sl_rail_handle_t rail_handle,
                                sl_rail_events_t events)
{
  // Note that two different callbacks above could be used,
  // but this example only uses one which is split based on the handle.
  if (rail_handle == rail_handle_1) {
    // We don't care about events on protocol 1 for this test
    return;
  } else if (rail_handle == rail_handle_2) {
    // Handle any packet completion event (success or failure) and set us up
    // to send another packet.
    if (events & SL_RAIL_EVENT_TX_PACKET_SENT) {
      success();
    }
    if (events & RAIL_EVENT_SCHEDULER_STATUS) {
      sl_rail_scheduler_status_t scheduler_status;
      sl_rail_status_t rail_status;
      if ((sl_rail_get_scheduler_status(rail_handle, &scheduler_status, &rail_status)
           != SL_RAIL_STATUS_NO_ERROR)
          || (scheduler_status & RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL)) {
        fail();
      }
    }
  }
}

// Initializes the two PHY configurations for the radio.
void radio_initialize(void)
{
  sl_rail_status_t status;
  // transition_time should be swept via testing instrumentation between
  // runs
  sl_rail_set_transition_time(transition_time)

  // Creates each RAIL handle with their own configuration structures.
  // Below configs for each protocol utilize a shared RX FIFO and packet buffer
  // but have distinct TX FIFOs.
  sl_rail_config_t rail_config_1 = {
    .events_callback = &radio_event_handler,
  //.p_opaque_handle_0 = ... // app-specific if desired
  //.p_opaque_handle_1 = ... // app-specific if desired
  //.opaque_value = ... // app-specific if desired
    .rx_packet_queue_entries = SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes = SL_RAIL_BUILTIN_RX_FIFO_BYTES,
    .tx_fifo_bytes = sizeof(aligned_tx_fifo_1),
    .tx_fifo_init_bytes = 0U,
    .p_rx_packet_queue = sl_rail_builtin_rx_packet_queue_ptr,
    .p_rx_fifo_buffer = sl_rail_builtin_rx_fifo_ptr,
    .p_tx_fifo_buffer = aligned_tx_fifo_1,
  };
  sl_rail_config_t rail_config_1 = {
    .events_callback = &radio_event_handler,
  //.p_opaque_handle_0 = ... // app-specific if desired
  //.p_opaque_handle_1 = ... // app-specific if desired
  //.opaque_value = ... // app-specific if desired
    .rx_packet_queue_entries = SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes = SL_RAIL_BUILTIN_RX_FIFO_BYTES,
    .tx_fifo_bytes = sizeof(aligned_tx_fifo_2),
    .tx_fifo_init_bytes = 0U,
    .p_rx_packet_queue = sl_rail_builtin_rx_packet_queue_ptr,
    .p_rx_fifo_buffer = sl_rail_builtin_rx_fifo_ptr,
    .p_tx_fifo_buffer = aligned_tx_fifo_2,
  };
  sl_rail_util_pa_init(); // Establish PA conversion table(s)
  status = sl_rail_init(&rail_handle_1, &railconfig_1, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_init(&rail_handle_2, &railconfig_1, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  // Here rail_handle_1 and _2 have been converted to a real protocol instance handles

  // Configures radio according to the generated radio settings.
  status = sl_rail_config_channels(rail_handle_1, channelConfigs[0],
                                   &sl_rail_util_pa_on_channel_config_change);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_config_channels(rail_handle_2, channelConfigs[1],
                                   &sl_rail_util_pa_on_channel_config_change);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_set_tx_power_dbm(rail_handle_2, tx_power_ddbm);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Only need a few events on the second handle for this test
  status = sl_rail_config_events(rail_handle_2,
                                 SL_RAIL_EVENTS_ALL,
                                 (SL_RAIL_EVENT_TX_PACKET_SENT
                                  | SL_RAIL_EVENT_SCHEDULER_STATUS));
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

int main(void)
{
  sl_rail_status_t status;
  sl_rail_scheduler_info_t scheduler_info;
  uint32_t send_time;

  // Initializes the radio and creates the two RAIL handles.
  radio_initialize();

  // Get into receive on handle 1
  sl_rail_scheduler_info_t scheduler_info = {
    .priority = 200,
    .transactionTime = 1000,
    .slipTime = 0,
  };
  status = sl_rail_start_rx(rail_handle_1, 0, &scheduler_info);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Starts the first send 1 second after getting set up.
  send_time = sl_rail_get_time(rail_handle_2) + 1000000;

  // Request a TX for some time in the future
  sl_rail_schedule_tx_config_t scheduled_tx_config = {
    .when = send_time,
    .mode = SL_RAIL_TIME_ABSOLUTE,
  };
  schedulerInfo.priority = 100;
  status = sl_rail_start_scheduled_tx(rail_handle_2,
                                      0,
                                      SL_RAIL_TX_OPTIONS_DEFAULT,
                                      &scheduled_tx_config,
                                      &scheduler_info);
  return 0;
}

```

##### Minimizing the Protocol Switch Time

Currently, the best way to minimize the switch time is by proper design of [sl_rail_config_t::events_callback](sl-rail-config-t#events-callback). Specifically, the three scheduler events [SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled), [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled), and [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status), will be passed to the callback independently of all other events. Additionally, they are only raised during protocol switch process, and so their handling is part of the critical path for the protocol switch. Ideally, if they are not needed, [sl_rail_config_events()](events#sl-rail-config-events) should disable these events. Otherwise they should be handled first, after which the event handler should return immediately.

Additionally, short transition times should be specified in [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing). Note that 0 for these values can be unreliable in a DMP context, as that tells the radio to go "as fast as possible" as opposed to a reliable, known value.

### Deprecated List

- Global [ADDRCONFIG_MATCH_TABLE_DOUBLE_FIELD](address-filtering#addrconfig-match-table-double-field)  
  RAIL 2.x synonym of [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_DOUBLE_FIELD](address-filtering#sl-rail-addr-config-match-table-double-field).
- Global [ADDRCONFIG_MATCH_TABLE_SINGLE_FIELD](address-filtering#addrconfig-match-table-single-field)  
  RAIL 2.x synonym of [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD](address-filtering#sl-rail-addr-config-match-table-single-field).
- Global [ADDRCONFIG_MAX_ADDRESS_FIELDS](address-filtering#addrconfig-max-address-fields)  
  RAIL 2.x synonym of [SL_RAIL_ADDR_CONFIG_MAX_ADDRESS_FIELDS](address-filtering#sl-rail-addr-config-max-address-fields).
- Global [ant0Loc](antenna-control#ant0-loc)  
  Backwards compatible name for [RAIL_AntennaConfig_t::defaultPath](rail-antenna-config-t#default-path) field.
- Global [FIFO_MODE](data-management#fifo-mode)  
  RAIL 2.x synonym of [SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode).
- Global [PACKET_MODE](data-management#packet-mode)  
  RAIL 2.x synonym of [SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode).
- Global [RADIO_CONFIG_ENABLE_CONC_PHY](radio-configuration#radio-config-enable-conc-phy)  
  RAIL 2.x synonym of [SL_RAIL_RADIO_CONFIG_ENABLE_CONC_PHY](radio-configuration#sl-rail-radio-config-enable-conc-phy).
- Global [RADIO_CONFIG_ENABLE_IRCAL_MULTIPLE_RF_PATHS](calibration-sixx3-xx#radio-config-enable-ircal-multiple-rf-paths)  
  RAIL 2.x. synonym of [SL_RAIL_RADIO_CONFIG_ENABLE_IR_CAL_MULTIPLE_RF_PATHS](calibration-sixx3-xx#sl-rail-radio-config-enable-ir-cal-multiple-rf-paths).  
  RAIL 2.x synonym of [SL_RAIL_RADIO_CONFIG_ENABLE_IR_CAL_MULTIPLE_RF_PATHS](calibration-sixx3-xx#sl-rail-radio-config-enable-ir-cal-multiple-rf-paths).
- Global [RADIO_CONFIG_ENABLE_STACK_INFO](radio-configuration#radio-config-enable-stack-info)  
  RAIL 2.x synonym of [SL_RAIL_RADIO_CONFIG_ENABLE_STACK_INFO](radio-configuration#sl-rail-radio-config-enable-stack-info).
- Class [RAIL_AddrConfig_t](rail-addr-config-t)  
  RAIL 2.x synonym of [sl_rail_addr_config_t](sl-rail-addr-config-t).
- Global [RAIL_AddrConfig_t::matchTable](rail-addr-config-t#match-table)  
  RAIL 2.x synonym of [sl_rail_addr_config_t::match_table](sl-rail-addr-config-t#match-table).
- Global [RAIL_AddrConfig_t::offsets](rail-addr-config-t#offsets)  [(2)]  
  RAIL 2.x synonym of [sl_rail_addr_config_t::offsets](sl-rail-addr-config-t#offsets).
- Global [RAIL_AddrConfig_t::sizes](rail-addr-config-t#sizes)  [(2)]  
  RAIL 2.x synonym of [sl_rail_addr_config_t::sizes](sl-rail-addr-config-t#sizes).
- Global [RAIL_AddrFilterMask_t](address-filtering#rail-addr-filter-mask-t)  
  RAIL 2.x synonym of [sl_rail_addr_filter_mask_t](address-filtering#sl-rail-addr-filter-mask-t).
- Global [RAIL_AddStateBuffer3](general#rail-add-state-buffer3)  (RAIL_Handle_t genericRailHandle)  
  RAIL 2.x synonym of [sl_rail_add_state_buffer_3()](general#sl-rail-add-state-buffer-3).
- Global [RAIL_AddStateBuffer4](general#rail-add-state-buffer4)  (RAIL_Handle_t genericRailHandle)  
  RAIL 2.x synonym of [sl_rail_add_state_buffer_4()](general#sl-rail-add-state-buffer-4).
- Class [RAIL_AlternatePhy_t](rail-alternate-phy-t)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t](sl-rail-alternate-phy-t).
- Global [RAIL_AlternatePhy_t::baseFrequency](rail-alternate-phy-t#base-frequency)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::base_frequency_hz](sl-rail-alternate-phy-t#base-frequency-hz).
- Global [RAIL_AlternatePhy_t::channelSpacing](rail-alternate-phy-t#channel-spacing)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::channel_spacing_hz](sl-rail-alternate-phy-t#channel-spacing-hz).
- Global [RAIL_AlternatePhy_t::hwModemAgcCtrl1](rail-alternate-phy-t#hw-modem-agc-ctrl1)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::hw_modem_agc_ctrl1](sl-rail-alternate-phy-t#hw-modem-agc-ctrl1).
- Global [RAIL_AlternatePhy_t::isOfdmModem](rail-alternate-phy-t#is-ofdm-modem)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::is_ofdm_modem](sl-rail-alternate-phy-t#is-ofdm-modem).
- Global [RAIL_AlternatePhy_t::minBaseIf_kHz](rail-alternate-phy-t#min-base-if-k-hz)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::min_base_if_khz](sl-rail-alternate-phy-t#min-base-if-khz).
- Global [RAIL_AlternatePhy_t::minIf_kHz](rail-alternate-phy-t#min-if-k-hz)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::min_if_khz](sl-rail-alternate-phy-t#min-if-khz).
- Global [RAIL_AlternatePhy_t::numberOfChannels](rail-alternate-phy-t#number-of-channels)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::number_of_channels](sl-rail-alternate-phy-t#number-of-channels).
- Global [RAIL_AlternatePhy_t::rateInfo](rail-alternate-phy-t#rate-info)  
  RAIL 2.x synonym of [sl_rail_alternate_phy_t::rate_info](sl-rail-alternate-phy-t#rate-info).
- Global [RAIL_ANTENNA_0](antenna-control#rail-antenna-0)  
  RAIL 2.x synonym of [SL_RAIL_ANTENNA_0](antenna-control#sl-rail-antenna-0).
- Global [RAIL_ANTENNA_1](antenna-control#rail-antenna-1)  
  RAIL 2.x synonym of [SL_RAIL_ANTENNA_1](antenna-control#sl-rail-antenna-1).
- Global [RAIL_ANTENNA_AUTO](antenna-control#rail-antenna-auto)  
  RAIL 2.x synonym of [SL_RAIL_ANTENNA_AUTO](antenna-control#sl-rail-antenna-auto).
- Class [RAIL_AntennaConfig_t](rail-antenna-config-t)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t](sl-rail-antenna-config-t).
- Global [RAIL_AntennaConfig_t::ant0Pin](rail-antenna-config-t#ant0-pin)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_pin](sl-rail-antenna-config-t#antenna-0-pin).
- Global [RAIL_AntennaConfig_t::ant0PinEn](rail-antenna-config-t#ant0-pin-en)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_pin_enable](sl-rail-antenna-config-t#antenna-0-pin-enable).
- Global [RAIL_AntennaConfig_t::ant0Port](rail-antenna-config-t#ant0-port)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_port](sl-rail-antenna-config-t#antenna-0-port).
- Global [RAIL_AntennaConfig_t::ant1Loc](rail-antenna-config-t#ant1-loc)  
  No longer used (ignored).
- Global [RAIL_AntennaConfig_t::ant1Pin](rail-antenna-config-t#ant1-pin)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_pin](sl-rail-antenna-config-t#antenna-1-pin).
- Global [RAIL_AntennaConfig_t::ant1PinEn](rail-antenna-config-t#ant1-pin-en)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_pin_enable](sl-rail-antenna-config-t#antenna-1-pin-enable).
- Global [RAIL_AntennaConfig_t::ant1Port](rail-antenna-config-t#ant1-port)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_port](sl-rail-antenna-config-t#antenna-1-port).
- Global [RAIL_AntennaConfig_t::defaultPath](rail-antenna-config-t#default-path)  
  RAIL 2.x synonym of [sl_rail_antenna_config_t::default_rf_path](sl-rail-antenna-config-t#default-rf-path).
- Global [RAIL_AntennaSel_t](antenna-control#rail-antenna-sel-t)  
  RAIL 2.x synonym of [sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t).
- Global [RAIL_ApplyIrCalibration](calibration#rail-apply-ir-calibration)  (RAIL_Handle_t railHandle, uint32_t imageRejection)  
  This previously-deprecated RAIL 2.x function has been replaced by [sl_rail_apply_ir_calibration()](calibration#sl-rail-apply-ir-calibration) with different parameters.
- Global [RAIL_ApplyIrCalibrationAlt](calibration#rail-apply-ir-calibration-alt)  (RAIL_Handle_t railHandle, [RAIL_IrCalValues_t](rail-ir-cal-values-t) *imageRejection, RAIL_AntennaSel_t rfPath)  
  RAIL 2.x synonym of [sl_rail_apply_ir_calibration()](calibration#sl-rail-apply-ir-calibration).
- Global [RAIL_AUTOACK_MAX_LENGTH](auto-ack#rail-autoack-max-length)  
  RAIL 2.x synonym of [SL_RAIL_DEFAULT_AUTO_ACK_FIFO_BYTES](auto-ack#sl-rail-default-auto-ack-fifo-bytes).
- Class [RAIL_AutoAckConfig_t](rail-auto-ack-config-t)  
  RAIL 2.x synonym of [sl_rail_auto_ack_config_t](sl-rail-auto-ack-config-t).
- Global [RAIL_AutoAckConfig_t::ackTimeout](rail-auto-ack-config-t#ack-timeout)  
  RAIL 2.x synonym of [sl_rail_auto_ack_config_t::ack_timeout_us](sl-rail-auto-ack-config-t#ack-timeout-us).
- Global [RAIL_AutoAckConfig_t::enable](rail-auto-ack-config-t#enable)  
  RAIL 2.x synonym of [sl_rail_auto_ack_config_t::enable](sl-rail-auto-ack-config-t#enable).
- Global [RAIL_AutoAckConfig_t::rxTransitions](rail-auto-ack-config-t#rx-transitions)  
  RAIL 2.x synonym of [sl_rail_auto_ack_config_t::rx_transitions](sl-rail-auto-ack-config-t#rx-transitions).
- Global [RAIL_AutoAckConfig_t::txTransitions](rail-auto-ack-config-t#tx-transitions)  
  RAIL 2.x synonym of [sl_rail_auto_ack_config_t::tx_transitions](sl-rail-auto-ack-config-t#tx-transitions).
- Global [RAIL_BLE_1Mbps](ble#rail-ble-1-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_1_MBPS](ble#sl-rail-ble-phy-1-mbps).
- Global [RAIL_BLE_2Mbps](ble#rail-ble-2-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_2_MBPS](ble#sl-rail-ble-phy-2-mbps).
- Global [RAIL_BLE_AOX2mbps](ble#rail-ble-aox2mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_AOX_2_MBPS](ble#sl-rail-ble-phy-aox-2-mbps).
- Global [RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#rail-ble-aox-antenna-pin-count)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#sl-rail-ble-aox-antenna-pin-count).
- Global [RAIL_BLE_AOX_OPTIONS_CONN](ao-x#rail-ble-aox-options-conn)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_CONN](ao-x#sl-rail-ble-aox-options-conn).
- Global [RAIL_BLE_AOX_OPTIONS_CONN_SHIFT](ao-x#rail-ble-aox-options-conn-shift)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_CONN_SHIFT](ao-x#sl-rail-ble-aox-options-conn-shift).
- Global [RAIL_BLE_AOX_OPTIONS_CONNLESS](ao-x#rail-ble-aox-options-connless)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_CONNLESS](ao-x#sl-rail-ble-aox-options-connless).
- Global [RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT](ao-x#rail-ble-aox-options-connless-shift)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT](ao-x#sl-rail-ble-aox-options-connless-shift).
- Global [RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK](ao-x#rail-ble-aox-options-disable-buffer-lock)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK](ao-x#sl-rail-ble-aox-options-disable-buffer-lock).
- Global [RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT](ao-x#rail-ble-aox-options-disable-buffer-lock-shift)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT](ao-x#sl-rail-ble-aox-options-disable-buffer-lock-shift).
- Global [RAIL_BLE_AOX_OPTIONS_DISABLED](ao-x#rail-ble-aox-options-disabled)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_DISABLED](ao-x#sl-rail-ble-aox-options-disabled).
- Global [RAIL_BLE_AOX_OPTIONS_DO_SWITCH](ao-x#rail-ble-aox-options-do-switch)  
  Obsolete AOX option.
- Global [RAIL_BLE_AOX_OPTIONS_ENABLED](ao-x#rail-ble-aox-options-enabled)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_ENABLED](ao-x#sl-rail-ble-aox-options-enabled).
- Global [RAIL_BLE_AOX_OPTIONS_LOCK_CTE_BUFFER_SHIFT](ao-x#rail-ble-aox-options-lock-cte-buffer-shift)  
  Use [SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT](ao-x#sl-rail-ble-aox-options-disable-buffer-lock-shift) instead.
- Global [RAIL_BLE_AOX_OPTIONS_RX_ENABLED](ao-x#rail-ble-aox-options-rx-enabled)  
  Obsolete AOX option.
- Global [RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE](ao-x#rail-ble-aox-options-sample-mode)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE](ao-x#sl-rail-ble-aox-options-sample-mode).
- Global [RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT](ao-x#rail-ble-aox-options-sample-mode-shift)  
  RAIL 2.x synonym of [SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT](ao-x#sl-rail-ble-aox-options-sample-mode-shift).
- Global [RAIL_BLE_AOX_OPTIONS_TX_ENABLED](ao-x#rail-ble-aox-options-tx-enabled)  
  Obsolete AOX option.
- Class [RAIL_BLE_AoxAntennaConfig_t](rail-ble-aox-antenna-config-t)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t](sl-rail-ble-aox-antenna-config-t).
- Global [RAIL_BLE_AoxAntennaConfig_t::antCount](rail-ble-aox-antenna-config-t#ant-count)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t::antenna_count](sl-rail-ble-aox-antenna-config-t#antenna-count).
- Global [RAIL_BLE_AoxAntennaConfig_t::antPortPin](rail-ble-aox-antenna-config-t#ant-port-pin)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t::p_antenna_port_pin](sl-rail-ble-aox-antenna-config-t#p-antenna-port-pin).
- Class [RAIL_BLE_AoxAntennaPortPins_t](rail-ble-aox-antenna-port-pins-t)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t](sl-rail-ble-aox-antenna-port-pins-t).
- Global [RAIL_BLE_AoxAntennaPortPins_t::antPin](rail-ble-aox-antenna-port-pins-t#ant-pin)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t::antenna_pin](sl-rail-ble-aox-antenna-port-pins-t#antenna-pin).
- Global [RAIL_BLE_AoxAntennaPortPins_t::antPort](rail-ble-aox-antenna-port-pins-t#ant-port)  
  RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t::antenna_port](sl-rail-ble-aox-antenna-port-pins-t#antenna-port).
- Class [RAIL_BLE_AoxConfig_t](rail-ble-aox-config-t)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t](sl-rail-ble-aox-config-t).
- Global [RAIL_BLE_AoxConfig_t::antArrayAddr](rail-ble-aox-config-t#ant-array-addr)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t::p_antenna_array](sl-rail-ble-aox-config-t#p-antenna-array).
- Global [RAIL_BLE_AoxConfig_t::antArraySize](rail-ble-aox-config-t#ant-array-size)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t::antenna_array_entries](sl-rail-ble-aox-config-t#antenna-array-entries).
- Global [RAIL_BLE_AoxConfig_t::aoxOptions](rail-ble-aox-config-t#aox-options)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t::aox_options](sl-rail-ble-aox-config-t#aox-options).
- Global [RAIL_BLE_AoxConfig_t::cteBuffAddr](rail-ble-aox-config-t#cte-buff-addr)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t::p_cte_buffer](sl-rail-ble-aox-config-t#p-cte-buffer).
- Global [RAIL_BLE_AoxConfig_t::cteBuffSize](rail-ble-aox-config-t#cte-buff-size)  
  RAIL 2.x synonym of [sl_rail_ble_aox_config_t::cte_buffer_bytes](sl-rail-ble-aox-config-t#cte-buffer-bytes).
- Global [RAIL_BLE_AoxOptions_t](ao-x#rail-ble-aox-options-t)  
  RAIL 2.x synonym of [sl_rail_ble_aox_options_t](ao-x#sl-rail-ble-aox-options-t).
- Global [RAIL_BLE_CalibrateIr](calibration#rail-ble-calibrate-ir)  (RAIL_Handle_t railHandle, uint32_t *imageRejection)  
  RAIL 2.x synonym of [sl_rail_ble_calibrate_ir()](calibration#sl-rail-ble-calibrate-ir).
- Global [RAIL_BLE_Coded125kbps](ble#rail-ble-coded125kbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_CODED_125_KBPS](ble#sl-rail-ble-phy-coded-125-kbps).
- Global [RAIL_BLE_Coded500kbps](ble#rail-ble-coded500kbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_CODED_500_KBPS](ble#sl-rail-ble-phy-coded-500-kbps).
- Global [RAIL_BLE_Coding_125kbps](ble#rail-ble-coding-125kbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_CODING_125_KBPS](ble#sl-rail-ble-coding-125-kbps).
- Global [RAIL_BLE_Coding_125kbps_DSA](ble#rail-ble-coding-125kbps-dsa)  
  This deprecated RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_BLE_Coding_500kbps](ble#rail-ble-coding-500kbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_CODING_500_KBPS](ble#sl-rail-ble-coding-500-kbps).
- Global [RAIL_BLE_Coding_500kbps_DSA](ble#rail-ble-coding-500kbps-dsa)  
  This deprecated RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_BLE_Coding_t](ble#rail-ble-coding-t)  
  RAIL 2.x synonym of [sl_rail_ble_coding_t](ble#sl-rail-ble-coding-t).
- Global [RAIL_BLE_ConfigAox](ao-x#rail-ble-config-aox)  (RAIL_Handle_t railHandle, const [RAIL_BLE_AoxConfig_t](rail-ble-aox-config-t) *aoxConfig)  
  RAIL 2.x synonym of [sl_rail_ble_config_aox()](ao-x#sl-rail-ble-config-aox).
- Global [RAIL_BLE_ConfigAoxAntenna](ao-x#rail-ble-config-aox-antenna)  (RAIL_Handle_t railHandle, const [RAIL_BLE_AoxAntennaConfig_t](rail-ble-aox-antenna-config-t) *antennaConfig)  
  RAIL 2.x synonym of [sl_rail_ble_config_aox_antenna()](ao-x#sl-rail-ble-config-aox-antenna).
- Global [RAIL_BLE_ConfigChannelRadioParams](ble#rail-ble-config-channel-radio-params)  (RAIL_Handle_t railHandle, uint32_t crcInit, uint32_t accessAddress, uint16_t channel, bool disableWhitening)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_config_channel_radio_params()](ble#sl-rail-ble-config-channel-radio-params) with different parameters.
- Global [RAIL_BLE_ConfigPhy1Mbps](ble#rail-ble-config-phy1-mbps)  (RAIL_Handle_t railHandle)  
  BLE non-Viterbi PHYs are no longer supported. Use [sl_rail_ble_config_phy_1_mbps()](ble#sl-rail-ble-config-phy-1-mbps) instead.
- Global [RAIL_BLE_ConfigPhy1MbpsViterbi](ble#rail-ble-config-phy1-mbps-viterbi)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_config_phy_1_mbps()](ble#sl-rail-ble-config-phy-1-mbps).
- Global [RAIL_BLE_ConfigPhy2Mbps](ble#rail-ble-config-phy2-mbps)  (RAIL_Handle_t railHandle)  
  BLE non-Viterbi PHYs are no longer supported. Use [sl_rail_ble_config_phy_2_mbps()](ble#sl-rail-ble-config-phy-2-mbps) instead.
- Global [RAIL_BLE_ConfigPhy2MbpsViterbi](ble#rail-ble-config-phy2-mbps-viterbi)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_config_phy_2_mbps()](ble#sl-rail-ble-config-phy-2-mbps).
- Global [RAIL_BLE_ConfigPhyCoded](ble#rail-ble-config-phy-coded)  (RAIL_Handle_t railHandle, RAIL_BLE_Coding_t bleCoding)  
  RAIL 2.x synonym of [sl_rail_ble_config_phy_coded()](ble#sl-rail-ble-config-phy-coded).
- Global [RAIL_BLE_ConfigPhyQuuppa](ble#rail-ble-config-phy-quuppa)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_config_phy_quuppa()](ble#sl-rail-ble-config-phy-quuppa).
- Global [RAIL_BLE_ConfigPhySimulscan](ble#rail-ble-config-phy-simulscan)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_config_phy_simulscan()](ble#sl-rail-ble-config-phy-simulscan).
- Global [RAIL_BLE_ConfigSignalIdentifier](ble#rail-ble-config-signal-identifier)  (RAIL_Handle_t railHandle, RAIL_BLE_SignalIdentifierMode_t signalIdentifierMode)  
  RAIL 2.x synonym of [sl_rail_ble_config_signal_identifier()](ble#sl-rail-ble-config-signal-identifier).
- Global [RAIL_BLE_CS1Mbps](ble#rail-ble-cs1-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_CS_1_MBPS](ble#sl-rail-ble-phy-cs-1-mbps).
- Global [RAIL_BLE_CS2Mbps](ble#rail-ble-cs2-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_CS_2_MBPS](ble#sl-rail-ble-phy-cs-2-mbps).
- Global [RAIL_BLE_CteBufferIsLocked](ao-x#rail-ble-cte-buffer-is-locked)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_cte_buffer_is_locked()](ao-x#sl-rail-ble-cte-buffer-is-locked).
- Global [RAIL_BLE_Deinit](ble#rail-ble-deinit)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_deinit()](ble#sl-rail-ble-deinit).
- Global [RAIL_BLE_EnableSignalDetection](ble#rail-ble-enable-signal-detection)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_ble_enable_signal_detection()](ble#sl-rail-ble-enable-signal-detection).
- Global [RAIL_BLE_EnableSignalIdentifier](ble#rail-ble-enable-signal-identifier)  
  RAIL 2.x synonym of [sl_rail_ble_enable_signal_detection()](ble#sl-rail-ble-enable-signal-detection).
- Global [RAIL_BLE_GetCteSampleOffset](ao-x#rail-ble-get-cte-sample-offset)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_get_cte_sample_offset()](ao-x#sl-rail-ble-get-cte-sample-offset).
- Global [RAIL_BLE_GetCteSampleRate](ao-x#rail-ble-get-cte-sample-rate)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_get_cte_sample_rate()](ao-x#sl-rail-ble-get-cte-sample-rate).
- Global [RAIL_BLE_Init](ble#rail-ble-init)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_init()](ble#sl-rail-ble-init).
- Global [RAIL_BLE_InitCte](ao-x#rail-ble-init-cte)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_init_cte()](ao-x#sl-rail-ble-init-cte).
- Global [RAIL_BLE_IsEnabled](ble#rail-ble-is-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_is_enabled()](ble#sl-rail-ble-is-enabled).
- Global [RAIL_BLE_LockCteBuffer](ao-x#rail-ble-lock-cte-buffer)  (RAIL_Handle_t railHandle, bool lock)  
  RAIL 2.x synonym of [sl_rail_ble_lock_cte_buffer()](ao-x#sl-rail-ble-lock-cte-buffer).
- Global [RAIL_BLE_Phy125kbps](ble-phy#rail-ble-phy125kbps)  
  RAIL 2.x synonym of [sl_rail_ble_phy_125_kbps](ble-phy#sl-rail-ble-phy-125-kbps).
- Global [RAIL_BLE_Phy1Mbps](ble-phy#rail-ble-phy1-mbps)  
  BLE non-Viterbi PHYs are no longer supported.
- Global [RAIL_BLE_Phy1MbpsViterbi](ble-phy#rail-ble-phy1-mbps-viterbi)  
  RAIL 2.x synonym of [sl_rail_ble_phy_1_mbps](ble-phy#sl-rail-ble-phy-1-mbps).
- Global [RAIL_BLE_Phy2Mbps](ble-phy#rail-ble-phy2-mbps)  
  BLE non-Viterbi PHYs are no longer supported.
- Global [RAIL_BLE_Phy2MbpsAox](ble-phy#rail-ble-phy2-mbps-aox)  
  RAIL 2.x synonym of [sl_rail_ble_phy_2_mbps_aox](ble-phy#sl-rail-ble-phy-2-mbps-aox).
- Global [RAIL_BLE_Phy2MbpsViterbi](ble-phy#rail-ble-phy2-mbps-viterbi)  
  RAIL 2.x synonym of [sl_rail_ble_phy_2_mbps](ble-phy#sl-rail-ble-phy-2-mbps).
- Global [RAIL_BLE_Phy500kbps](ble-phy#rail-ble-phy500kbps)  
  RAIL 2.x synonym of [sl_rail_ble_phy_500_kbps](ble-phy#sl-rail-ble-phy-500-kbps).
- Global [RAIL_BLE_Phy_t](ble#rail-ble-phy-t)  
  RAIL 2.x synonym of [sl_rail_ble_phy_t](ble#sl-rail-ble-phy-t).
- Global [RAIL_BLE_PhyQuuppa](ble-phy#rail-ble-phy-quuppa)  
  RAIL 2.x synonym of [sl_rail_ble_phy_quuppa](ble-phy#sl-rail-ble-phy-quuppa).
- Global [RAIL_BLE_PhySimulscan](ble-phy#rail-ble-phy-simulscan)  
  RAIL 2.x synonym of [sl_rail_ble_phy_simulscan](ble-phy#sl-rail-ble-phy-simulscan).
- Global [RAIL_BLE_PhySwitchToRx](ble#rail-ble-phy-switch-to-rx)  (RAIL_Handle_t railHandle, RAIL_BLE_Phy_t phy, uint16_t railChannel, RAIL_Time_t startRxTime, uint32_t crcInit, uint32_t accessAddress, uint16_t logicalChannel, bool disableWhitening)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_phy_switch_to_rx()](ble#sl-rail-ble-phy-switch-to-rx) with different parameters.
- Global [RAIL_BLE_Quuppa1Mbps](ble#rail-ble-quuppa1-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_QUUPPA_1_MBPS](ble#sl-rail-ble-phy-quuppa-1-mbps).
- Global [RAIL_BLE_RX_SUBPHY_COUNT](ble#rail-ble-rx-subphy-count)  
  RAIL 2.x synonym of [SL_RAIL_BLE_RX_SUBPHY_COUNT](ble#sl-rail-ble-rx-subphy-count).
- Global [RAIL_BLE_RX_SUBPHY_ID_125K](ble#rail-ble-rx-subphy-id-125-k)  
  RAIL 2.x synonym of [SL_RAIL_BLE_RX_SUBPHY_ID_125_KBPS](ble#sl-rail-ble-rx-subphy-id-125-kbps).
- Global [RAIL_BLE_RX_SUBPHY_ID_1M](ble#rail-ble-rx-subphy-id-1-m)  
  RAIL 2.x synonym of [SL_RAIL_BLE_RX_SUBPHY_ID_1_MBPS](ble#sl-rail-ble-rx-subphy-id-1-mbps).
- Global [RAIL_BLE_RX_SUBPHY_ID_500K](ble#rail-ble-rx-subphy-id-500-k)  
  RAIL 2.x synonym of [SL_RAIL_BLE_RX_SUBPHY_ID_500_KBPS](ble#sl-rail-ble-rx-subphy-id-500-kbps).
- Global [RAIL_BLE_RX_SUBPHY_ID_INVALID](ble#rail-ble-rx-subphy-id-invalid)  
  RAIL 2.x synonym of [SL_RAIL_BLE_RX_SUBPHY_ID_INVALID](ble#sl-rail-ble-rx-subphy-id-invalid).
- Global [RAIL_BLE_SetNextTxRepeat](bletx2-tx#rail-ble-set-next-tx-repeat)  (RAIL_Handle_t railHandle, const [RAIL_BLE_TxRepeatConfig_t](rail-ble-tx-repeat-config-t) *repeatConfig)  
  RAIL 2.x synonym of [sl_rail_ble_set_next_tx_repeat()](bletx2-tx#sl-rail-ble-set-next-tx-repeat).
- Global [RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1MBPS](ble#rail-ble-signal-identifier-mode-1-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1_MBPS](ble#sl-rail-ble-signal-identifier-mode-1-mbps).
- Global [RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2MBPS](ble#rail-ble-signal-identifier-mode-2-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2_MBPS](ble#sl-rail-ble-signal-identifier-mode-2-mbps).
- Global [RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE](ble#rail-ble-signal-identifier-mode-disable)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE](ble#sl-rail-ble-signal-identifier-mode-disable).
- Global [RAIL_BLE_SignalIdentifierMode_t](ble#rail-ble-signal-identifier-mode-t)  
  RAIL 2.x synonym of [sl_rail_ble_signal_identifier_mode_t](ble#sl-rail-ble-signal-identifier-mode-t).
- Global [RAIL_BLE_Simulscan](ble#rail-ble-simulscan)  
  RAIL 2.x synonym of [SL_RAIL_BLE_PHY_SIMULSCAN](ble#sl-rail-ble-phy-simulscan).
- Class [RAIL_BLE_State_t](rail-ble-state-t)  
  RAIL 2.x synonym of [sl_rail_ble_state_t](sl-rail-ble-state-t).
- Global [RAIL_BLE_State_t::accessAddress](rail-ble-state-t#access-address)  
  RAIL 2.x synonym of [sl_rail_ble_state_t::access_address](sl-rail-ble-state-t#access-address).
- Global [RAIL_BLE_State_t::channel](rail-ble-state-t#channel)  
  RAIL 2.x synonym of [sl_rail_ble_state_t::logical_channel](sl-rail-ble-state-t#logical-channel).
- Global [RAIL_BLE_State_t::crcInit](rail-ble-state-t#crc-init)  
  RAIL 2.x synonym of [sl_rail_ble_state_t::crc_init](sl-rail-ble-state-t#crc-init).
- Global [RAIL_BLE_State_t::disableWhitening](rail-ble-state-t#disable-whitening)  
  RAIL 2.x synonym of [sl_rail_ble_state_t::disable_whitening](sl-rail-ble-state-t#disable-whitening).
- Global [RAIL_BLE_State_t::whiteInit](rail-ble-state-t#white-init)  
  RAIL 2.x synonym of [sl_rail_ble_state_t::white_init](sl-rail-ble-state-t#white-init).
- Global [RAIL_BLE_Supports1Mbps](features#rail-ble-supports1-mbps)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps).
- Global [RAIL_BLE_Supports1MbpsNonViterbi](features#rail-ble-supports1-mbps-non-viterbi)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps).
- Global [RAIL_BLE_Supports1MbpsViterbi](features#rail-ble-supports1-mbps-viterbi)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps).
- Global [RAIL_BLE_Supports2Mbps](features#rail-ble-supports2-mbps)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps).
- Global [RAIL_BLE_Supports2MbpsNonViterbi](features#rail-ble-supports2-mbps-non-viterbi)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps).
- Global [RAIL_BLE_Supports2MbpsViterbi](features#rail-ble-supports2-mbps-viterbi)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps).
- Global [RAIL_BLE_SUPPORTS_1MBPS](features#rail-ble-supports-1-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_1_MBPS](features#sl-rail-ble-supports-1-mbps-1).
- Global [RAIL_BLE_SUPPORTS_1MBPS_NON_VITERBI](features#rail-ble-supports-1-mbps-non-viterbi)  
  This RAIL 2.x define has been replaced in RAIL 3 by [SL_RAIL_BLE_SUPPORTS_1_MBPS](features#sl-rail-ble-supports-1-mbps-1).
- Global [RAIL_BLE_SUPPORTS_1MBPS_VITERBI](features#rail-ble-supports-1-mbps-viterbi)  
  This RAIL 2.x define has been replaced in RAIL 3 by [SL_RAIL_BLE_SUPPORTS_1_MBPS](features#sl-rail-ble-supports-1-mbps-1).
- Global [RAIL_BLE_SUPPORTS_2MBPS](features#rail-ble-supports-2-mbps)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1).
- Global [RAIL_BLE_SUPPORTS_2MBPS_NON_VITERBI](features#rail-ble-supports-2-mbps-non-viterbi)  
  This RAIL 2.x define has been replaced in RAIL 3 by [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1).
- Global [RAIL_BLE_SUPPORTS_2MBPS_VITERBI](features#rail-ble-supports-2-mbps-viterbi)  
  This RAIL 2.x define has been replaced in RAIL 3 by [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1).
- Global [RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#rail-ble-supports-antenna-switching-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#sl-rail-ble-supports-antenna-switching-1).
- Global [RAIL_BLE_SUPPORTS_AOX](features#rail-ble-supports-aox)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_AOX](features#sl-rail-ble-supports-aox).
- Global [RAIL_BLE_SUPPORTS_CODED_PHY](features#rail-ble-supports-coded-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_CODED_PHY](features#sl-rail-ble-supports-coded-phy-1).
- Global [RAIL_BLE_SUPPORTS_CTE](features#rail-ble-supports-cte-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_CTE](features#sl-rail-ble-supports-cte-1).
- Global [RAIL_BLE_SUPPORTS_IQ_SAMPLING](features#rail-ble-supports-iq-sampling-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_IQ_SAMPLING](features#sl-rail-ble-supports-iq-sampling-1).
- Global [RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#rail-ble-supports-phy-switch-to-rx-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#sl-rail-ble-supports-phy-switch-to-rx-1).
- Global [RAIL_BLE_SUPPORTS_QUUPPA](features#rail-ble-supports-quuppa-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_QUUPPA](features#sl-rail-ble-supports-quuppa-1).
- Global [RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ble-supports-signal-identifier-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ble-supports-signal-identifier-1).
- Global [RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#rail-ble-supports-simulscan-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#sl-rail-ble-supports-simulscan-phy-1).
- Global [RAIL_BLE_SupportsAntennaSwitching](features#rail-ble-supports-antenna-switching)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_antenna_switching()](features#sl-rail-ble-supports-antenna-switching).
- Global [RAIL_BLE_SupportsCodedPhy](features#rail-ble-supports-coded-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_coded_phy()](features#sl-rail-ble-supports-coded-phy).
- Global [RAIL_BLE_SupportsCte](features#rail-ble-supports-cte)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_cte()](features#sl-rail-ble-supports-cte).
- Global [RAIL_BLE_SupportsIQSampling](features#rail-ble-supports-iq-sampling)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_iq_sampling()](features#sl-rail-ble-supports-iq-sampling).
- Global [RAIL_BLE_SupportsPhySwitchToRx](features#rail-ble-supports-phy-switch-to-rx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_phy_switch_to_rx()](features#sl-rail-ble-supports-phy-switch-to-rx).
- Global [RAIL_BLE_SupportsQuuppa](features#rail-ble-supports-quuppa)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_quuppa()](features#sl-rail-ble-supports-quuppa).
- Global [RAIL_BLE_SupportsSignalIdentifier](features#rail-ble-supports-signal-identifier)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_signal_identifier()](features#sl-rail-ble-supports-signal-identifier).
- Global [RAIL_BLE_SupportsSimulscanPhy](features#rail-ble-supports-simulscan-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ble_supports_simulscan_phy()](features#sl-rail-ble-supports-simulscan-phy).
- Class [RAIL_BLE_TxChannelHoppingConfig_t](rail-ble-tx-channel-hopping-config-t)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t](sl-rail-ble-tx-channel-hopping-config-t).
- Global [RAIL_BLE_TxChannelHoppingConfig_t::buffer](rail-ble-tx-channel-hopping-config-t#buffer)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::p_buffer](sl-rail-ble-tx-channel-hopping-config-t#p-buffer).
- Global [RAIL_BLE_TxChannelHoppingConfig_t::bufferLength](rail-ble-tx-channel-hopping-config-t#buffer-length)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::buffer_words](sl-rail-ble-tx-channel-hopping-config-t#buffer-words).
- Global [RAIL_BLE_TxChannelHoppingConfig_t::entries](rail-ble-tx-channel-hopping-config-t#entries)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::p_entries](sl-rail-ble-tx-channel-hopping-config-t#p-entries).
- Global [RAIL_BLE_TxChannelHoppingConfig_t::numberOfChannels](rail-ble-tx-channel-hopping-config-t#number-of-channels)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::number_of_channels](sl-rail-ble-tx-channel-hopping-config-t#number-of-channels).
- Global [RAIL_BLE_TxChannelHoppingConfig_t::reserved](rail-ble-tx-channel-hopping-config-t#reserved)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::reserved](sl-rail-ble-tx-channel-hopping-config-t#reserved).
- Class [RAIL_BLE_TxChannelHoppingConfigEntry_t](rail-ble-tx-channel-hopping-config-entry-t)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t](sl-rail-ble-tx-channel-hopping-config-entry-t).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::accessAddress](rail-ble-tx-channel-hopping-config-entry-t#access-address)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::access_address](sl-rail-ble-tx-channel-hopping-config-entry-t#access-address).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::crcInit](rail-ble-tx-channel-hopping-config-entry-t#crc-init)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::crc_init](sl-rail-ble-tx-channel-hopping-config-entry-t#crc-init).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::delay](rail-ble-tx-channel-hopping-config-entry-t#delay)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::delay_us](sl-rail-ble-tx-channel-hopping-config-entry-t#delay-us).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::disableWhitening](rail-ble-tx-channel-hopping-config-entry-t#disable-whitening)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::disable_whitening](sl-rail-ble-tx-channel-hopping-config-entry-t#disable-whitening).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::logicalChannel](rail-ble-tx-channel-hopping-config-entry-t#logical-channel)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::logical_channel](sl-rail-ble-tx-channel-hopping-config-entry-t#logical-channel).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::phy](rail-ble-tx-channel-hopping-config-entry-t#phy)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::phy](sl-rail-ble-tx-channel-hopping-config-entry-t#phy).
- Global [RAIL_BLE_TxChannelHoppingConfigEntry_t::railChannel](rail-ble-tx-channel-hopping-config-entry-t#rail-channel)  
  RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::rail_channel](sl-rail-ble-tx-channel-hopping-config-entry-t#rail-channel).
- Class [RAIL_BLE_TxRepeatConfig_t](rail-ble-tx-repeat-config-t)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t](sl-rail-ble-tx-repeat-config-t).
- Global [RAIL_BLE_TxRepeatConfig_t::channelHopping](rail-ble-tx-repeat-config-t#channel-hopping)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::channel_hopping](sl-rail-ble-tx-repeat-config-t#channel-hopping).
- Global [RAIL_BLE_TxRepeatConfig_t::delay](rail-ble-tx-repeat-config-t#delay)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::delay_us](sl-rail-ble-tx-repeat-config-t#delay-us).
- Global [RAIL_BLE_TxRepeatConfig_t::delayOrHop](rail-ble-tx-repeat-config-t#delay-or-hop)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::delay_or_hop](sl-rail-ble-tx-repeat-config-t#delay-or-hop).
- Global [RAIL_BLE_TxRepeatConfig_t::iterations](rail-ble-tx-repeat-config-t#iterations)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::iterations](sl-rail-ble-tx-repeat-config-t#iterations).
- Global [RAIL_BLE_TxRepeatConfig_t::repeatOptions](rail-ble-tx-repeat-config-t#repeat-options)  
  RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::repeat_options](sl-rail-ble-tx-repeat-config-t#repeat-options).
- Global [RAIL_CAL_ALL](calibration#rail-cal-all)  
  RAIL 2.x synonym of [SL_RAIL_CAL_ALL](calibration#sl-rail-cal-all).
- Global [RAIL_CAL_ALL_PENDING](calibration#rail-cal-all-pending)  
  RAIL 2.x synonym of [SL_RAIL_CAL_ALL_PENDING](calibration#sl-rail-cal-all-pending).
- Global [RAIL_CAL_COMPENSATE_HFXO](calibration#rail-cal-compensate-hfxo)  
  RAIL 2.x synonym of [SL_RAIL_CAL_COMPENSATE_HFXO](calibration#sl-rail-cal-compensate-hfxo).
- Global [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value)  
  RAIL 2.x synonym of [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value).
- Global [RAIL_CAL_OFDM_TX_IRCAL](calibration#rail-cal-ofdm-tx-ircal)  
  RAIL 2.x synonym of [SL_RAIL_CAL_OFDM_TX_IR_CAL](calibration#sl-rail-cal-ofdm-tx-ir-cal).
- Global [RAIL_CAL_OFFLINE](calibration#rail-cal-offline)  
  RAIL 2.x synonym of [SL_RAIL_CAL_OFFLINE](calibration#sl-rail-cal-offline).
- Global [RAIL_CAL_ONETIME](calibration#rail-cal-onetime)  
  RAIL 2.x synonym of [SL_RAIL_CAL_ONETIME](calibration#sl-rail-cal-onetime).
- Global [RAIL_CAL_ONETIME_IRCAL](calibration#rail-cal-onetime-ircal)  
  RAIL 2.x synonym of [SL_RAIL_CAL_ONETIME_IR_CAL](calibration#sl-rail-cal-onetime-ir-cal).
- Global [RAIL_CAL_PERF](calibration#rail-cal-perf)  
  RAIL 2.x synonym of [SL_RAIL_CAL_PERF](calibration#sl-rail-cal-perf).
- Global [RAIL_CAL_RX_IRCAL](calibration#rail-cal-rx-ircal)  
  RAIL 2.x synonym of [SL_RAIL_CAL_RX_IR_CAL](calibration#sl-rail-cal-rx-ir-cal).
- Global [RAIL_CAL_TEMP](calibration#rail-cal-temp)  
  RAIL 2.x synonym of [SL_RAIL_CAL_TEMP](calibration#sl-rail-cal-temp).
- Global [RAIL_CAL_TEMP_HFXO](calibration#rail-cal-temp-hfxo)  
  RAIL 2.x synonym of [SL_RAIL_CAL_TEMP_HFXO](calibration#sl-rail-cal-temp-hfxo).
- Global [RAIL_CAL_TEMP_VCO](calibration#rail-cal-temp-vco)  
  RAIL 2.x synonym of [SL_RAIL_CAL_TEMP_VCO](calibration#sl-rail-cal-temp-vco).
- Global [RAIL_Calibrate](calibration#rail-calibrate)  (RAIL_Handle_t railHandle, RAIL_CalValues_t *calValues, RAIL_CalMask_t calForce)  
  RAIL 2.x synonym of [sl_rail_calibrate()](calibration#sl-rail-calibrate).
- Global [RAIL_CalibrateHFXO](calibration#rail-calibrate-hfxo)  (RAIL_Handle_t railHandle, int8_t *crystalPPMError)  
  RAIL 2.x synonym of [sl_rail_calibrate_hfxo()](calibration#sl-rail-calibrate-hfxo).
- Global [RAIL_CalibrateIr](calibration#rail-calibrate-ir)  (RAIL_Handle_t railHandle, uint32_t *imageRejection)  
  This previously-deprecated RAIL 2.x function has been replaced by [sl_rail_calibrate_ir](calibration#sl-rail-calibrate-ir) with different parameters.
- Global [RAIL_CalibrateIrAlt](calibration#rail-calibrate-ir-alt)  (RAIL_Handle_t railHandle, [RAIL_IrCalValues_t](rail-ir-cal-values-t) *imageRejection, RAIL_AntennaSel_t rfPath)  
  RAIL 2.x synonym of [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir).
- Global [RAIL_CalibrateTemp](calibration#rail-calibrate-temp)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_calibrate_temp()](calibration#sl-rail-calibrate-temp).
- Global [RAIL_CalMask_t](calibration#rail-cal-mask-t)  
  RAIL 2.x synonym of [sl_rail_cal_mask_t](calibration#sl-rail-cal-mask-t).
- Global [RAIL_CalValues_t](calibration#rail-cal-values-t)  
  RAIL 2.x synonym of [sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t).
- Global [RAIL_CALVALUES_UNINIT](calibration#rail-calvalues-uninit)  
  RAIL 2.x synonym of [SL_RAIL_CAL_VALUES_UNINIT](calibration#sl-rail-cal-values-uninit).
- Global [RAIL_CancelAutoAck](auto-ack#rail-cancel-auto-ack)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_cancel_auto_ack()](auto-ack#sl-rail-cancel-auto-ack).
- Global [RAIL_CancelMultiTimer](system-timing#rail-cancel-multi-timer)  ([RAIL_MultiTimer_t](rail-multi-timer-t) *tmr)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_cancel_multi_timer()](system-timing#sl-rail-cancel-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_CancelTimer](system-timing#rail-cancel-timer)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_cancel_timer()](system-timing#sl-rail-cancel-timer).
- Global [RAIL_CH_TYPE_CONC_BASE](radio-configuration#rail-ch-type-conc-base)  
  RAIL 2.x synonym of [SL_RAIL_CH_TYPE_CONC_BASE](radio-configuration#sl-rail-ch-type-conc-base).
- Global [RAIL_CH_TYPE_CONC_VIRTUAL](radio-configuration#rail-ch-type-conc-virtual)  
  RAIL 2.x synonym of [SL_RAIL_CH_TYPE_CONC_VIRTUAL](radio-configuration#sl-rail-ch-type-conc-virtual).
- Global [RAIL_CH_TYPE_NORMAL](radio-configuration#rail-ch-type-normal)  
  RAIL 2.x synonym of [SL_RAIL_CH_TYPE_NORMAL](radio-configuration#sl-rail-ch-type-normal).
- Global [RAIL_ChangedDcdc](retiming#rail-changed-dcdc)  (void)  
  RAIL 2.x synonym of [sl_rail_changed_dcdc()](retiming#sl-rail-changed-dcdc).
- Global [RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL](rx-channel-hopping-sixx3-xx#rail-channel-hopping-buffer-size-per-channel)  
  RAIL 2.x. synonym of [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL](rx-channel-hopping-sixx3-xx#sl-rail-channel-hopping-buffer-words-per-channel).  
  RAIL 2.x synonym of [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL](rx-channel-hopping-sixx3-xx#sl-rail-channel-hopping-buffer-words-per-channel).
- Global [RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL_WORST_CASE](tx-channel-hopping#rail-channel-hopping-buffer-size-per-channel-worst-case)  
  RAIL 2.x synonym of [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL_WORST_CASE](tx-channel-hopping#sl-rail-channel-hopping-buffer-words-per-channel-worst-case).
- Global [RAIL_CHANNEL_HOPPING_INVALID_INDEX](rx-channel-hopping#rail-channel-hopping-invalid-index)  
  RAIL 2.x synonym of [SL_RAIL_CHANNEL_HOPPING_INVALID_INDEX](rx-channel-hopping#sl-rail-channel-hopping-invalid-index).
- Class [RAIL_ChannelConfig_t](rail-channel-config-t)  
  RAIL 2.x synonym of [sl_rail_channel_config_t](sl-rail-channel-config-t).
- Global [RAIL_ChannelConfig_t::configs](rail-channel-config-t#configs)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::p_entries](sl-rail-channel-config-t#p-entries).
- Global [RAIL_ChannelConfig_t::length](rail-channel-config-t#length)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::number_of_entries](sl-rail-channel-config-t#number-of-entries).
- Global [RAIL_ChannelConfig_t::phyConfigBase](rail-channel-config-t#phy-config-base)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::phy_config_base](sl-rail-channel-config-t#phy-config-base).
- Global [RAIL_ChannelConfig_t::phyConfigDeltaSubtract](rail-channel-config-t#phy-config-delta-subtract)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::phy_config_delta_subtract](sl-rail-channel-config-t#phy-config-delta-subtract).
- Global [RAIL_ChannelConfig_t::signature](rail-channel-config-t#signature)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::signature](sl-rail-channel-config-t#signature).
- Global [RAIL_ChannelConfig_t::xtalFrequencyHz](rail-channel-config-t#xtal-frequency-hz)  
  RAIL 2.x synonym of [sl_rail_channel_config_t::xtal_frequency_hz](sl-rail-channel-config-t#xtal-frequency-hz).
- Class [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t).
- Global [RAIL_ChannelConfigEntry_t::alternatePhy](rail-channel-config-entry-t#alternate-phy)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_alternate_phy](sl-rail-channel-config-entry-t#p-alternate-phy).
- Global [RAIL_ChannelConfigEntry_t::attr](rail-channel-config-entry-t#attr)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_attr](sl-rail-channel-config-entry-t#p-attr).
- Global [RAIL_ChannelConfigEntry_t::baseFrequency](rail-channel-config-entry-t#base-frequency)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::base_frequency_hz](sl-rail-channel-config-entry-t#base-frequency-hz).
- Global [RAIL_ChannelConfigEntry_t::channelNumberEnd](rail-channel-config-entry-t#channel-number-end)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_number_end](sl-rail-channel-config-entry-t#channel-number-end).
- Global [RAIL_ChannelConfigEntry_t::channelNumberStart](rail-channel-config-entry-t#channel-number-start)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_number_start](sl-rail-channel-config-entry-t#channel-number-start).
- Global [RAIL_ChannelConfigEntry_t::channelSpacing](rail-channel-config-entry-t#channel-spacing)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_spacing_hz](sl-rail-channel-config-entry-t#channel-spacing-hz).
- Global [RAIL_ChannelConfigEntry_t::entryType](rail-channel-config-entry-t#entry-type)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::entry_type](sl-rail-channel-config-entry-t#entry-type).
- Global [RAIL_ChannelConfigEntry_t::maxPower](rail-channel-config-entry-t#max-power)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::max_power_ddbm](sl-rail-channel-config-entry-t#max-power-ddbm).
- Global [RAIL_ChannelConfigEntry_t::phyConfigDeltaAdd](rail-channel-config-entry-t#phy-config-delta-add)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::phy_config_delta_add](sl-rail-channel-config-entry-t#phy-config-delta-add).
- Global [RAIL_ChannelConfigEntry_t::physicalChannelOffset](rail-channel-config-entry-t#physical-channel-offset)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::physical_channel_offset](sl-rail-channel-config-entry-t#physical-channel-offset).
- Global [RAIL_ChannelConfigEntry_t::reserved](rail-channel-config-entry-t#reserved)  [3]  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::reserved](sl-rail-channel-config-entry-t#reserved).
- Global [RAIL_ChannelConfigEntry_t::stackInfo](rail-channel-config-entry-t#stack-info)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_stack_info](sl-rail-channel-config-entry-t#p-stack-info).
- Class [RAIL_ChannelConfigEntryAttr_t](rail-channel-config-entry-attr)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr).  
  RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr).
- Class [RAIL_ChannelConfigEntryAttr_t](rail-channel-config-entry-attr-t)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_attr_t](sl-rail-channel-config-entry-attr-t).
- Global [RAIL_ChannelConfigEntryAttr_t::calValues](rail-channel-config-entry-attr#cal-values)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values).  
  RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values).
- Global [RAIL_ChannelConfigEntryType_t](radio-configuration#rail-channel-config-entry-type-t)  
  RAIL 2.x synonym of [sl_rail_channel_config_entry_type_t](radio-configuration#sl-rail-channel-config-entry-type-t).
- Class [RAIL_ChannelMetadata_t](rail-channel-metadata-t)  
  RAIL 2.x synonym of [sl_rail_channel_metadata_t](sl-rail-channel-metadata-t).
- Global [RAIL_ChannelMetadata_t::channel](rail-channel-metadata-t#channel)  
  RAIL 2.x synonym of [sl_rail_channel_metadata_t::channel](sl-rail-channel-metadata-t#channel).
- Global [RAIL_ChannelMetadata_t::frequency](rail-channel-metadata-t#frequency)  
  RAIL 2.x synonym of [sl_rail_channel_metadata_t::frequency_hz](sl-rail-channel-metadata-t#frequency-hz).
- Global [RAIL_ChannelMetadata_t::reserved](rail-channel-metadata-t#reserved)  
  RAIL 2.x synonym of [sl_rail_channel_metadata_t::reserved](sl-rail-channel-metadata-t#reserved).
- Global [RAIL_CHIP_TEMP_COOLDOWN_DEFAULT](thermal-protection#rail-chip-temp-cooldown-default)  
  RAIL 2.x synonym of [SL_RAIL_CHIP_TEMP_COOLDOWN_DEFAULT](thermal-protection#sl-rail-chip-temp-cooldown-default).
- Global [RAIL_CHIP_TEMP_MEASURE_COUNT](thermal-protection#rail-chip-temp-measure-count)  
  RAIL 2.x synonym of [SL_RAIL_CHIP_TEMP_MEASURE_COUNT](thermal-protection#sl-rail-chip-temp-measure-count).
- Global [RAIL_CHIP_TEMP_THRESHOLD_MAX](thermal-protection#rail-chip-temp-threshold-max)  
  RAIL 2.x synonym of [SL_RAIL_CHIP_TEMP_THRESHOLD_MAX](thermal-protection#sl-rail-chip-temp-threshold-max).
- Class [RAIL_ChipTempConfig_t](rail-chip-temp-config-t)  
  RAIL 2.x synonym of [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t).
- Global [RAIL_ChipTempConfig_t::coolDownK](rail-chip-temp-config-t#cool-down-k)  
  RAIL 2.x synonym of [sl_rail_chip_temp_config_t::cool_down_kelvin](sl-rail-chip-temp-config-t#cool-down-kelvin).
- Global [RAIL_ChipTempConfig_t::enable](rail-chip-temp-config-t#enable)  
  RAIL 2.x synonym of [sl_rail_chip_temp_config_t::enable](sl-rail-chip-temp-config-t#enable).
- Global [RAIL_ChipTempConfig_t::thresholdK](rail-chip-temp-config-t#threshold-k)  
  RAIL 2.x synonym of [sl_rail_chip_temp_config_t::threshold_kelvin](sl-rail-chip-temp-config-t#threshold-kelvin).
- Class [RAIL_ChipTempMetrics_t](rail-chip-temp-metrics-t)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t](sl-rail-chip-temp-metrics-t).
- Global [RAIL_ChipTempMetrics_t::maxTempK](rail-chip-temp-metrics-t#max-temp-k)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::max_temp_kelvin](sl-rail-chip-temp-metrics-t#max-temp-kelvin).
- Global [RAIL_ChipTempMetrics_t::minTempK](rail-chip-temp-metrics-t#min-temp-k)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::min_temp_kelvin](sl-rail-chip-temp-metrics-t#min-temp-kelvin).
- Global [RAIL_ChipTempMetrics_t::reservedChipTemp](rail-chip-temp-metrics-t#reserved-chip-temp)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::reserved](sl-rail-chip-temp-metrics-t#reserved).
- Global [RAIL_ChipTempMetrics_t::resetPending](rail-chip-temp-metrics-t#reset-pending)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::reset_pending](sl-rail-chip-temp-metrics-t#reset-pending).
- Global [RAIL_ChipTempMetrics_t::tempK](rail-chip-temp-metrics-t#temp-k)  
  RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::temp_kelvin](sl-rail-chip-temp-metrics-t#temp-kelvin).
- Global [RAIL_CompensateHFXO](external-thermistor#rail-compensate-hfxo)  (RAIL_Handle_t railHandle, int8_t crystalPPMError)  
  RAIL 2.x synonym of [sl_rail_compensate_hfxo()](external-thermistor#sl-rail-compensate-hfxo).
- Global [RAIL_ComputeHFXOPPMError](external-thermistor#rail-compute-hfxoppm-error)  (RAIL_Handle_t railHandle, int16_t crystalTemperatureC, int8_t *crystalPPMError)  
  RAIL 2.x synonym of [sl_railcb_compute_hfxo_error_ppm()](external-thermistor#sl-railcb-compute-hfxo-error-ppm).
- Class [RAIL_Config_t](rail-config-t)  
  This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_config_t](sl-rail-config-t).
- Global [RAIL_Config_t::buffer](rail-config-t#buffer)  
  Refer to [sl_rail_config_t::opaque_value](sl-rail-config-t#opaque-value).
- Global [RAIL_Config_t::eventsCallback](rail-config-t#events-callback)  )(RAIL_Handle_t railHandle, RAIL_Events_t events)  
  Refer to [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback).
- Global [RAIL_Config_t::protocol](rail-config-t#protocol)  
  Refer to [sl_rail_config_t::p_opaque_handle_0](sl-rail-config-t#p-opaque-handle-0).
- Global [RAIL_Config_t::scheduler](rail-config-t#scheduler)  
  Refer to [sl_rail_config_t::p_opaque_handle_1](sl-rail-config-t#p-opaque-handle-1).
- Global [RAIL_ConfigAddressFilter](address-filtering#rail-config-address-filter)  (RAIL_Handle_t railHandle, const [RAIL_AddrConfig_t](rail-addr-config-t) *addrConfig)  
  RAIL 2.x synonym of [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter).
- Global [RAIL_ConfigAntenna](antenna-control#rail-config-antenna)  (RAIL_Handle_t railHandle, const [RAIL_AntennaConfig_t](rail-antenna-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_antenna()](antenna-control#sl-rail-config-antenna).
- Global [RAIL_ConfigAutoAck](auto-ack#rail-config-auto-ack)  (RAIL_Handle_t railHandle, const [RAIL_AutoAckConfig_t](rail-auto-ack-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack).
- Global [RAIL_ConfigCal](calibration#rail-config-cal)  (RAIL_Handle_t railHandle, RAIL_CalMask_t calEnable)  
  RAIL 2.x synonym of [sl_rail_config_cal()](calibration#sl-rail-config-cal).
- Global [RAIL_ConfigChannels](radio-configuration#rail-config-channels)  (RAIL_Handle_t railHandle, const [RAIL_ChannelConfig_t](rail-channel-config-t) *config, RAIL_RadioConfigChangedCallback_t cb)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) which does not implicitly prepare any channel in the configuration. Use [sl_rail_get_first_channel()](radio-configuration#sl-rail-get-first-channel) and [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel) to achieve equivalent functionality.
- Global [RAIL_ConfigChannelsAlt](radio-configuration#rail-config-channels-alt)  (RAIL_Handle_t railHandle, const [RAIL_ChannelConfig_t](rail-channel-config-t) *config, RAIL_RadioConfigChangedCallback_t cb)  
  RAIL 2.x synonym of [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels).
- Global [RAIL_ConfigData](data-management#rail-config-data)  (RAIL_Handle_t railHandle, const [RAIL_DataConfig_t](rail-data-config-t) *dataConfig)  
  This RAIL 2.x function has been replaced in RAIL 3 by separate [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data) and [sl_rail_config_tx_data()](data-management#sl-rail-config-tx-data) functions.
- Global [RAIL_ConfigDirectMode](diagnostic#rail-config-direct-mode)  (RAIL_Handle_t railHandle, const [RAIL_DirectModeConfig_t](rail-direct-mode-config-t) *directModeConfig)  
  RAIL 2.x synonym of [sl_rail_config_direct_mode()](diagnostic#sl-rail-config-direct-mode).
- Global [RAIL_ConfigEvents](events#rail-config-events)  (RAIL_Handle_t railHandle, RAIL_Events_t mask, RAIL_Events_t events)  
  RAIL 2.x synonym of [sl_rail_config_events()](events#sl-rail-config-events).
- Global [RAIL_ConfigHFXOCompensation](external-thermistor#rail-config-hfxo-compensation)  (RAIL_Handle_t railHandle, const [RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t) *pHfxoCompensationConfig)  
  RAIL 2.x synonym of [sl_rail_config_hfxo_compensation()](external-thermistor#sl-rail-config-hfxo-compensation).
- Global [RAIL_ConfigHFXOThermistor](external-thermistor#rail-config-hfxo-thermistor)  (RAIL_Handle_t railHandle, const [RAIL_HFXOThermistorConfig_t](rail-hfxo-thermistor-config-t) *pHfxoThermistorConfig)  
  RAIL 2.x synonym of [sl_rail_config_hfxo_thermistor()](external-thermistor#sl-rail-config-hfxo-thermistor).
- Global [RAIL_ConfigMultiTimer](system-timing#rail-config-multi-timer)  (bool enable)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_multi_timer()](system-timing#sl-rail-config-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_ConfigPaAutoEntry](pa#rail-config-pa-auto-entry)  (RAIL_Handle_t railHandle, const [RAIL_PaAutoModeConfigEntry_t](rail-pa-auto-mode-config-entry-t) *paAutoModeEntry)  
  This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_ConfigPti](pti#rail-config-pti)  (RAIL_Handle_t railHandle, const [RAIL_PtiConfig_t](rail-pti-config-t) *ptiConfig)  
  RAIL 2.x synonym of [sl_rail_config_pti()](pti#sl-rail-config-pti).
- Global [RAIL_ConfigRetimeOptions](retiming#rail-config-retime-options)  (RAIL_Handle_t railHandle, RAIL_RetimeOptions_t mask, RAIL_RetimeOptions_t options)  
  RAIL 2.x synonym of [sl_rail_config_retime_options()](retiming#sl-rail-config-retime-options).
- Global [RAIL_ConfigRfSenseSelectiveOokWakeupPhy](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_config_rf_sense_selective_ook_wakeup_phy()](rf-sense#sl-rail-config-rf-sense-selective-ook-wakeup-phy).
- Global [RAIL_ConfigRxChannelHopping](rx-channel-hopping#rail-config-rx-channel-hopping)  (RAIL_Handle_t railHandle, [RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping).
- Global [RAIL_ConfigRxDutyCycle](rx-channel-hopping#rail-config-rx-duty-cycle)  (RAIL_Handle_t railHandle, const [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_rx_duty_cycle()](rx-channel-hopping#sl-rail-config-rx-duty-cycle).
- Global [RAIL_ConfigRxOptions](receive#rail-config-rx-options)  (RAIL_Handle_t railHandle, RAIL_RxOptions_t mask, RAIL_RxOptions_t options)  
  RAIL 2.x synonym of [sl_rail_config_rx_options()](receive#sl-rail-config-rx-options).
- Global [RAIL_ConfigSleep](sleep#rail-config-sleep)  (RAIL_Handle_t railHandle, RAIL_SleepConfig_t sleepConfig)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) with a different parameter type.
- Global [RAIL_ConfigSleepAlt](sleep#rail-config-sleep-alt)  (RAIL_Handle_t railHandle, const [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) *syncConfig)  
  RAIL 2.x synonym of [sl_rail_config_sleep()](sleep#sl-rail-config-sleep).
- Global [RAIL_ConfigSyncWords](radio-configuration#rail-config-sync-words)  (RAIL_Handle_t railHandle, const [RAIL_SyncWordConfig_t](rail-sync-word-config-t) *syncWordConfig)  
  RAIL 2.x synonym of [sl_rail_config_sync_words()](radio-configuration#sl-rail-config-sync-words).
- Global [RAIL_ConfigThermalProtection](thermal-protection#rail-config-thermal-protection)  (RAIL_Handle_t genericRailHandle, const [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) *chipTempConfig)  
  RAIL 2.x synonym of [sl_rail_config_thermal_protection()](thermal-protection#sl-rail-config-thermal-protection).
- Global [RAIL_ConfigTxPower](pa#rail-config-tx-power)  (RAIL_Handle_t railHandle, const [RAIL_TxPowerConfig_t](rail-tx-power-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_tx_power()](pa#sl-rail-config-tx-power).
- Global [RAIL_ConfigVdet](vdet#rail-config-vdet)  (RAIL_Handle_t genericRailHandle, const [RAIL_VdetConfig_t](rail-vdet-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_config_vdet()](vdet#sl-rail-config-vdet).
- Global [RAIL_ConfigVerification](diagnostic#rail-config-verification)  (RAIL_Handle_t railHandle, [RAIL_VerifyConfig_t](rail-verify-config-t) *configVerify, RAIL_RadioConfig_t radioConfig, RAIL_VerifyCallbackPtr_t cb)  
  This RAIL 2.x function has been eliminated in RAIL 3. This functionality is no longer supported.
- Global [RAIL_ConvertDbmToPowerSettingEntry](pa#rail-convert-dbm-to-power-setting-entry)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t power, [RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t) *pPowerSettingInfo)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) with different parameters.
- Global [RAIL_ConvertDbmToRaw](pa#rail-convert-dbm-to-raw)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t power)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) with different parameters.
- Global [RAIL_ConvertLqi](receive#rail-convert-lqi)  (RAIL_Handle_t railHandle, RAIL_ConvertLqiCallback_t cb)  
  RAIL 2.x synonym of [sl_rail_convert_lqi()](receive#sl-rail-convert-lqi).
- Global [RAIL_ConvertLqiCallback_t](receive#rail-convert-lqi-callback-t)  )(uint8_t lqi, int8_t rssi)  
  RAIL 2.x synonym of [sl_rail_convert_lqi_callback_t()](receive#sl-rail-convert-lqi-callback-t).
- Global [RAIL_ConvertRawToDbm](pa#rail-convert-raw-to-dbm)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPowerLevel_t powerLevel)  
  This RAIL 2.x function has been eliminated in RAIL 3 with the use of PA power tables.
- Global [RAIL_ConvertThermistorImpedance](external-thermistor#rail-convert-thermistor-impedance)  (RAIL_Handle_t railHandle, uint32_t thermistorImpedance, int16_t *thermistorTemperatureC)  
  RAIL 2.x synonym of [sl_railcb_convert_thermistor_impedance()](external-thermistor#sl-railcb-convert-thermistor-impedance).
- Global [RAIL_CopyDeviceInfo](general#rail-copy-device-info)  (RAIL_Handle_t genericRailHandle)  
  RAIL 2.x synonym of [sl_rail_copy_device_info()](general#sl-rail-copy-device-info).
- Global [RAIL_CopyRxPacket](packet-information#rail-copy-rx-packet)  (uint8_t *pDest, const [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *pPacketInfo)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_copy_rx_packet()](packet-information#sl-rail-copy-rx-packet) with an additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_CSMA_CONFIG_802_15_4_2003_2p4_GHz_OQPSK_CSMA](transmit#rail-csma-config-802-15-4-2003-2p4-g-hz-oqpsk-csma)  
  RAIL 2.x synonym of [SL_RAIL_CSMA_CONFIG_802_15_4_2003_2P4_GHZ_OQPSK_CSMA](transmit#sl-rail-csma-config-802-15-4-2003-2-p4-ghz-oqpsk-csma).
- Global [RAIL_CSMA_CONFIG_SINGLE_CCA](transmit#rail-csma-config-single-cca)  
  RAIL 2.x synonym of [SL_RAIL_CSMA_CONFIG_SINGLE_CCA](transmit#sl-rail-csma-config-single-cca).
- Class [RAIL_CsmaConfig_t](rail-csma-config-t)  
  RAIL 2.x synonym of [sl_rail_csma_config_t](sl-rail-csma-config-t).
- Global [RAIL_CsmaConfig_t::ccaBackoff](rail-csma-config-t#cca-backoff)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us).
- Global [RAIL_CsmaConfig_t::ccaDuration](rail-csma-config-t#cca-duration)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::cca_duration_us](sl-rail-csma-config-t#cca-duration-us).
- Global [RAIL_CsmaConfig_t::ccaThreshold](rail-csma-config-t#cca-threshold)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::cca_threshold_dbm](sl-rail-csma-config-t#cca-threshold-dbm).
- Global [RAIL_CsmaConfig_t::csmaMaxBoExp](rail-csma-config-t#csma-max-bo-exp)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::csma_max_bo_exp](sl-rail-csma-config-t#csma-max-bo-exp).
- Global [RAIL_CsmaConfig_t::csmaMinBoExp](rail-csma-config-t#csma-min-bo-exp)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp).
- Global [RAIL_CsmaConfig_t::csmaTimeout](rail-csma-config-t#csma-timeout)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::csma_timeout_us](sl-rail-csma-config-t#csma-timeout-us).
- Global [RAIL_CsmaConfig_t::csmaTries](rail-csma-config-t#csma-tries)  
  RAIL 2.x synonym of [sl_rail_csma_config_t::csma_tries](sl-rail-csma-config-t#csma-tries).
- Global [RAIL_DATA_METHOD_COUNT](data-management#rail-data-method-count)  
  RAIL 2.x synonym of [SL_RAIL_DATA_METHOD_COUNT](data-management#sl-rail-data-method-count).
- Class [RAIL_DataConfig_t](rail-data-config-t)  
  This RAIL 2.x structure has been split in RAIL 3 into [sl_rail_rx_data_config_t](sl-rail-rx-data-config-t) and [sl_rail_tx_data_config_t](sl-rail-tx-data-config-t).
- Global [RAIL_DataConfig_t::rxMethod](rail-data-config-t#rx-method)  
  Use [sl_rail_rx_data_config_t::rx_method](sl-rail-rx-data-config-t#rx-method).
- Global [RAIL_DataConfig_t::rxSource](rail-data-config-t#rx-source)  
  Use [sl_rail_rx_data_config_t::rx_source](sl-rail-rx-data-config-t#rx-source).
- Global [RAIL_DataConfig_t::txMethod](rail-data-config-t#tx-method)  
  Use [sl_rail_tx_data_config_t::tx_method](sl-rail-tx-data-config-t#tx-method).
- Global [RAIL_DataConfig_t::txSource](rail-data-config-t#tx-source)  
  Use [sl_rail_tx_data_config_t::tx_source](sl-rail-tx-data-config-t#tx-source).
- Global [RAIL_DataMethod_t](data-management#rail-data-method-t)  
  RAIL 2.x synonym of [sl_rail_data_method_t](data-management#sl-rail-data-method-t).
- Global [RAIL_DeinitPowerManager](sleep#rail-deinit-power-manager)  (void)  
  RAIL 2.x synonym of [sl_rail_deinit_power_manager()](sleep#sl-rail-deinit-power-manager).
- Global [RAIL_DelayUs](system-timing#rail-delay-us)  (RAIL_Time_t microseconds)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_delay_us()](system-timing#sl-rail-delay-us) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Class [RAIL_DirectModeConfig_t](rail-direct-mode-config-t)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t](sl-rail-direct-mode-config-t).
- Global [RAIL_DirectModeConfig_t::dclkLoc](rail-direct-mode-config-t#dclk-loc)  
  No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_1](sl-rail-direct-mode-config-t#reserved-1).
- Global [RAIL_DirectModeConfig_t::dclkPin](rail-direct-mode-config-t#dclk-pin)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dclk_pin](sl-rail-direct-mode-config-t#dclk-pin).
- Global [RAIL_DirectModeConfig_t::dclkPort](rail-direct-mode-config-t#dclk-port)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dclk_port](sl-rail-direct-mode-config-t#dclk-port).
- Global [RAIL_DirectModeConfig_t::dinLoc](rail-direct-mode-config-t#din-loc)  
  No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_2](sl-rail-direct-mode-config-t#reserved-2).
- Global [RAIL_DirectModeConfig_t::dinPin](rail-direct-mode-config-t#din-pin)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::din_pin](sl-rail-direct-mode-config-t#din-pin).
- Global [RAIL_DirectModeConfig_t::dinPort](rail-direct-mode-config-t#din-port)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::din_port](sl-rail-direct-mode-config-t#din-port).
- Global [RAIL_DirectModeConfig_t::doutLoc](rail-direct-mode-config-t#dout-loc)  
  No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_0](sl-rail-direct-mode-config-t#reserved-0).
- Global [RAIL_DirectModeConfig_t::doutPin](rail-direct-mode-config-t#dout-pin)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dout_pin](sl-rail-direct-mode-config-t#dout-pin).
- Global [RAIL_DirectModeConfig_t::doutPort](rail-direct-mode-config-t#dout-port)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dout_port](sl-rail-direct-mode-config-t#dout-port).
- Global [RAIL_DirectModeConfig_t::syncRx](rail-direct-mode-config-t#sync-rx)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::sync_rx](sl-rail-direct-mode-config-t#sync-rx).
- Global [RAIL_DirectModeConfig_t::syncTx](rail-direct-mode-config-t#sync-tx)  
  RAIL 2.x synonym of [sl_rail_direct_mode_config_t::sync_tx](sl-rail-direct-mode-config-t#sync-tx).
- Global [RAIL_DMA_INVALID](general#rail-dma-invalid)  
  RAIL 2.x synonym of [SL_RAIL_DMA_INVALID](general#sl-rail-dma-invalid).
- Global [RAIL_EFR32_HANDLE](general#rail-efr32-handle)  
  RAIL 2.x synonym of [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle).
- Global [RAIL_EnableAddressFilter](address-filtering#rail-enable-address-filter)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_address_filter()](address-filtering#sl-rail-enable-address-filter).
- Global [RAIL_EnableAddressFilterAddress](address-filtering#rail-enable-address-filter-address)  (RAIL_Handle_t railHandle, bool enable, uint8_t field, uint8_t index)  
  RAIL 2.x synonym of [sl_rail_enable_address_filter_address()](address-filtering#sl-rail-enable-address-filter-address).
- Global [RAIL_EnableCacheSynthCal](state-transitions#rail-enable-cache-synth-cal)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_cache_synth_cal()](state-transitions#sl-rail-enable-cache-synth-cal).
- Global [RAIL_EnableDirectMode](diagnostic#rail-enable-direct-mode)  (RAIL_Handle_t railHandle, bool enable)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode) with different parameters.
- Global [RAIL_EnableDirectModeAlt](diagnostic#rail-enable-direct-mode-alt)  (RAIL_Handle_t railHandle, bool enableDirectTx, bool enableDirectRx)  
  RAIL 2.x synonym of [sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode).
- Global [RAIL_EnablePaAutoMode](pa#rail-enable-pa-auto-mode)  (RAIL_Handle_t railHandle, bool enable)  
  This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_EnablePaCal](calibration#rail-enable-pa-cal)  (bool enable)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_enable_pa_cal()](calibration#sl-rail-enable-pa-cal) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_EnablePrsLnaBypass](receive#rail-enable-prs-lna-bypass)  (RAIL_Handle_t railHandle, bool enable, const [RAIL_PrsLnaBypassConfig_t](rail-prs-lna-bypass-config-t) *pPrsLnaBypassConfig)  
  RAIL 2.x synonym of [sl_rail_enable_prs_lna_bypass()](receive#sl-rail-enable-prs-lna-bypass).
- Global [RAIL_EnablePti](pti#rail-enable-pti)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_pti()](pti#sl-rail-enable-pti).
- Global [RAIL_EnableRxChannelHopping](rx-channel-hopping#rail-enable-rx-channel-hopping)  (RAIL_Handle_t railHandle, bool enable, bool reset)  
  RAIL 2.x synonym of [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping).
- Global [RAIL_EnableRxDutyCycle](rx-channel-hopping#rail-enable-rx-duty-cycle)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_rx_duty_cycle()](rx-channel-hopping#sl-rail-enable-rx-duty-cycle).
- Global [RAIL_EnableTxHoldOff](transmit#rail-enable-tx-hold-off)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_tx_hold_off()](transmit#sl-rail-enable-tx-hold-off).
- Global [RAIL_EnableVdet](vdet#rail-enable-vdet)  (RAIL_Handle_t genericRailHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_enable_vdet()](vdet#sl-rail-enable-vdet).
- Global [RAIL_ENUM](rail-types-h#rail-enum)  (name)  
  RAIL 2.x equivalent of [SLI_RAIL_ENUM()](sl-rail-types-h#sli-rail-enum).
- Global [RAIL_ENUM_GENERIC](rail-types-h#rail-enum-generic)  (name, type)  
  RAIL 2.x equivalent of [SLI_RAIL_ENUM_GENERIC()](sl-rail-types-h#sli-rail-enum-generic).
- Global [RAIL_EVENT_CAL_NEEDED](events#rail-event-cal-needed)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed).
- Global [RAIL_EVENT_CAL_NEEDED_SHIFT](events#rail-event-cal-needed-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CAL_NEEDED_SHIFT](events#sl-rail-event-cal-needed-shift).
- Global [RAIL_EVENT_CONFIG_SCHEDULED](events#rail-event-config-scheduled)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled).
- Global [RAIL_EVENT_CONFIG_SCHEDULED_SHIFT](events#rail-event-config-scheduled-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CONFIG_SCHEDULED_SHIFT](events#sl-rail-event-config-scheduled-shift).
- Global [RAIL_EVENT_CONFIG_UNSCHEDULED](events#rail-event-config-unscheduled)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled).
- Global [RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT](events#rail-event-config-unscheduled-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT](events#sl-rail-event-config-unscheduled-shift).
- Global [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold).
- Global [RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT](events#rail-event-detect-rssi-threshold-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT](events#sl-rail-event-detect-rssi-threshold-shift).
- Global [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command).
- Global [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT](events#rail-event-ieee802154-data-request-command-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT](events#sl-rail-event-ieee802154-data-request-command-shift).
- Global [RAIL_EVENT_IEEE802154_MODESWITCH_END](events#rail-event-ieee802154-modeswitch-end)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END](events#sl-rail-event-ieee802154-mode-switch-end).
- Global [RAIL_EVENT_IEEE802154_MODESWITCH_END_SHIFT](events#rail-event-ieee802154-modeswitch-end-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END_SHIFT](events#sl-rail-event-ieee802154-mode-switch-end-shift).
- Global [RAIL_EVENT_IEEE802154_MODESWITCH_START](events#rail-event-ieee802154-modeswitch-start)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START](events#sl-rail-event-ieee802154-mode-switch-start).
- Global [RAIL_EVENT_IEEE802154_MODESWITCH_START_SHIFT](events#rail-event-ieee802154-modeswitch-start-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START_SHIFT](events#sl-rail-event-ieee802154-mode-switch-start-shift).
- Global [RAIL_EVENT_MFM_TX_BUFFER_DONE](events#rail-event-mfm-tx-buffer-done)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_MFM_TX_BUFFER_DONE](events#sl-rail-event-mfm-tx-buffer-done).
- Global [RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT](events#rail-event-mfm-tx-buffer-done-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT](events#sl-rail-event-mfm-tx-buffer-done-shift).
- Global [RAIL_EVENT_PA_PROTECTION](events#rail-event-pa-protection)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_PA_PROTECTION](events#sl-rail-event-pa-protection).
- Global [RAIL_EVENT_PA_PROTECTION_SHIFT](events#rail-event-pa-protection-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_PA_PROTECTION_SHIFT](events#sl-rail-event-pa-protection-shift).
- Global [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed).
- Global [RAIL_EVENT_RF_SENSED_SHIFT](events#rail-event-rf-sensed-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RF_SENSED_SHIFT](events#sl-rail-event-rf-sensed-shift).
- Global [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done).
- Global [RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT](events#rail-event-rssi-average-done-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT](events#sl-rail-event-rssi-average-done-shift).
- Global [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout).
- Global [RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT](events#rail-event-rx-ack-timeout-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT](events#sl-rail-event-rx-ack-timeout-shift).
- Global [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered).
- Global [RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT](events#rail-event-rx-address-filtered-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT](events#sl-rail-event-rx-address-filtered-shift).
- Global [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#sl-rail-event-rx-channel-hopping-complete).
- Global [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT](events#rail-event-rx-channel-hopping-complete-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT](events#sl-rail-event-rx-channel-hopping-complete-shift).
- Global [RAIL_EVENT_RX_DUTY_CYCLE_RX_END](events#rail-event-rx-duty-cycle-rx-end)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END](events#sl-rail-event-rx-duty-cycle-rx-end).
- Global [RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT](events#rail-event-rx-duty-cycle-rx-end-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT](events#sl-rail-event-rx-duty-cycle-rx-end-shift).
- Global [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full).
- Global [RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT](events#rail-event-rx-fifo-almost-full-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT](events#sl-rail-event-rx-fifo-almost-full-shift).
- Global [RAIL_EVENT_RX_FIFO_FULL](events#rail-event-rx-fifo-full)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_FULL](events#sl-rail-event-rx-fifo-full).
- Global [RAIL_EVENT_RX_FIFO_FULL_SHIFT](events#rail-event-rx-fifo-full-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_FULL_SHIFT](events#sl-rail-event-rx-fifo-full-shift).
- Global [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow).
- Global [RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT](events#rail-event-rx-fifo-overflow-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT](events#sl-rail-event-rx-fifo-overflow-shift).
- Global [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed).
- Global [RAIL_EVENT_RX_FILTER_PASSED_SHIFT](events#rail-event-rx-filter-passed-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FILTER_PASSED_SHIFT](events#sl-rail-event-rx-filter-passed-shift).
- Global [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error).
- Global [RAIL_EVENT_RX_FRAME_ERROR_SHIFT](events#rail-event-rx-frame-error-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_FRAME_ERROR_SHIFT](events#sl-rail-event-rx-frame-error-shift).
- Global [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted).
- Global [RAIL_EVENT_RX_PACKET_ABORTED_SHIFT](events#rail-event-rx-packet-aborted-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PACKET_ABORTED_SHIFT](events#sl-rail-event-rx-packet-aborted-shift).
- Global [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received).
- Global [RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT](events#rail-event-rx-packet-received-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT](events#sl-rail-event-rx-packet-received-shift).
- Global [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PREAMBLE_DETECT](events#sl-rail-event-rx-preamble-detect).
- Global [RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT](events#rail-event-rx-preamble-detect-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT](events#sl-rail-event-rx-preamble-detect-shift).
- Global [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost).
- Global [RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT](events#rail-event-rx-preamble-lost-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT](events#sl-rail-event-rx-preamble-lost-shift).
- Global [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end).
- Global [RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT](events#rail-event-rx-scheduled-rx-end-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT](events#sl-rail-event-rx-scheduled-rx-end-shift).
- Global [RAIL_EVENT_RX_SCHEDULED_RX_MISSED](events#rail-event-rx-scheduled-rx-missed)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED](events#sl-rail-event-rx-scheduled-rx-missed).
- Global [RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT](events#rail-event-rx-scheduled-rx-missed-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT](events#sl-rail-event-rx-scheduled-rx-missed-shift).
- Global [RAIL_EVENT_RX_SYNC1_DETECT](events#rail-event-rx-sync1-detect)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SYNC_0_DETECT](events#sl-rail-event-rx-sync-0-detect).
- Global [RAIL_EVENT_RX_SYNC1_DETECT_SHIFT](events#rail-event-rx-sync1-detect-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SYNC_0_DETECT_SHIFT](events#sl-rail-event-rx-sync-0-detect-shift).
- Global [RAIL_EVENT_RX_SYNC2_DETECT](events#rail-event-rx-sync2-detect)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SYNC_1_DETECT](events#sl-rail-event-rx-sync-1-detect).
- Global [RAIL_EVENT_RX_SYNC2_DETECT_SHIFT](events#rail-event-rx-sync2-detect-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SYNC_1_DETECT_SHIFT](events#sl-rail-event-rx-sync-1-detect-shift).
- Global [RAIL_EVENT_RX_TIMEOUT](events#rail-event-rx-timeout)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMEOUT](events#sl-rail-event-rx-timeout).
- Global [RAIL_EVENT_RX_TIMEOUT_SHIFT](events#rail-event-rx-timeout-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMEOUT_SHIFT](events#sl-rail-event-rx-timeout-shift).
- Global [RAIL_EVENT_RX_TIMING_DETECT](events#rail-event-rx-timing-detect)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMING_DETECT](events#sl-rail-event-rx-timing-detect).
- Global [RAIL_EVENT_RX_TIMING_DETECT_SHIFT](events#rail-event-rx-timing-detect-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMING_DETECT_SHIFT](events#sl-rail-event-rx-timing-detect-shift).
- Global [RAIL_EVENT_RX_TIMING_LOST](events#rail-event-rx-timing-lost)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMING_LOST](events#sl-rail-event-rx-timing-lost).
- Global [RAIL_EVENT_RX_TIMING_LOST_SHIFT](events#rail-event-rx-timing-lost-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_TIMING_LOST_SHIFT](events#sl-rail-event-rx-timing-lost-shift).
- Global [RAIL_EVENT_SCHEDULED_RX_STARTED](events#rail-event-scheduled-rx-started)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED](events#sl-rail-event-rx-scheduled-rx-started).
- Global [RAIL_EVENT_SCHEDULED_RX_STARTED_SHIFT](events#rail-event-scheduled-rx-started-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED_SHIFT](events#sl-rail-event-rx-scheduled-rx-started-shift).
- Global [RAIL_EVENT_SCHEDULED_TX_STARTED](events#rail-event-scheduled-tx-started)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED](events#sl-rail-event-tx-scheduled-tx-started).
- Global [RAIL_EVENT_SCHEDULED_TX_STARTED_SHIFT](events#rail-event-scheduled-tx-started-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED_SHIFT](events#sl-rail-event-tx-scheduled-tx-started-shift).
- Global [RAIL_EVENT_SCHEDULER_STATUS](events#rail-event-scheduler-status)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status).
- Global [RAIL_EVENT_SCHEDULER_STATUS_SHIFT](events#rail-event-scheduler-status-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_SCHEDULER_STATUS_SHIFT](events#sl-rail-event-scheduler-status-shift).
- Global [RAIL_EVENT_SIGNAL_DETECTED](events#rail-event-signal-detected)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_SIGNAL_DETECTED](events#sl-rail-event-signal-detected).
- Global [RAIL_EVENT_SIGNAL_DETECTED_SHIFT](events#rail-event-signal-detected-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_SIGNAL_DETECTED_SHIFT](events#sl-rail-event-signal-detected-shift).
- Global [RAIL_EVENT_TEMPERATURE_COOL_DOWN](events#rail-event-temperature-cool-down)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN](events#sl-rail-event-temperature-cool-down).
- Global [RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT](events#rail-event-temperature-cool-down-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT](events#sl-rail-event-temperature-cool-down-shift).
- Global [RAIL_EVENT_TEMPERATURE_TOO_HOT](events#rail-event-temperature-too-hot)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TEMPERATURE_TOO_HOT](events#sl-rail-event-temperature-too-hot).
- Global [RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT](events#rail-event-temperature-too-hot-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT](events#sl-rail-event-temperature-too-hot-shift).
- Global [RAIL_EVENT_THERMISTOR_DONE](events#rail-event-thermistor-done)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_THERMISTOR_DONE](events#sl-rail-event-thermistor-done).
- Global [RAIL_EVENT_THERMISTOR_DONE_SHIFT](events#rail-event-thermistor-done-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_THERMISTOR_DONE_SHIFT](events#sl-rail-event-thermistor-done-shift).
- Global [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted).
- Global [RAIL_EVENT_TX_ABORTED_SHIFT](events#rail-event-tx-aborted-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_ABORTED_SHIFT](events#sl-rail-event-tx-aborted-shift).
- Global [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked).
- Global [RAIL_EVENT_TX_BLOCKED_SHIFT](events#rail-event-tx-blocked-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_BLOCKED_SHIFT](events#sl-rail-event-tx-blocked-shift).
- Global [RAIL_EVENT_TX_BLOCKED_TOO_HOT](events#rail-event-tx-blocked-too-hot)  
  This RAIL 2.x event has been eliminated in RAIL 3; its value is reserved for possible future use.
- Global [RAIL_EVENT_TX_BLOCKED_TOO_HOT_SHIFT](events#rail-event-tx-blocked-too-hot-shift)  
  This RAIL 2.x event has been eliminated in RAIL 3; its value is reserved for possible future use.
- Global [RAIL_EVENT_TX_CCA_ACTIVATED](events#rail-event-tx-cca-activated)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CCA_ACTIVATED](events#sl-rail-event-tx-cca-activated).
- Global [RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT](events#rail-event-tx-cca-activated-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT](events#sl-rail-event-tx-cca-activated-shift).
- Global [RAIL_EVENT_TX_CCA_RETRY](events#rail-event-tx-cca-retry)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CCA_RETRY](events#sl-rail-event-tx-cca-retry).
- Global [RAIL_EVENT_TX_CCA_RETRY_SHIFT](events#rail-event-tx-cca-retry-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CCA_RETRY_SHIFT](events#sl-rail-event-tx-cca-retry-shift).
- Global [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy).
- Global [RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT](events#rail-event-tx-channel-busy-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT](events#sl-rail-event-tx-channel-busy-shift).
- Global [RAIL_EVENT_TX_CHANNEL_CLEAR](events#rail-event-tx-channel-clear)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CHANNEL_CLEAR](events#sl-rail-event-tx-channel-clear).
- Global [RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT](events#rail-event-tx-channel-clear-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT](events#sl-rail-event-tx-channel-clear-shift).
- Global [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty).
- Global [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT](events#rail-event-tx-fifo-almost-empty-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT](events#sl-rail-event-tx-fifo-almost-empty-shift).
- Global [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent).
- Global [RAIL_EVENT_TX_PACKET_SENT_SHIFT](events#rail-event-tx-packet-sent-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_PACKET_SENT_SHIFT](events#sl-rail-event-tx-packet-sent-shift).
- Global [RAIL_EVENT_TX_SCHEDULED_TX_MISSED](events#rail-event-tx-scheduled-tx-missed)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED](events#sl-rail-event-tx-scheduled-tx-missed).
- Global [RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT](events#rail-event-tx-scheduled-tx-missed-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT](events#sl-rail-event-tx-scheduled-tx-missed-shift).
- Global [RAIL_EVENT_TX_START_CCA](events#rail-event-tx-start-cca)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_START_CCA](events#sl-rail-event-tx-start-cca).
- Global [RAIL_EVENT_TX_START_CCA_SHIFT](events#rail-event-tx-start-cca-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_START_CCA_SHIFT](events#sl-rail-event-tx-start-cca-shift).
- Global [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started).
- Global [RAIL_EVENT_TX_STARTED_SHIFT](events#rail-event-tx-started-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_STARTED_SHIFT](events#sl-rail-event-tx-started-shift).
- Global [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow).
- Global [RAIL_EVENT_TX_UNDERFLOW_SHIFT](events#rail-event-tx-underflow-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TX_UNDERFLOW_SHIFT](events#sl-rail-event-tx-underflow-shift).
- Global [RAIL_EVENT_TXACK_ABORTED](events#rail-event-txack-aborted)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_ABORTED](events#sl-rail-event-txack-aborted).
- Global [RAIL_EVENT_TXACK_ABORTED_SHIFT](events#rail-event-txack-aborted-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_ABORTED_SHIFT](events#sl-rail-event-txack-aborted-shift).
- Global [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked).
- Global [RAIL_EVENT_TXACK_BLOCKED_SHIFT](events#rail-event-txack-blocked-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_BLOCKED_SHIFT](events#sl-rail-event-txack-blocked-shift).
- Global [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent).
- Global [RAIL_EVENT_TXACK_PACKET_SENT_SHIFT](events#rail-event-txack-packet-sent-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_PACKET_SENT_SHIFT](events#sl-rail-event-txack-packet-sent-shift).
- Global [RAIL_EVENT_TXACK_UNDERFLOW](events#rail-event-txack-underflow)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_UNDERFLOW](events#sl-rail-event-txack-underflow).
- Global [RAIL_EVENT_TXACK_UNDERFLOW_SHIFT](events#rail-event-txack-underflow-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_TXACK_UNDERFLOW_SHIFT](events#sl-rail-event-txack-underflow-shift).
- Global [RAIL_EVENT_USER_MBOX](events#rail-event-user-mbox)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_USER_MBOX](events#sl-rail-event-user-mbox).
- Global [RAIL_EVENT_USER_MBOX_SHIFT](events#rail-event-user-mbox-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_USER_MBOX_SHIFT](events#sl-rail-event-user-mbox-shift).
- Global [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam).
- Global [RAIL_EVENT_ZWAVE_BEAM_SHIFT](events#rail-event-zwave-beam-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_ZWAVE_BEAM_SHIFT](events#sl-rail-event-zwave-beam-shift).
- Global [RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND](events#rail-event-zwave-lr-ack-request-command)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND](events#sl-rail-event-zwave-lr-ack-request-command).
- Global [RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT](events#rail-event-zwave-lr-ack-request-command-shift)  
  RAIL 2.x synonym of [SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT](events#sl-rail-event-zwave-lr-ack-request-command-shift).
- Global [RAIL_EVENTS_ALL](events#rail-events-all)  
  RAIL 2.x synonym of [SL_RAIL_EVENTS_ALL](events#sl-rail-events-all).
- Global [RAIL_EVENTS_NONE](events#rail-events-none)  
  RAIL 2.x synonym of [SL_RAIL_EVENTS_NONE](events#sl-rail-events-none).
- Global [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion)  
  RAIL 2.x synonym of [SL_RAIL_EVENTS_RX_COMPLETION](events#sl-rail-events-rx-completion).
- Global [RAIL_Events_t](events#rail-events-t)  
  RAIL 2.x synonym of [sl_rail_events_t](events#sl-rail-events-t).
- Global [RAIL_EVENTS_TX_COMPLETION](events#rail-events-tx-completion)  
  RAIL 2.x synonym of [SL_RAIL_EVENTS_TX_COMPLETION](events#sl-rail-events-tx-completion).
- Global [RAIL_EVENTS_TXACK_COMPLETION](events#rail-events-txack-completion)  
  RAIL 2.x synonym of [SL_RAIL_EVENTS_TXACK_COMPLETION](events#sl-rail-events-txack-completion).
- Global [RAIL_FEAT_2G4_RADIO](features#rail-feat-2-g4-radio)  
  Use [SL_RAIL_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-supports-2-p4-ghz-band).
- Global [RAIL_FEAT_802154_COEX_PHY](features#rail-feat-802154-coex-phy)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1).
- Global [RAIL_FEAT_ALTERNATE_POWER_TX_SUPPORTED](features#rail-feat-alternate-power-tx-supported)  
  Use [SL_RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#sl-rail-supports-alternate-tx-power-1).
- Global [RAIL_FEAT_ANTENNA_DIVERSITY](features#rail-feat-antenna-diversity)  
  Use [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1).
- Global [RAIL_FEAT_BLE_AOX_SUPPORTED](features#rail-feat-ble-aox-supported)  
  Use [SL_RAIL_BLE_SUPPORTS_AOX](features#sl-rail-ble-supports-aox).
- Global [RAIL_FEAT_BLE_CODED](features#rail-feat-ble-coded)  
  Use [SL_RAIL_BLE_SUPPORTS_CODED_PHY](features#sl-rail-ble-supports-coded-phy-1).
- Global [RAIL_FEAT_BLE_PHY_SWITCH_TO_RX](features#rail-feat-ble-phy-switch-to-rx)  
  Use [SL_RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#sl-rail-ble-supports-phy-switch-to-rx-1).
- Global [RAIL_FEAT_CHANNEL_HOPPING](features#rail-feat-channel-hopping)  
  Use [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1).
- Global [RAIL_FEAT_DUAL_BAND_RADIO](features#rail-feat-dual-band-radio)  
  Use [SL_RAIL_SUPPORTS_DUAL_BAND](features#sl-rail-supports-dual-band-1).
- Global [RAIL_FEAT_EXTERNAL_THERMISTOR](features#rail-feat-external-thermistor)  
  Use [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1).
- Global [RAIL_FEAT_IEEE802154_CANCEL_FP_LOOKUP_SUPPORTED](features#rail-feat-ieee802154-cancel-fp-lookup-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup-1).
- Global [RAIL_FEAT_IEEE802154_E_ENH_ACK_SUPPORTED](features#rail-feat-ieee802154-e-enh-ack-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#sl-rail-ieee802154-supports-e-enhanced-ack-1).
- Global [RAIL_FEAT_IEEE802154_E_GB868_SUPPORTED](features#rail-feat-ieee802154-e-gb868-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#sl-rail-ieee802154-supports-e-subset-gb868-1).
- Global [RAIL_FEAT_IEEE802154_EARLY_FP_LOOKUP_SUPPORTED](features#rail-feat-ieee802154-early-fp-lookup-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-early-frame-pending-lookup-1).
- Global [RAIL_FEAT_IEEE802154_G_4BYTE_CRC_SUPPORTED](features#rail-feat-ieee802154-g-4-byte-crc-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_G_4_BYTE_CRC](features#sl-rail-ieee802154-supports-g-4-byte-crc-1).
- Global [RAIL_FEAT_IEEE802154_G_GB868_SUPPORTED](features#rail-feat-ieee802154-g-gb868-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#sl-rail-ieee802154-supports-g-subset-gb868-1).
- Global [RAIL_FEAT_IEEE802154_G_UNWHITENED_RX_SUPPORTED](features#rail-feat-ieee802154-g-unwhitened-rx-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#sl-rail-ieee802154-supports-g-unwhitened-rx-1).
- Global [RAIL_FEAT_IEEE802154_G_UNWHITENED_TX_SUPPORTED](features#rail-feat-ieee802154-g-unwhitened-tx-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#sl-rail-ieee802154-supports-g-unwhitened-tx-1).
- Global [RAIL_FEAT_IEEE802154_MULTIPURPOSE_FRAME_SUPPORTED](features#rail-feat-ieee802154-multipurpose-frame-supported)  
  Use [SL_RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#sl-rail-ieee802154-supports-e-multipurpose-frames-1).
- Global [RAIL_FEAT_RFSENSE_SELECTIVE_OOK_MODE_SUPPORTED](features#rail-feat-rfsense-selective-ook-mode-supported)  
  Use [SL_RAIL_SUPPORTS_RF_SENSE_SELECTIVE_OOK](features#sl-rail-supports-rf-sense-selective-ook-1).
- Global [RAIL_FEAT_SUBGIG_RADIO](features#rail-feat-subgig-radio)  
  Use [SL_RAIL_SUPPORTS_SUB_GHZ_BAND](features#sl-rail-supports-sub-ghz-band-1).
- Global [RAIL_FEAT_ZWAVE_REGION_PTI](features#rail-feat-zwave-region-pti)  
  Use [SL_RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#sl-rail-zwave-supports-region-pti-1).
- Global [RAIL_FEAT_ZWAVE_SUPPORTED](features#rail-feat-zwave-supported)  
  Use [SL_RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#sl-rail-supports-protocol-zwave-1).
- Global [RAIL_FIFO_ALIGNMENT](data-management#rail-fifo-alignment)  
  This RAIL 2.x define has been eliminated in RAIL 3; use [SL_RAIL_DECLARE_FIFO_BUFFER()](data-management#sl-rail-declare-fifo-buffer).
- Global [RAIL_FIFO_ALIGNMENT_TYPE](data-management#rail-fifo-alignment-type)  
  RAIL 2.x synonym of [sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t).
- Global [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled)  
  RAIL 2.x synonym of [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled).
- Class [RAIL_FrameType_t](rail-frame-type-t)  
  RAIL 2.x synonym of [sl_rail_frame_type_t](sl-rail-frame-type-t).
- Global [RAIL_FrameType_t::addressFilter](rail-frame-type-t#address-filter)  
  RAIL 2.x synonym of [sl_rail_frame_type_t::address_filter_mask](sl-rail-frame-type-t#address-filter-mask).
- Global [RAIL_FrameType_t::frameLen](rail-frame-type-t#frame-len)  
  RAIL 2.x synonym of [sl_rail_frame_type_t::p_frame_byte_lengths](sl-rail-frame-type-t#p-frame-byte-lengths).
- Global [RAIL_FrameType_t::isValid](rail-frame-type-t#is-valid)  
  RAIL 2.x synonym of [sl_rail_frame_type_t::is_valid](sl-rail-frame-type-t#is-valid).
- Global [RAIL_FrameType_t::mask](rail-frame-type-t#mask)  
  RAIL 2.x synonym of [sl_rail_frame_type_t::mask](sl-rail-frame-type-t#mask).
- Global [RAIL_FrameType_t::offset](rail-frame-type-t#offset)  
  RAIL 2.x synonym of [sl_rail_frame_type_t::offset_bytes](sl-rail-frame-type-t#offset-bytes).
- Global [RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#rail-frequency-offset-invalid)  
  RAIL 2.x synonym of [SL_RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#sl-rail-frequency-offset-invalid).
- Global [RAIL_FREQUENCY_OFFSET_MAX](diagnostic#rail-frequency-offset-max)  
  RAIL 2.x synonym of [SL_RAIL_FREQUENCY_OFFSET_MAX](diagnostic#sl-rail-frequency-offset-max).
- Global [RAIL_FREQUENCY_OFFSET_MIN](diagnostic#rail-frequency-offset-min)  
  RAIL 2.x synonym of [SL_RAIL_FREQUENCY_OFFSET_MIN](diagnostic#sl-rail-frequency-offset-min).
- Global [RAIL_FrequencyOffset_t](diagnostic#rail-frequency-offset-t)  
  RAIL 2.x synonym of [sl_rail_frequency_offset_t](diagnostic#sl-rail-frequency-offset-t).
- Global [RAIL_GET_RSSI_NO_WAIT](receive#rail-get-rssi-no-wait)  
  RAIL 2.x synonym of [SL_RAIL_GET_RSSI_NO_WAIT](receive#sl-rail-get-rssi-no-wait).
- Global [RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#rail-get-rssi-wait-without-timeout)  
  RAIL 2.x synonym of [SL_RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#sl-rail-get-rssi-wait-without-timeout).
- Global [RAIL_GetAutoAckFifo](auto-ack#rail-get-auto-ack-fifo)  (RAIL_Handle_t railHandle, uint8_t **ackBuffer, uint16_t *ackBufferBytes)  
  RAIL 2.x synonym of [sl_rail_get_auto_ack_fifo()](auto-ack#sl-rail-get-auto-ack-fifo).
- Global [RAIL_GetAverageRssi](receive#rail-get-average-rssi)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_average_rssi()](receive#sl-rail-get-average-rssi).
- Global [RAIL_GetBitRate](radio-configuration#rail-get-bit-rate)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_bit_rate()](radio-configuration#sl-rail-get-bit-rate).
- Global [RAIL_GetChannel](radio-configuration#rail-get-channel)  (RAIL_Handle_t railHandle, uint16_t *channel)  
  RAIL 2.x synonym of [sl_rail_get_channel()](radio-configuration#sl-rail-get-channel).
- Global [RAIL_GetChannelAlt](radio-configuration#rail-get-channel-alt)  (RAIL_Handle_t railHandle, uint16_t *channel)  
  RAIL 2.x synonym of [sl_rail_get_tuned_channel()](radio-configuration#sl-rail-get-tuned-channel).
- Global [RAIL_GetChannelHoppingRssi](rx-channel-hopping#rail-get-channel-hopping-rssi)  (RAIL_Handle_t railHandle, uint8_t channelIndex)  
  RAIL 2.x synonym of [sl_rail_get_channel_hopping_rssi()](rx-channel-hopping#sl-rail-get-channel-hopping-rssi).
- Global [RAIL_GetChannelMetadata](radio-configuration#rail-get-channel-metadata)  (RAIL_Handle_t railHandle, [RAIL_ChannelMetadata_t](rail-channel-metadata-t) *channelMetadata, uint16_t *length, uint16_t minChannel, uint16_t maxChannel)  
  RAIL 2.x synonym of [sl_rail_get_channel_metadata()](radio-configuration#sl-rail-get-channel-metadata).
- Global [RAIL_GetCrcInitVal](radio-configuration#rail-get-crc-init-val)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_crc_init_val()](radio-configuration#sl-rail-get-crc-init-val).
- Global [RAIL_GetDefaultRxDutyCycleConfig](rx-channel-hopping#rail-get-default-rx-duty-cycle-config)  (RAIL_Handle_t railHandle, [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_get_default_rx_duty_cycle_config()](rx-channel-hopping#sl-rail-get-default-rx-duty-cycle-config).
- Global [RAIL_GetHFXOCompensationConfig](external-thermistor#rail-get-hfxo-compensation-config)  (RAIL_Handle_t railHandle, [RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t) *pHfxoCompensationConfig)  
  RAIL 2.x synonym of [sl_rail_get_hfxo_compensation_config()](external-thermistor#sl-rail-get-hfxo-compensation-config).
- Global [RAIL_GetMultiTimer](system-timing#rail-get-multi-timer)  ([RAIL_MultiTimer_t](rail-multi-timer-t) *tmr, RAIL_TimeMode_t timeMode)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_multi_timer()](system-timing#sl-rail-get-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_GetPaPowerSetting](pa#rail-get-pa-power-setting)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_pa_power_setting().
- Global [RAIL_GetPendingCal](calibration#rail-get-pending-cal)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal).
- Global [RAIL_GetPowerSettingTable](pa#rail-get-power-setting-table)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t *minPower, RAIL_TxPower_t *maxPower, RAIL_TxPowerLevel_t *step)  
  RAIL 2.x synonym of [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table).
- Global [RAIL_GetPtiConfig](pti#rail-get-pti-config)  (RAIL_Handle_t railHandle, [RAIL_PtiConfig_t](rail-pti-config-t) *ptiConfig)  
  RAIL 2.x synonym of [sl_rail_get_pti_config()](pti#sl-rail-get-pti-config).
- Global [RAIL_GetPtiProtocol](pti#rail-get-pti-protocol)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_pti_protocol()](pti#sl-rail-get-pti-protocol).
- Global [RAIL_GetRadioClockFreqHz](diagnostic#rail-get-radio-clock-freq-hz)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_radio_clock_freq_hz()](diagnostic#sl-rail-get-radio-clock-freq-hz).
- Global [RAIL_GetRadioEntropy](general#rail-get-radio-entropy)  (RAIL_Handle_t railHandle, uint8_t *buffer, uint16_t bytes)  
  RAIL 2.x synonym of [sl_rail_get_radio_entropy()](general#sl-rail-get-radio-entropy).
- Global [RAIL_GetRadioState](state-transitions#rail-get-radio-state)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_radio_state()](state-transitions#sl-rail-get-radio-state).
- Global [RAIL_GetRadioStateDetail](state-transitions#rail-get-radio-state-detail)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_radio_state_detail()](state-transitions#sl-rail-get-radio-state-detail).
- Global [RAIL_GetRetimeOptions](retiming#rail-get-retime-options)  (RAIL_Handle_t railHandle, RAIL_RetimeOptions_t *pOptions)  
  RAIL 2.x synonym of [sl_rail_get_retime_options()](retiming#sl-rail-get-retime-options).
- Global [RAIL_GetRfPath](antenna-control#rail-get-rf-path)  (RAIL_Handle_t railHandle, RAIL_AntennaSel_t *rfPath)  
  RAIL 2.x synonym of [sl_rail_get_rf_path()](antenna-control#sl-rail-get-rf-path).
- Global [RAIL_GetRssi](receive#rail-get-rssi)  (RAIL_Handle_t railHandle, bool wait)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rssi()](receive#sl-rail-get-rssi) with a different parameter.
- Global [RAIL_GetRssiAlt](receive#rail-get-rssi-alt)  (RAIL_Handle_t railHandle, RAIL_Time_t waitTimeout)  
  RAIL 2.x synonym of [sl_rail_get_rssi()](receive#sl-rail-get-rssi).
- Global [RAIL_GetRssiDetectThreshold](receive#rail-get-rssi-detect-threshold)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rssi_detect_threshold()](receive#sl-rail-get-rssi-detect-threshold).
- Global [RAIL_GetRssiOffset](receive#rail-get-rssi-offset)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rssi_offset()](receive#sl-rail-get-rssi-offset).
- Global [RAIL_GetRxFifoBytesAvailable](data-management#rail-get-rx-fifo-bytes-available)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rx_fifo_bytes_available()](data-management#sl-rail-get-rx-fifo-bytes-available). Unlike in RAIL 2.x where this function returns 0 when a protocol is inactive, in RAIL 3 if the protocol has established its own independent Rx FIFO and Packet Queue, this function returns the amount of data preserved in the Rx FIFO.
- Global [RAIL_GetRxFifoThreshold](data-management#rail-get-rx-fifo-threshold)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rx_fifo_threshold()](data-management#sl-rail-get-rx-fifo-threshold).
- Global [RAIL_GetRxFreqOffset](diagnostic#rail-get-rx-freq-offset)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rx_freq_offset()](diagnostic#sl-rail-get-rx-freq-offset).
- Global [RAIL_GetRxIncomingPacketInfo](packet-information#rail-get-rx-incoming-packet-info)  (RAIL_Handle_t railHandle, [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *pPacketInfo)  
  RAIL 2.x synonym of [sl_rail_get_rx_incoming_packet_info()](packet-information#sl-rail-get-rx-incoming-packet-info).
- Global [RAIL_GetRxIncomingPacketRssi](receive#rail-get-rx-incoming-packet-rssi)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_rx_incoming_packet_rssi()](receive#sl-rail-get-rx-incoming-packet-rssi).
- Global [RAIL_GetRxPacketDetails](packet-information#rail-get-rx-packet-details)  (RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *pPacketDetails)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) with different parameter semantics - the last parameter is solely an output parameter where any time-received time position passed in is ignored.
- Global [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt)  (RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details).
- Global [RAIL_GetRxPacketInfo](packet-information#rail-get-rx-packet-info)  (RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *pPacketInfo)  
  RAIL 2.x synonym of [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info).
- Global [RAIL_GetRxTimeFrameEnd](packet-information#rail-get-rx-time-frame-end)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_frame_end()](packet-information#sl-rail-get-rx-time-frame-end) with different parameters.
- Global [RAIL_GetRxTimeFrameEndAlt](packet-information#rail-get-rx-time-frame-end-alt)  (RAIL_Handle_t railHandle, [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_rx_time_frame_end()](packet-information#sl-rail-get-rx-time-frame-end).
- Global [RAIL_GetRxTimePreambleStart](packet-information#rail-get-rx-time-preamble-start)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start) with different parameters.
- Global [RAIL_GetRxTimePreambleStartAlt](packet-information#rail-get-rx-time-preamble-start-alt)  (RAIL_Handle_t railHandle, [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start).
- Global [RAIL_GetRxTimeSyncWordEnd](packet-information#rail-get-rx-time-sync-word-end)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end) with different parameters.
- Global [RAIL_GetRxTimeSyncWordEndAlt](packet-information#rail-get-rx-time-sync-word-end-alt)  (RAIL_Handle_t railHandle, [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end).
- Global [RAIL_GetRxTransitions](state-transitions#rail-get-rx-transitions)  (RAIL_Handle_t railHandle, [RAIL_StateTransitions_t](rail-state-transitions-t) *transitions)  
  RAIL 2.x synonym of [sl_rail_get_rx_transitions()](state-transitions#sl-rail-get-rx-transitions).
- Global [RAIL_GetSchedulerStatus](multiprotocol#rail-get-scheduler-status)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status) with additional parameters and a broader set of [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values that can be reported.
- Global [RAIL_GetSchedulerStatusAlt](multiprotocol#rail-get-scheduler-status-alt)  (RAIL_Handle_t railHandle, RAIL_SchedulerStatus_t *pSchedulerStatus, RAIL_Status_t *pRailStatus)  
  RAIL 2.x synonym of [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status).
- Global [RAIL_GetSymbolRate](radio-configuration#rail-get-symbol-rate)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_symbol_rate()](radio-configuration#sl-rail-get-symbol-rate).
- Global [RAIL_GetSyncWords](radio-configuration#rail-get-sync-words)  (RAIL_Handle_t railHandle, [RAIL_SyncWordConfig_t](rail-sync-word-config-t) *syncWordConfig)  
  RAIL 2.x synonym of [sl_rail_get_sync_words()](radio-configuration#sl-rail-get-sync-words).
- Global [RAIL_GetTemperature](thermal-protection#rail-get-temperature)  (RAIL_Handle_t railHandle, int16_t tempBuffer[((3U)+(1U))], bool reset)  
  RAIL 2.x synonym of [sl_rail_get_temperature()](thermal-protection#sl-rail-get-temperature).
- Global [RAIL_GetThermalProtection](thermal-protection#rail-get-thermal-protection)  (RAIL_Handle_t genericRailHandle, [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) *chipTempConfig)  
  RAIL 2.x synonym of [sl_rail_get_thermal_protection()](thermal-protection#sl-rail-get-thermal-protection).
- Global [RAIL_GetThermistorImpedance](external-thermistor#rail-get-thermistor-impedance)  (RAIL_Handle_t railHandle, uint32_t *thermistorImpedance)  
  RAIL 2.x synonym of [sl_rail_get_thermistor_impedance()](external-thermistor#sl-rail-get-thermistor-impedance).
- Global [RAIL_GetTime](system-timing#rail-get-time)  (void)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_time()](system-timing#sl-rail-get-time) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_GetTimer](system-timing#rail-get-timer)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_timer()](system-timing#sl-rail-get-timer).
- Global [RAIL_GetTransitionTime](multiprotocol#rail-get-transition-time)  (void)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_transition_time()](multiprotocol#sl-rail-get-transition-time) with its additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_GetTune](diagnostic#rail-get-tune)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tune()](diagnostic#sl-rail-get-tune).
- Global [RAIL_GetTuneDelta](diagnostic#rail-get-tune-delta)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tune_delta()](diagnostic#sl-rail-get-tune-delta).
- Global [RAIL_GetTxFifoSpaceAvailable](data-management#rail-get-tx-fifo-space-available)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tx_fifo_space_available()](data-management#sl-rail-get-tx-fifo-space-available).
- Global [RAIL_GetTxFifoThreshold](data-management#rail-get-tx-fifo-threshold)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tx_fifo_threshold()](data-management#sl-rail-get-tx-fifo-threshold).
- Global [RAIL_GetTxPacketDetails](transmit#rail-get-tx-packet-details)  (RAIL_Handle_t railHandle, [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *pPacketDetails)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) with different parameters.
- Global [RAIL_GetTxPacketDetailsAlt](transmit#rail-get-tx-packet-details-alt)  (RAIL_Handle_t railHandle, bool isAck, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) with different parameters.
- Global [RAIL_GetTxPacketDetailsAlt2](transmit#rail-get-tx-packet-details-alt2)  (RAIL_Handle_t railHandle, [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details).
- Global [RAIL_GetTxPacketsRemaining](state-transitions#rail-get-tx-packets-remaining)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tx_packets_remaining()](state-transitions#sl-rail-get-tx-packets-remaining).
- Global [RAIL_GetTxPower](pa#rail-get-tx-power)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_tx_power().
- Global [RAIL_GetTxPowerConfig](pa#rail-get-tx-power-config)  (RAIL_Handle_t railHandle, [RAIL_TxPowerConfig_t](rail-tx-power-config-t) *config)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_tx_power_config().
- Global [RAIL_GetTxPowerCurve](pa-curve-conversions#rail-get-tx-power-curve)  (RAIL_TxPowerMode_t mode)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table) with different parameters.
- Global [RAIL_GetTxPowerCurveLimits](pa-curve-conversions#rail-get-tx-power-curve-limits)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t *maxpower, RAIL_TxPower_t *increment)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table) with different parameters.
- Global [RAIL_GetTxPowerDbm](pa#rail-get-tx-power-dbm)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_tx_power_dbm()](pa#sl-rail-get-tx-power-dbm).
- Global [RAIL_GetTxTimeFrameEnd](transmit#rail-get-tx-time-frame-end)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_frame_end()](transmit#sl-rail-get-tx-time-frame-end) with different parameters.
- Global [RAIL_GetTxTimeFrameEndAlt](transmit#rail-get-tx-time-frame-end-alt)  (RAIL_Handle_t railHandle, [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_tx_time_frame_end()](transmit#sl-rail-get-tx-time-frame-end).
- Global [RAIL_GetTxTimePreambleStart](transmit#rail-get-tx-time-preamble-start)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start) with different parameters.
- Global [RAIL_GetTxTimePreambleStartAlt](transmit#rail-get-tx-time-preamble-start-alt)  (RAIL_Handle_t railHandle, [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start).
- Global [RAIL_GetTxTimeSyncWordEnd](transmit#rail-get-tx-time-sync-word-end)  (RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_sync_word_end()](transmit#sl-rail-get-tx-time-sync-word-end) with different parameters.
- Global [RAIL_GetTxTimeSyncWordEndAlt](transmit#rail-get-tx-time-sync-word-end-alt)  (RAIL_Handle_t railHandle, [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *pPacketDetails)  
  RAIL 2.x synonym of [sl_rail_get_tx_time_sync_word_end()](transmit#sl-rail-get-tx-time-sync-word-end).
- Global [RAIL_GetTxTransitions](state-transitions#rail-get-tx-transitions)  (RAIL_Handle_t railHandle, [RAIL_StateTransitions_t](rail-state-transitions-t) *transitions)  
  RAIL 2.x synonym of [sl_rail_get_tx_transitions()](state-transitions#sl-rail-get-tx-transitions).
- Global [RAIL_GetVdet](vdet#rail-get-vdet)  (RAIL_Handle_t genericRailHandle, uint32_t *pVdetMv)  
  RAIL 2.x synonym of [sl_rail_get_vdet()](vdet#sl-rail-get-vdet).
- Global [RAIL_GetVdetConfig](vdet#rail-get-vdet-config)  (RAIL_Handle_t genericRailHandle, [RAIL_VdetConfig_t](rail-vdet-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_get_vdet_config()](vdet#sl-rail-get-vdet-config).
- Global [RAIL_GetVersion](general#rail-get-version)  ([RAIL_Version_t](rail-version-t) *version, bool verbose)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_version()](general#sl-rail-get-version) with fewer parameters and always returns verbose information.
- Global [RAIL_GetWhiteningInitVal](radio-configuration#rail-get-whitening-init-val)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_get_whitening_init_val()](radio-configuration#sl-rail-get-whitening-init-val).
- Global [RAIL_Handle_t](general#rail-handle-t)  
  RAIL 2.x synonym of [sl_rail_handle_t](general#sl-rail-handle-t).
- Global [RAIL_HFXO_TEMP_MEASURE_COUNT](thermal-protection#rail-hfxo-temp-measure-count)  
  RAIL 2.x synonym of [SL_RAIL_HFXO_TEMP_MEASURE_COUNT](thermal-protection#sl-rail-hfxo-temp-measure-count).
- Class [RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t)  
  RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t).
- Global [RAIL_HFXOCompensationConfig_t::deltaCritical](rail-hfxo-compensation-config-t#delta-critical)  
  RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::delta_critical_celsius](sl-rail-hfxo-compensation-config-t#delta-critical-celsius).
- Global [RAIL_HFXOCompensationConfig_t::deltaNominal](rail-hfxo-compensation-config-t#delta-nominal)  
  RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::delta_nominal_celsius](sl-rail-hfxo-compensation-config-t#delta-nominal-celsius).
- Global [RAIL_HFXOCompensationConfig_t::enableCompensation](rail-hfxo-compensation-config-t#enable-compensation)  
  RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::enable_compensation](sl-rail-hfxo-compensation-config-t#enable-compensation).
- Global [RAIL_HFXOCompensationConfig_t::zoneTemperatureC](rail-hfxo-compensation-config-t#zone-temperature-c)  
  RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::zone_temperature_celsius](sl-rail-hfxo-compensation-config-t#zone-temperature-celsius).
- Class [RAIL_HFXOThermistorConfig_t](rail-hfxo-thermistor-config-t)  
  RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t](sl-rail-hfxo-thermistor-config-t).
- Global [RAIL_HFXOThermistorConfig_t::pin](rail-hfxo-thermistor-config-t#pin)  
  RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t::pin](sl-rail-hfxo-thermistor-config-t#pin).
- Global [RAIL_HFXOThermistorConfig_t::port](rail-hfxo-thermistor-config-t#port)  
  RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t::port](sl-rail-hfxo-thermistor-config-t#port).
- Global [RAIL_HoldRxPacket](receive#rail-hold-rx-packet)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet).
- Global [RAIL_Idle](state-transitions#rail-idle-1)  (RAIL_Handle_t railHandle, RAIL_IdleMode_t mode, bool wait)  
  RAIL 2.x synonym of [sl_rail_idle()](state-transitions#sl-rail-idle-1).
- Global [RAIL_IDLE](state-transitions#rail-idle)  
  RAIL 2.x synonym of [SL_RAIL_IDLE](state-transitions#sl-rail-idle).
- Global [RAIL_IDLE_ABORT](state-transitions#rail-idle-abort)  
  RAIL 2.x synonym of [SL_RAIL_IDLE_ABORT](state-transitions#sl-rail-idle-abort).
- Global [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown)  
  RAIL 2.x synonym of [SL_RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#sl-rail-idle-force-shutdown).
- Global [RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](state-transitions#rail-idle-force-shutdown-clear-flags)  
  RAIL 2.x synonym of [SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](state-transitions#sl-rail-idle-force-shutdown-clear-flags).
- Global [RAIL_IdleMode_t](state-transitions#rail-idle-mode-t)  
  RAIL 2.x synonym of [sl_rail_idle_mode_t](state-transitions#sl-rail-idle-mode-t).
- Global [RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#rail-ieee802154-accept-ack-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-ack-frames).
- Global [RAIL_IEEE802154_ACCEPT_BEACON_FRAMES](ieee802-15-4#rail-ieee802154-accept-beacon-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_BEACON_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-beacon-frames).
- Global [RAIL_IEEE802154_ACCEPT_COMMAND_FRAMES](ieee802-15-4#rail-ieee802154-accept-command-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_COMMAND_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-command-frames).
- Global [RAIL_IEEE802154_ACCEPT_DATA_FRAMES](ieee802-15-4#rail-ieee802154-accept-data-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_DATA_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-data-frames).
- Global [RAIL_IEEE802154_ACCEPT_MULTIPURPOSE_FRAMES](ieee802-15-4#rail-ieee802154-accept-multipurpose-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_MULTIPURPOSE_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-multipurpose-frames).
- Global [RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES](ieee802-15-4#rail-ieee802154-accept-standard-frames)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-standard-frames).
- Global [RAIL_IEEE802154_AcceptFrames](ieee802-15-4#rail-ieee802154-accept-frames)  (RAIL_Handle_t railHandle, uint8_t framesMask)  
  RAIL 2.x synonym of [sl_rail_ieee802154_accept_frames()](ieee802-15-4#sl-rail-ieee802154-accept-frames).
- Class [RAIL_IEEE802154_AddrConfig_t](rail-ieee802154-addr-config-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t](sl-rail-ieee802154-addr-config-t).
- Global [RAIL_IEEE802154_AddrConfig_t::longAddr](rail-ieee802154-addr-config-t#long-addr)  [(3U)][8]  
  RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::long_addr](sl-rail-ieee802154-addr-config-t#long-addr).
- Global [RAIL_IEEE802154_AddrConfig_t::panId](rail-ieee802154-addr-config-t#pan-id)  [(3U)]  
  RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::pan_id](sl-rail-ieee802154-addr-config-t#pan-id).
- Global [RAIL_IEEE802154_AddrConfig_t::shortAddr](rail-ieee802154-addr-config-t#short-addr)  [(3U)]  
  RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::short_addr](sl-rail-ieee802154-addr-config-t#short-addr).
- Class [RAIL_IEEE802154_Address_t](rail-ieee802154-address-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t).
- Global [RAIL_IEEE802154_Address_t::filterMask](rail-ieee802154-address-t#filter-mask)  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_t::filter_mask](sl-rail-ieee802154-address-t#filter-mask).
- Global [RAIL_IEEE802154_Address_t::length](rail-ieee802154-address-t#length)  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_t::address_length](sl-rail-ieee802154-address-t#address-length).
- Global [RAIL_IEEE802154_Address_t::longAddress](rail-ieee802154-address-t#long-address)  [8]  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_t::long_address](sl-rail-ieee802154-address-t#long-address).
- Global [RAIL_IEEE802154_Address_t::shortAddress](rail-ieee802154-address-t#short-address)  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_t::short_address](sl-rail-ieee802154-address-t#short-address).
- Global [RAIL_IEEE802154_AddressLength_t](ieee802-15-4#rail-ieee802154-address-length-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_address_length_t](ieee802-15-4#sl-rail-ieee802154-address-length-t).
- Global [RAIL_IEEE802154_CalibrateIr2p4Ghz](calibration#rail-ieee802154-calibrate-ir2p4-ghz)  (RAIL_Handle_t railHandle, uint32_t *imageRejection)  
  RAIL 2.x synonym of [sl_rail_ieee802154_calibrate_ir_2p4_ghz()](calibration#sl-rail-ieee802154-calibrate-ir-2p4-ghz).
- Global [RAIL_IEEE802154_CalibrateIrSubGhz](calibration#rail-ieee802154-calibrate-ir-sub-ghz)  (RAIL_Handle_t railHandle, uint32_t *imageRejection)  
  Use [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir) instead.
- Global [RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT](ieee802-15-4#rail-ieee802154-cca-mode-always-transmit)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT](ieee802-15-4#sl-rail-ieee802154-cca-mode-always-transmit).
- Global [RAIL_IEEE802154_CCA_MODE_COUNT](ieee802-15-4#rail-ieee802154-cca-mode-count)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_COUNT](ieee802-15-4#sl-rail-ieee802154-cca-mode-count).
- Global [RAIL_IEEE802154_CCA_MODE_RSSI](ieee802-15-4#rail-ieee802154-cca-mode-rssi)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_RSSI](ieee802-15-4#sl-rail-ieee802154-cca-mode-rssi).
- Global [RAIL_IEEE802154_CCA_MODE_SIGNAL](ieee802-15-4#rail-ieee802154-cca-mode-signal)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal).
- Global [RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI](ieee802-15-4#rail-ieee802154-cca-mode-signal-and-rssi)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal-and-rssi).
- Global [RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI](ieee802-15-4#rail-ieee802154-cca-mode-signal-or-rssi)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal-or-rssi).
- Global [RAIL_IEEE802154_CcaMode_t](ieee802-15-4#rail-ieee802154-cca-mode-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_cca_mode_t](ieee802-15-4#sl-rail-ieee802154-cca-mode-t).
- Global [RAIL_IEEE802154_ComputeChannelFromPhyModeId](ieee802-15-4#rail-ieee802154-compute-channel-from-phy-mode-id)  (RAIL_Handle_t railHandle, uint8_t newPhyModeId, uint16_t *pChannel)  
  RAIL 2.x synonym of [sl_rail_ieee802154_compute_channel_from_phy_mode_id()](ieee802-15-4#sl-rail-ieee802154-compute-channel-from-phy-mode-id).
- Global [RAIL_IEEE802154_Config2p4GHzRadio](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio).
- Global [RAIL_IEEE802154_Config2p4GHzRadioAntDiv](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div).
- Global [RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-coex)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex).
- Global [RAIL_IEEE802154_Config2p4GHzRadioAntDivCoexFem](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-coex-fem)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex-fem).
- Global [RAIL_IEEE802154_Config2p4GHzRadioAntDivFem](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-fem)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-fem).
- Global [RAIL_IEEE802154_Config2p4GHzRadioCoex](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-coex)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_coex()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex).
- Global [RAIL_IEEE802154_Config2p4GHzRadioCoexFem](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-coex-fem)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex-fem).
- Global [RAIL_IEEE802154_Config2p4GHzRadioCustom1](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-custom1)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3; it is no longer supported.
- Global [RAIL_IEEE802154_Config2p4GHzRadioFem](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-fem)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-fem).
- Class [RAIL_IEEE802154_Config_t](rail-ieee802154-config-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t](sl-rail-ieee802154-config-t).
- Global [RAIL_IEEE802154_Config_t::ackConfig](rail-ieee802154-config-t#ack-config)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::ack_config](sl-rail-ieee802154-config-t#ack-config).
- Global [RAIL_IEEE802154_Config_t::addresses](rail-ieee802154-config-t#addresses)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::p_addresses](sl-rail-ieee802154-config-t#p-addresses).
- Global [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks](sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).
- Global [RAIL_IEEE802154_Config_t::framesMask](rail-ieee802154-config-t#frames-mask)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::frames_mask](sl-rail-ieee802154-config-t#frames-mask).
- Global [RAIL_IEEE802154_Config_t::isPanCoordinator](rail-ieee802154-config-t#is-pan-coordinator)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::is_pan_coordinator](sl-rail-ieee802154-config-t#is-pan-coordinator).
- Global [RAIL_IEEE802154_Config_t::promiscuousMode](rail-ieee802154-config-t#promiscuous-mode)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::promiscuous_mode](sl-rail-ieee802154-config-t#promiscuous-mode).
- Global [RAIL_IEEE802154_Config_t::timings](rail-ieee802154-config-t#timings)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_t::timings](sl-rail-ieee802154-config-t#timings).
- Global [RAIL_IEEE802154_ConfigCcaMode](ieee802-15-4#rail-ieee802154-config-cca-mode)  (RAIL_Handle_t railHandle, RAIL_IEEE802154_CcaMode_t ccaMode)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_cca_mode()](ieee802-15-4#sl-rail-ieee802154-config-cca-mode).
- Global [RAIL_IEEE802154_ConfigEOptions](ieee802-15-4#rail-ieee802154-config-e-options)  (RAIL_Handle_t railHandle, RAIL_IEEE802154_EOptions_t mask, RAIL_IEEE802154_EOptions_t options)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_e_options()](ieee802-15-4#sl-rail-ieee802154-config-e-options).
- Global [RAIL_IEEE802154_ConfigGB863MHzRadio](ieee802-15-4#rail-ieee802154-config-gb863-m-hz-radio)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_gb863_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb863-mhz-radio).
- Global [RAIL_IEEE802154_ConfigGB915MHzRadio](ieee802-15-4#rail-ieee802154-config-gb915-m-hz-radio)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_gb915_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb915-mhz-radio).
- Global [RAIL_IEEE802154_ConfigGOptions](ieee802-15-4#rail-ieee802154-config-g-options)  (RAIL_Handle_t railHandle, RAIL_IEEE802154_GOptions_t mask, RAIL_IEEE802154_GOptions_t options)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_g_options()](ieee802-15-4#sl-rail-ieee802154-config-g-options).
- Global [RAIL_IEEE802154_ConfigRxChannelSwitching](ieee802-15-4#rail-ieee802154-config-rx-channel-switching)  (RAIL_Handle_t railHandle, const [RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t) *pConfig)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_rx_channel_switching()](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching).
- Global [RAIL_IEEE802154_ConfigSignalIdentifier](ieee802-15-4#rail-ieee802154-config-signal-identifier)  (RAIL_Handle_t railHandle, RAIL_IEEE802154_SignalIdentifierMode_t signalIdentifierMode)  
  RAIL 2.x synonym of [sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier).
- Global [RAIL_IEEE802154_ConvertRssiToEd](ieee802-15-4#rail-ieee802154-convert-rssi-to-ed)  (int8_t rssiDbm)  
  RAIL 2.x synonym of [sl_rail_ieee802154_convert_rssi_to_ed()](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-ed).
- Global [RAIL_IEEE802154_ConvertRssiToLqi](ieee802-15-4#rail-ieee802154-convert-rssi-to-lqi)  (uint8_t origLqi, int8_t rssiDbm)  
  RAIL 2.x synonym of [sl_rail_ieee802154_convert_rssi_to_lqi()](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-lqi).
- Global [RAIL_IEEE802154_Deinit](ieee802-15-4#rail-ieee802154-deinit)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_deinit()](ieee802-15-4#sl-rail-ieee802154-deinit).
- Global [RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#rail-ieee802154-e-option-enh-ack)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack).
- Global [RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT](ieee802-15-4#rail-ieee802154-e-option-enh-ack-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT](ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack-shift).
- Global [RAIL_IEEE802154_E_OPTION_GB868](ieee802-15-4#rail-ieee802154-e-option-gb868)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-e-option-gb868).
- Global [RAIL_IEEE802154_E_OPTION_GB868_SHIFT](ieee802-15-4#rail-ieee802154-e-option-gb868-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_GB868_SHIFT](ieee802-15-4#sl-rail-ieee802154-e-option-gb868-shift).
- Global [RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST](ieee802-15-4#rail-ieee802154-e-option-implicit-broadcast)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST](ieee802-15-4#sl-rail-ieee802154-e-option-implicit-broadcast).
- Global [RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT](ieee802-15-4#rail-ieee802154-e-option-implicit-broadcast-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT](ieee802-15-4#sl-rail-ieee802154-e-option-implicit-broadcast-shift).
- Global [RAIL_IEEE802154_E_OPTIONS_ALL](ieee802-15-4#rail-ieee802154-e-options-all)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTIONS_ALL](ieee802-15-4#sl-rail-ieee802154-e-options-all).
- Global [RAIL_IEEE802154_E_OPTIONS_DEFAULT](ieee802-15-4#rail-ieee802154-e-options-default)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTIONS_DEFAULT](ieee802-15-4#sl-rail-ieee802154-e-options-default).
- Global [RAIL_IEEE802154_E_OPTIONS_NONE](ieee802-15-4#rail-ieee802154-e-options-none)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_E_OPTIONS_NONE](ieee802-15-4#sl-rail-ieee802154-e-options-none).
- Global [RAIL_IEEE802154_EnableDataFramePending](ieee802-15-4#rail-ieee802154-enable-data-frame-pending)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_ieee802154_enable_data_frame_pending()](ieee802-15-4#sl-rail-ieee802154-enable-data-frame-pending).
- Global [RAIL_IEEE802154_EnableEarlyFramePending](ieee802-15-4#rail-ieee802154-enable-early-frame-pending)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_ieee802154_enable_early_frame_pending()](ieee802-15-4#sl-rail-ieee802154-enable-early-frame-pending).
- Global [RAIL_IEEE802154_EnableSignalDetection](ieee802-15-4#rail-ieee802154-enable-signal-detection)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_ieee802154_enable_signal_detection()](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection).
- Global [RAIL_IEEE802154_EnableSignalIdentifier](ieee802-15-4#rail-ieee802154-enable-signal-identifier)  
  RAIL 2.x synonym of [sl_rail_ieee802154_enable_signal_detection()](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection).
- Global [RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_e_options_t](ieee802-15-4#sl-rail-ieee802154-e-options-t).
- Global [RAIL_IEEE802154_G_OPTION_DYNFEC](ieee802-15-4#rail-ieee802154-g-option-dynfec)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_DYN_FEC](ieee802-15-4#sl-rail-ieee802154-g-option-dyn-fec).
- Global [RAIL_IEEE802154_G_OPTION_DYNFEC_SHIFT](ieee802-15-4#rail-ieee802154-g-option-dynfec-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_DYN_FEC_SHIFT](ieee802-15-4#sl-rail-ieee802154-g-option-dyn-fec-shift).
- Global [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-g-option-gb868).
- Global [RAIL_IEEE802154_G_OPTION_GB868_SHIFT](ieee802-15-4#rail-ieee802154-g-option-gb868-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_GB868_SHIFT](ieee802-15-4#sl-rail-ieee802154-g-option-gb868-shift).
- Global [RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH](ieee802-15-4#rail-ieee802154-g-option-wisun-modeswitch)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH](ieee802-15-4#sl-rail-ieee802154-g-option-wi-sun-mode-switch).
- Global [RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH_SHIFT](ieee802-15-4#rail-ieee802154-g-option-wisun-modeswitch-shift)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH_SHIFT](ieee802-15-4#sl-rail-ieee802154-g-option-wi-sun-mode-switch-shift).
- Global [RAIL_IEEE802154_G_OPTIONS_ALL](ieee802-15-4#rail-ieee802154-g-options-all)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTIONS_ALL](ieee802-15-4#sl-rail-ieee802154-g-options-all).
- Global [RAIL_IEEE802154_G_OPTIONS_DEFAULT](ieee802-15-4#rail-ieee802154-g-options-default)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTIONS_DEFAULT](ieee802-15-4#sl-rail-ieee802154-g-options-default).
- Global [RAIL_IEEE802154_G_OPTIONS_NONE](ieee802-15-4#rail-ieee802154-g-options-none)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_G_OPTIONS_NONE](ieee802-15-4#sl-rail-ieee802154-g-options-none).
- Global [RAIL_IEEE802154_GetAddress](ieee802-15-4#rail-ieee802154-get-address)  (RAIL_Handle_t railHandle, [RAIL_IEEE802154_Address_t](rail-ieee802154-address-t) *pAddress)  
  RAIL 2.x synonym of [sl_rail_ieee802154_get_address()](ieee802-15-4#sl-rail-ieee802154-get-address).
- Global [RAIL_IEEE802154_GetPtiRadioConfig](ieee802-15-4#rail-ieee802154-get-pti-radio-config)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_get_phy_id()](ieee802-15-4#sl-rail-ieee802154-get-phy-id).
- Global [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).
- Global [RAIL_IEEE802154_Init](ieee802-15-4#rail-ieee802154-init)  (RAIL_Handle_t railHandle, const [RAIL_IEEE802154_Config_t](rail-ieee802154-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init).
- Global [RAIL_IEEE802154_IsEnabled](ieee802-15-4#rail-ieee802154-is-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_is_enabled()](ieee802-15-4#sl-rail-ieee802154-is-enabled).
- Global [RAIL_IEEE802154_LongAddress](ieee802-15-4#rail-ieee802154-long-address)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_LONG_ADDRESS](ieee802-15-4#sl-rail-ieee802154-long-address).
- Global [RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#rail-ieee802154-max-addresses)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#sl-rail-ieee802154-max-addresses).
- Class [RAIL_IEEE802154_ModeSwitchPhr_t](rail-ieee802154-mode-switch-phr-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t](sl-rail-ieee802154-mode-switch-phr-t).
- Global [RAIL_IEEE802154_ModeSwitchPhr_t::phr](rail-ieee802154-mode-switch-phr-t#phr)  
  RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t::phr](sl-rail-ieee802154-mode-switch-phr-t#phr).
- Global [RAIL_IEEE802154_ModeSwitchPhr_t::phyModeId](rail-ieee802154-mode-switch-phr-t#phy-mode-id)  
  RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t::phy_mode_id](sl-rail-ieee802154-mode-switch-phr-t#phy-mode-id).
- Global [RAIL_IEEE802154_Phy2p4GHz](ieee802154-phy#rail-ieee802154-phy2p4-g-hz)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz).
- Global [RAIL_IEEE802154_Phy2p4GHzAntDiv](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-ant-div)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div).
- Global [RAIL_IEEE802154_Phy2p4GHzAntDivCoex](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-ant-div-coex)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-coex).
- Global [RAIL_IEEE802154_Phy2p4GHzAntDivCoexFem](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-ant-div-coex-fem)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-coex-fem).
- Global [RAIL_IEEE802154_Phy2p4GHzAntDivFem](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-ant-div-fem)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-fem).
- Global [RAIL_IEEE802154_Phy2p4GHzCoex](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-coex)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_coex](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-coex).
- Global [RAIL_IEEE802154_Phy2p4GHzCoexFem](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-coex-fem)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_coex_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-coex-fem).
- Global [RAIL_IEEE802154_Phy2p4GHzCustom1](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-custom1)  
  This RAIL 2.x PHY has been eliminated in RAIL 3; it is no longer supported.
- Global [RAIL_IEEE802154_Phy2p4GHzFem](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-fem)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-fem).
- Global [RAIL_IEEE802154_Phy2p4GHzRxChSwitching](ieee802154-phy#rail-ieee802154-phy2p4-g-hz-rx-ch-switching)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_rx_ch_switching](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-rx-ch-switching).
- Global [RAIL_IEEE802154_PhyGB863MHz](ieee802154-phy#rail-ieee802154-phy-gb863-m-hz)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_gb863_mhz](ieee802154-phy#sl-rail-ieee802154-phy-gb863-mhz).
- Global [RAIL_IEEE802154_PhyGB915MHz](ieee802154-phy#rail-ieee802154-phy-gb915-m-hz)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_gb915_mhz](ieee802154-phy#sl-rail-ieee802154-phy-gb915-mhz).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-antdiv)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-ant-div).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV_COEX](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-antdiv-coex)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV_COEX](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-ant-div-coex).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_COEX](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-coex)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_COEX](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-coex).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-fem)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-fem).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-fem-antdiv)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-fem-ant-div).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV_COEX](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-fem-antdiv-coex)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV_COEX](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-fem-ant-div-coex).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_COEX](ieee802-15-4#rail-ieee802154-pti-radio-config-2-p4-ghz-fem-coex)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_COEX](ieee802-15-4#sl-rail-ieee802154-phy-2-p4-ghz-fem-coex).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_863MHZ_GB868](ieee802-15-4#rail-ieee802154-pti-radio-config-863-mhz-gb868)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_863_MHZ_GB868](ieee802-15-4#sl-rail-ieee802154-phy-863-mhz-gb868).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_GB868](ieee802-15-4#rail-ieee802154-pti-radio-config-915-mhz-gb868)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_PHY_915_MHZ_GB868](ieee802-15-4#sl-rail-ieee802154-phy-915-mhz-gb868).
- Global [RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_R23_NA_EXT](ieee802-15-4#rail-ieee802154-pti-radio-config-915-mhz-r23-na-ext)  
  This RAIL 2.x built-in PHY is not supported in RAIL 3.
- Global [RAIL_IEEE802154_PtiRadioConfig_t](ieee802-15-4#rail-ieee802154-pti-radio-config-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_phy_t](ieee802-15-4#sl-rail-ieee802154-phy-t).
- Global [RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT](ieee802-15-4#rail-ieee802154-rx-channel-switching-buf-alignment)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT](ieee802-15-4#sl-rail-ieee802154-rx-channel-switching-buf-alignment).
- Global [RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE](ieee802-15-4#rail-ieee802154-rx-channel-switching-buf-alignment-type)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE](ieee802-15-4#sl-rail-ieee802154-rx-channel-switching-buf-alignment-type).
- Global [RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES](ieee802-15-4#rail-ieee802154-rx-channel-switching-buf-bytes)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES](ieee802-15-4#sl-rail-ieee802154-rx-channel-switching-buf-bytes).
- Global [RAIL_IEEE802154_RX_CHANNEL_SWITCHING_NUM_CHANNELS](ieee802-15-4#rail-ieee802154-rx-channel-switching-num-channels)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_NUM_CHANNELS](ieee802-15-4#sl-rail-ieee802154-rx-channel-switching-num-channels).
- Class [RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t).
- Global [RAIL_IEEE802154_RxChannelSwitchingCfg_t::buffer](rail-ieee802154-rx-channel-switching-cfg-t#buffer)  
  RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::p_buffer](sl-rail-ieee802154-rx-channel-switching-cfg-t#p-buffer).
- Global [RAIL_IEEE802154_RxChannelSwitchingCfg_t::bufferBytes](rail-ieee802154-rx-channel-switching-cfg-t#buffer-bytes)  
  RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::buffer_bytes](sl-rail-ieee802154-rx-channel-switching-cfg-t#buffer-bytes).
- Global [RAIL_IEEE802154_RxChannelSwitchingCfg_t::channels](rail-ieee802154-rx-channel-switching-cfg-t#channels)  [(2U)]  
  RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::channels](sl-rail-ieee802154-rx-channel-switching-cfg-t#channels).
- Global [RAIL_IEEE802154_SetAddresses](ieee802-15-4#rail-ieee802154-set-addresses)  (RAIL_Handle_t railHandle, const [RAIL_IEEE802154_AddrConfig_t](rail-ieee802154-addr-config-t) *addresses)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_addresses()](ieee802-15-4#sl-rail-ieee802154-set-addresses).
- Global [RAIL_IEEE802154_SetFramePending](ieee802-15-4#rail-ieee802154-set-frame-pending)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending).
- Global [RAIL_IEEE802154_SetLongAddress](ieee802-15-4#rail-ieee802154-set-long-address)  (RAIL_Handle_t railHandle, const uint8_t *longAddr, uint8_t index)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_long_address()](ieee802-15-4#sl-rail-ieee802154-set-long-address).
- Global [RAIL_IEEE802154_SetPanCoordinator](ieee802-15-4#rail-ieee802154-set-pan-coordinator)  (RAIL_Handle_t railHandle, bool isPanCoordinator)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_pan_coordinator()](ieee802-15-4#sl-rail-ieee802154-set-pan-coordinator).
- Global [RAIL_IEEE802154_SetPanId](ieee802-15-4#rail-ieee802154-set-pan-id)  (RAIL_Handle_t railHandle, uint16_t panId, uint8_t index)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_pan_id()](ieee802-15-4#sl-rail-ieee802154-set-pan-id).
- Global [RAIL_IEEE802154_SetPromiscuousMode](ieee802-15-4#rail-ieee802154-set-promiscuous-mode)  (RAIL_Handle_t railHandle, bool enable)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_promiscuous_mode()](ieee802-15-4#sl-rail-ieee802154-set-promiscuous-mode).
- Global [RAIL_IEEE802154_SetRxToEnhAckTx](ieee802-15-4#rail-ieee802154-set-rx-to-enh-ack-tx)  (RAIL_Handle_t railHandle, RAIL_TransitionTime_t *pRxToEnhAckTx)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_rx_to_enh_ack_tx()](ieee802-15-4#sl-rail-ieee802154-set-rx-to-enh-ack-tx).
- Global [RAIL_IEEE802154_SetShortAddress](ieee802-15-4#rail-ieee802154-set-short-address)  (RAIL_Handle_t railHandle, uint16_t shortAddr, uint8_t index)  
  RAIL 2.x synonym of [sl_rail_ieee802154_set_short_address()](ieee802-15-4#sl-rail-ieee802154-set-short-address).
- Global [RAIL_IEEE802154_ShortAddress](ieee802-15-4#rail-ieee802154-short-address)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SHORT_ADDRESS](ieee802-15-4#sl-rail-ieee802154-short-address).
- Global [RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154](ieee802-15-4#rail-ieee802154-signal-identifier-mode-154)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154](ieee802-15-4#sl-rail-ieee802154-signal-identifier-mode-154).
- Global [RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE](ieee802-15-4#rail-ieee802154-signal-identifier-mode-disable)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE](ieee802-15-4#sl-rail-ieee802154-signal-identifier-mode-disable).
- Global [RAIL_IEEE802154_SignalIdentifierMode_t](ieee802-15-4#rail-ieee802154-signal-identifier-mode-t)  
  RAIL 2.x synonym of [sl_rail_ieee802154_signal_identifier_mode_t](ieee802-15-4#sl-rail-ieee802154-signal-identifier-mode-t).
- Global [RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-cancel-frame-pending-lookup-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup-1).
- Global [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1).
- Global [RAIL_IEEE802154_SUPPORTS_CUSTOM1_PHY](features#rail-ieee802154-supports-custom1-phy-1)  
  This RAIL 2.x define has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG](features#rail-ieee802154-supports-dual-pa-config-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG](features#sl-rail-ieee802154-supports-dual-pa-config-1).
- Global [RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#rail-ieee802154-supports-e-enhanced-ack-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#sl-rail-ieee802154-supports-e-enhanced-ack-1).
- Global [RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#rail-ieee802154-supports-e-multipurpose-frames-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#sl-rail-ieee802154-supports-e-multipurpose-frames-1).
- Global [RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#rail-ieee802154-supports-e-subset-gb868-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#sl-rail-ieee802154-supports-e-subset-gb868-1).
- Global [RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-early-frame-pending-lookup-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-early-frame-pending-lookup-1).
- Global [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_4BYTE_CRC](features#rail-ieee802154-supports-g-4-byte-crc)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_4_BYTE_CRC](features#sl-rail-ieee802154-supports-g-4-byte-crc-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_DYNFEC](features#rail-ieee802154-supports-g-dynfec)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_DYN_FEC](features#sl-rail-ieee802154-supports-g-dyn-fec-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_MODESWITCH](features#rail-ieee802154-supports-g-modeswitch)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_MODE_SWITCH](features#sl-rail-ieee802154-supports-g-mode-switch-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#rail-ieee802154-supports-g-subset-gb868-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#sl-rail-ieee802154-supports-g-subset-gb868-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#rail-ieee802154-supports-g-unwhitened-rx-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#sl-rail-ieee802154-supports-g-unwhitened-rx-1).
- Global [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#rail-ieee802154-supports-g-unwhitened-tx-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#sl-rail-ieee802154-supports-g-unwhitened-tx-1).
- Global [RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1).
- Global [RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ieee802154-supports-signal-identifier-1)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ieee802154-supports-signal-identifier-1).
- Global [RAIL_IEEE802154_SupportsCancelFramePendingLookup](features#rail-ieee802154-supports-cancel-frame-pending-lookup)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_cancel_frame_pending_lookup()](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup).
- Global [RAIL_IEEE802154_SupportsCoexPhy](features#rail-ieee802154-supports-coex-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_coex_phy()](features#sl-rail-ieee802154-supports-coex-phy).
- Global [RAIL_IEEE802154_SupportsCustom1Phy](features#rail-ieee802154-supports-custom1-phy)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_IEEE802154_SupportsDualPaConfig](features#rail-ieee802154-supports-dual-pa-config)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_dual_pa_config()](features#sl-rail-ieee802154-supports-dual-pa-config).
- Global [RAIL_IEEE802154_SupportsEarlyFramePendingLookup](features#rail-ieee802154-supports-early-frame-pending-lookup)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_early_frame_pending_lookup()](features#sl-rail-ieee802154-supports-early-frame-pending-lookup).
- Global [RAIL_IEEE802154_SupportsEEnhancedAck](features#rail-ieee802154-supports-e-enhanced-ack)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_enhanced_ack()](features#sl-rail-ieee802154-supports-e-enhanced-ack).
- Global [RAIL_IEEE802154_SupportsEMultipurposeFrames](features#rail-ieee802154-supports-e-multipurpose-frames)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_multipurpose_frames()](features#sl-rail-ieee802154-supports-e-multipurpose-frames).
- Global [RAIL_IEEE802154_SupportsESubsetGB868](features#rail-ieee802154-supports-e-subset-gb868)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_subset_gb868()](features#sl-rail-ieee802154-supports-e-subset-gb868).
- Global [RAIL_IEEE802154_SupportsFemPhy](features#rail-ieee802154-supports-fem-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_fem_phy()](features#sl-rail-ieee802154-supports-fem-phy).
- Global [RAIL_IEEE802154_SupportsG4ByteCrc](features#rail-ieee802154-supports-g4-byte-crc)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_4_byte_crc()](features#sl-rail-ieee802154-supports-g-4-byte-crc).
- Global [RAIL_IEEE802154_SupportsGDynFec](features#rail-ieee802154-supports-g-dyn-fec)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_dyn_fec()](features#sl-rail-ieee802154-supports-g-dyn-fec).
- Global [RAIL_IEEE802154_SupportsGModeSwitch](features#rail-ieee802154-supports-g-mode-switch)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_mode_switch()](features#sl-rail-ieee802154-supports-g-mode-switch).
- Global [RAIL_IEEE802154_SupportsGSubsetGB868](features#rail-ieee802154-supports-g-subset-gb868)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_subset_gb868()](features#sl-rail-ieee802154-supports-g-subset-gb868).
- Global [RAIL_IEEE802154_SupportsGUnwhitenedRx](features#rail-ieee802154-supports-g-unwhitened-rx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_unwhitened_rx()](features#sl-rail-ieee802154-supports-g-unwhitened-rx).
- Global [RAIL_IEEE802154_SupportsGUnwhitenedTx](features#rail-ieee802154-supports-g-unwhitened-tx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_unwhitened_tx()](features#sl-rail-ieee802154-supports-g-unwhitened-tx).
- Global [RAIL_IEEE802154_SupportsRxChannelSwitching](features#rail-ieee802154-supports-rx-channel-switching)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_rx_channel_switching()](features#sl-rail-ieee802154-supports-rx-channel-switching).
- Global [RAIL_IEEE802154_SupportsSignalIdentifier](features#rail-ieee802154-supports-signal-identifier)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_signal_identifier()](features#sl-rail-ieee802154-supports-signal-identifier).
- Global [RAIL_IEEE802154_ToggleFramePending](ieee802-15-4#rail-ieee802154-toggle-frame-pending)  
  RAIL 2.x synonym of [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending).
- Global [RAIL_IEEE802154_WriteEnhAck](ieee802-15-4#rail-ieee802154-write-enh-ack)  (RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)  
  RAIL 2.x synonym of [sl_rail_ieee802154_write_enh_ack()](ieee802-15-4#sl-rail-ieee802154-write-enh-ack).
- Global [RAIL_IncludeFrameTypeLength](receive#rail-include-frame-type-length)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_include_frame_type_length()](receive#sl-rail-include-frame-type-length).
- Global [RAIL_Init](general#rail-init)  (const [RAIL_Config_t](rail-config-t) *railCfg, RAIL_InitCompleteCallbackPtr_t cb)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_init()](general#sl-rail-init) with different parameters, return value, and functionality allowing per-protocol configuration of Rx FIFO and Rx Packet Queue (formerly hidden in RAIL 2.x and shared across all protocols in multiprotocol applications), in addition to configuring the Tx FIFO. See [sl_rail_config_t](sl-rail-config-t).
- Global [RAIL_InitCompleteCallbackPtr_t](general#rail-init-complete-callback-ptr-t)  )(RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_init_complete_callback_t()](general#sl-rail-init-complete-callback-t).
- Global [RAIL_InitPowerManager](sleep#rail-init-power-manager)  (void)  
  RAIL 2.x synonym of [sl_rail_init_power_manager()](sleep#sl-rail-init-power-manager).
- Global [RAIL_InitTxPowerCurves](pa-curve-conversions#rail-init-tx-power-curves)  (const [RAIL_TxPowerCurvesConfig_t](rail-tx-power-curves-config-t) *config)  
  This function is no longer supported in RAIL 2.x. Must use [RAIL_InitTxPowerCurvesAlt()](pa-curve-conversions#rail-init-tx-power-curves-alt) instead.
- Global [RAIL_InitTxPowerCurvesAlt](pa-curve-conversions#rail-init-tx-power-curves-alt)  (const [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t) *config)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_init_tx_power_table()](pa-power-conversions#sl-rail-util-pa-init-tx-power-table) with different parameters.
- Global [RAIL_INVALID_PPM_VALUE](external-thermistor#rail-invalid-ppm-value)  
  RAIL 2.x synonym of [SL_RAIL_INVALID_PPM_VALUE](external-thermistor#sl-rail-invalid-ppm-value).
- Global [RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#rail-invalid-thermistor-value)  
  RAIL 2.x synonym of [SL_RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#sl-rail-invalid-thermistor-value).
- Global [RAIL_IRCALVAL](calibration#rail-ircalval)  (irCalStruct, rfPath)  
  RAIL 2.x synonym of [SL_RAIL_IR_CAL_VAL](calibration#sl-rail-ir-cal-val).
- Global [RAIL_IRCALVALUES_RX_UNINIT](calibration#rail-ircalvalues-rx-uninit)  
  RAIL 2.x synonym of [SL_RAIL_RX_IR_CAL_VALUES_UNINIT](calibration#sl-rail-rx-ir-cal-values-uninit).
- Class [RAIL_IrCalValues_t](rail-ir-cal-values-t)  
  RAIL 2.x synonym of [sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t).
- Global [RAIL_IrCalValues_t::rxIrCalValues](rail-ir-cal-values-t#rx-ir-cal-values)  
  RAIL 2.x synonym of [sl_rail_ir_cal_values_t::rx_ir_cal_values](sl-rail-ir-cal-values-t#rx-ir-cal-values).
- Global [RAIL_IrCalValues_t::txIrCalValues](rail-ir-cal-values-t#tx-ir-cal-values)  
  RAIL 2.x synonym of [sl_rail_ir_cal_values_t::tx_ir_cal_values](sl-rail-ir-cal-values-t#tx-ir-cal-values).
- Global [RAIL_IRCALVALUES_TX_UNINIT](calibration#rail-ircalvalues-tx-uninit)  
  RAIL 2.x synonym of [SL_RAIL_TX_IR_CAL_VALUES_UNINIT](calibration#sl-rail-tx-ir-cal-values-uninit).
- Global [RAIL_IRCALVALUES_UNINIT](calibration#rail-ircalvalues-uninit)  
  RAIL 2.x synonym of [SL_RAIL_IR_CAL_VALUES_UNINIT](calibration#sl-rail-ir-cal-values-uninit).
- Global [RAIL_IsAddressFilterEnabled](address-filtering#rail-is-address-filter-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_address_filter_enabled()](address-filtering#sl-rail-is-address-filter-enabled).
- Global [RAIL_IsAutoAckEnabled](auto-ack#rail-is-auto-ack-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_auto_ack_enabled()](auto-ack#sl-rail-is-auto-ack-enabled).
- Global [RAIL_IsAutoAckWaitingForAck](auto-ack#rail-is-auto-ack-waiting-for-ack)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_auto_ack_waiting_for_ack()](auto-ack#sl-rail-is-auto-ack-waiting-for-ack).
- Global [RAIL_IsAverageRssiReady](receive#rail-is-average-rssi-ready)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_average_rssi_ready()](receive#sl-rail-is-average-rssi-ready).
- Global [RAIL_IsInitialized](general#rail-is-initialized)  (void)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_initialized()](general#sl-rail-is-initialized) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_IsMultiTimerExpired](system-timing#rail-is-multi-timer-expired)  ([RAIL_MultiTimer_t](rail-multi-timer-t) *tmr)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_multi_timer_expired()](system-timing#sl-rail-is-multi-timer-expired) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_IsMultiTimerRunning](system-timing#rail-is-multi-timer-running)  ([RAIL_MultiTimer_t](rail-multi-timer-t) *tmr)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_multi_timer_running()](system-timing#sl-rail-is-multi-timer-running) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_IsNextCcaNow](packet-tx#rail-is-next-cca-now)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_next_cca_now()](packet-tx#sl-rail-is-next-cca-now).
- Global [RAIL_IsPaAutoModeEnabled](pa#rail-is-pa-auto-mode-enabled)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_IsRfSensed](rf-sense#rail-is-rf-sensed)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_rf_sensed()](rf-sense#sl-rail-is-rf-sensed).
- Global [RAIL_IsRxAutoAckPaused](auto-ack#rail-is-rx-auto-ack-paused)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_rx_auto_ack_paused()](auto-ack#sl-rail-is-rx-auto-ack-paused).
- Global [RAIL_IsTimerExpired](system-timing#rail-is-timer-expired)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_timer_expired()](system-timing#sl-rail-is-timer-expired).
- Global [RAIL_IsTimerRunning](system-timing#rail-is-timer-running)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_timer_running()](system-timing#sl-rail-is-timer-running).
- Global [RAIL_IsTxAutoAckPaused](auto-ack#rail-is-tx-auto-ack-paused)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_tx_auto_ack_paused()](auto-ack#sl-rail-is-tx-auto-ack-paused).
- Global [RAIL_IsTxHoldOffEnabled](transmit#rail-is-tx-hold-off-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_is_tx_hold_off_enabled()](transmit#sl-rail-is-tx-hold-off-enabled).
- Global [RAIL_IsValidChannel](radio-configuration#rail-is-valid-channel)  (RAIL_Handle_t railHandle, uint16_t channel)  
  RAIL 2.x synonym of [sl_rail_is_valid_channel()](radio-configuration#sl-rail-is-valid-channel).
- Global [RAIL_IsVdetEnabled](vdet#rail-is-vdet-enabled)  (RAIL_Handle_t genericRailHandle)  
  RAIL 2.x synonym of [sl_rail_is_vdet_enabled()](vdet#sl-rail-is-vdet-enabled).
- Global [RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V2_4_1](transmit#rail-lbt-config-etsi-en-300-220-1-v2-4-1)  
  RAIL 2.x synonym of [SL_RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V2_4_1](transmit#sl-rail-lbt-config-etsi-en-300-220-1-v2-4-1).
- Global [RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V3_1_0](transmit#rail-lbt-config-etsi-en-300-220-1-v3-1-0)  
  RAIL 2.x synonym of [SL_RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V3_1_0](transmit#sl-rail-lbt-config-etsi-en-300-220-1-v3-1-0).
- Class [RAIL_LbtConfig_t](rail-lbt-config-t)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t](sl-rail-lbt-config-t).
- Global [RAIL_LbtConfig_t::lbtBackoff](rail-lbt-config-t#lbt-backoff)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_backoff_us](sl-rail-lbt-config-t#lbt-backoff-us).
- Global [RAIL_LbtConfig_t::lbtDuration](rail-lbt-config-t#lbt-duration)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_duration_us](sl-rail-lbt-config-t#lbt-duration-us).
- Global [RAIL_LbtConfig_t::lbtMaxBoRand](rail-lbt-config-t#lbt-max-bo-rand)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_max_bo_rand](sl-rail-lbt-config-t#lbt-max-bo-rand).
- Global [RAIL_LbtConfig_t::lbtMinBoRand](rail-lbt-config-t#lbt-min-bo-rand)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_min_bo_rand](sl-rail-lbt-config-t#lbt-min-bo-rand).
- Global [RAIL_LbtConfig_t::lbtThreshold](rail-lbt-config-t#lbt-threshold)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_threshold_dbm](sl-rail-lbt-config-t#lbt-threshold-dbm).
- Global [RAIL_LbtConfig_t::lbtTimeout](rail-lbt-config-t#lbt-timeout)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_timeout_us](sl-rail-lbt-config-t#lbt-timeout-us).
- Global [RAIL_LbtConfig_t::lbtTries](rail-lbt-config-t#lbt-tries)  
  RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_tries](sl-rail-lbt-config-t#lbt-tries).
- Global [RAIL_MAX_CSMA_EXPONENT](transmit#rail-max-csma-exponent)  
  RAIL 2.x synonym of [SL_RAIL_MAX_CSMA_EXPONENT](transmit#sl-rail-max-csma-exponent).
- Global [RAIL_MAX_LBT_TRIES](transmit#rail-max-lbt-tries)  
  RAIL 2.x synonym of [SL_RAIL_MAX_LBT_TRIES](transmit#sl-rail-max-lbt-tries).
- Global [RAIL_MAX_RF_PATHS](calibration#rail-max-rf-paths)  
  RAIL 2.x synonym of [SL_RAIL_MAX_RF_PATHS](calibration#sl-rail-max-rf-paths).
- Global [RAIL_MAXIMUM_TRANSITION_US](state-transitions-efr32-xg2-x#rail-maximum-transition-us)  
  RAIL 2.x synonym of [SL_RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-maximum-transition-us).  
  RAIL 2.x. synonym of [SL_RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-maximum-transition-us).
- Class [RAIL_MFM_PingPongBufferConfig_t](rail-mfm-ping-pong-buffer-config-t)  
  RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t](sl-rail-mfm-ping-pong-buffer-config-t).
- Global [RAIL_MFM_PingPongBufferConfig_t::bufferSizeWords](rail-mfm-ping-pong-buffer-config-t#buffer-size-words)  
  RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::buffer_words](sl-rail-mfm-ping-pong-buffer-config-t#buffer-words).
- Global [RAIL_MFM_PingPongBufferConfig_t::pBuffer0](rail-mfm-ping-pong-buffer-config-t#p-buffer0)  
  RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_0](sl-rail-mfm-ping-pong-buffer-config-t#p-buffer-0).
- Global [RAIL_MFM_PingPongBufferConfig_t::pBuffer1](rail-mfm-ping-pong-buffer-config-t#p-buffer1)  
  RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_1](sl-rail-mfm-ping-pong-buffer-config-t#p-buffer-1).
- Global [RAIL_MINIMUM_TRANSITION_US](state-transitions-efr32-xg2-x#rail-minimum-transition-us)  
  RAIL 2.x synonym of [SL_RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-minimum-transition-us).  
  RAIL 2.x. synonym of [SL_RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-minimum-transition-us).
- Class [RAIL_MultiTimer](rail-multi-timer)  
  RAIL 2.x synonym of [sl_rail_multi_timer](sl-rail-multi-timer).
- Class [RAIL_MultiTimer_t](rail-multi-timer-t)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t](sl-rail-multi-timer-t).
- Global [RAIL_MultiTimer_t::absOffset](rail-multi-timer-t#abs-offset)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::abs_offset](sl-rail-multi-timer-t#abs-offset).
- Global [RAIL_MultiTimer_t::callback](rail-multi-timer-t#callback)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::callback](sl-rail-multi-timer-t#callback).
- Global [RAIL_MultiTimer_t::cbArg](rail-multi-timer-t#cb-arg)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::cb_arg](sl-rail-multi-timer-t#cb-arg).
- Global [RAIL_MultiTimer_t::doCallback](rail-multi-timer-t#do-callback)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::do_callback](sl-rail-multi-timer-t#do-callback).
- Global [RAIL_MultiTimer_t::isRunning](rail-multi-timer-t#is-running)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::is_running](sl-rail-multi-timer-t#is-running).
- Global [RAIL_MultiTimer_t::next](rail-multi-timer-t#next)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::next](sl-rail-multi-timer-t#next).
- Global [RAIL_MultiTimer_t::priority](rail-multi-timer-t#priority)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::priority](sl-rail-multi-timer-t#priority).
- Global [RAIL_MultiTimer_t::relPeriodic](rail-multi-timer-t#rel-periodic)  
  RAIL 2.x synonym of [sl_rail_multi_timer_t::rel_periodic](sl-rail-multi-timer-t#rel-periodic).
- Global [RAIL_MultiTimerCallback_t](system-timing#rail-multi-timer-callback-t)  )(struct [RAIL_MultiTimer](rail-multi-timer) *tmr, RAIL_Time_t expectedTimeOfEvent, void *cbArg)  
  RAIL 2.x synonym of [sl_rail_multi_timer_callback_t()](system-timing#sl-rail-multi-timer-callback-t).
- Global [RAIL_NUM_PA](pa-efr32-xg2-x#rail-num-pa)  
  RAIL 2.x synonym of [SL_RAIL_NUM_PA](pa-efr32-xg2-x#sl-rail-num-pa).
- Global [RAIL_NUM_ZWAVE_CHANNELS](z-wave#rail-num-zwave-channels)  
  RAIL 2.x synonym of [SL_RAIL_NUM_ZWAVE_CHANNELS](z-wave#sl-rail-num-zwave-channels).
- Global [RAIL_PA_ALGORITHM_COUNT](pa-curve-conversions#rail-pa-algorithm-count)  
  This RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_PA_ALGORITHM_DBM_POWERSETTING_MAPPING_TABLE](pa-curve-conversions#rail-pa-algorithm-dbm-powersetting-mapping-table)  
  This RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_PA_ALGORITHM_MAPPING_TABLE](pa-curve-conversions#rail-pa-algorithm-mapping-table)  
  This RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_PA_ALGORITHM_PIECEWISE_LINEAR](pa-curve-conversions#rail-pa-algorithm-piecewise-linear)  
  This RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_PA_BAND_2P4GIG](pa#rail-pa-band-2-p4-gig)  
  This RAIL 2.x enum value has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PA_BAND_COUNT](pa#rail-pa-band-count)  
  This RAIL 2.x enum value has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PA_BAND_SUBGIG](pa#rail-pa-band-subgig)  
  This RAIL 2.x enum value has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaAutoModeConfig](pa#rail-pa-auto-mode-config)  
  This RAIL 2.x variable has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Class [RAIL_PaAutoModeConfigEntry_t](rail-pa-auto-mode-config-entry-t)  
  This RAIL 2.x type has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaAutoModeConfigEntry_t::band](rail-pa-auto-mode-config-entry-t#band)  
  This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaAutoModeConfigEntry_t::max](rail-pa-auto-mode-config-entry-t#max)  
  This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaAutoModeConfigEntry_t::min](rail-pa-auto-mode-config-entry-t#min)  
  This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaAutoModeConfigEntry_t::mode](rail-pa-auto-mode-config-entry-t#mode)  
  This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PaBand_t](pa#rail-pa-band-t)  
  This RAIL 2.x enum has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAIL_PACKET_TIME_AT_PACKET_END](system-timing#rail-packet-time-at-packet-end)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_PACKET_END](system-timing#sl-rail-packet-time-at-packet-end).
- Global [RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL](system-timing#rail-packet-time-at-packet-end-used-total)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL](system-timing#sl-rail-packet-time-at-packet-end-used-total).
- Global [RAIL_PACKET_TIME_AT_PREAMBLE_START](system-timing#rail-packet-time-at-preamble-start)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_PREAMBLE_START](system-timing#sl-rail-packet-time-at-preamble-start).
- Global [RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL](system-timing#rail-packet-time-at-preamble-start-used-total)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL](system-timing#sl-rail-packet-time-at-preamble-start-used-total).
- Global [RAIL_PACKET_TIME_AT_SYNC_END](system-timing#rail-packet-time-at-sync-end)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_SYNC_END](system-timing#sl-rail-packet-time-at-sync-end).
- Global [RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL](system-timing#rail-packet-time-at-sync-end-used-total)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL](system-timing#sl-rail-packet-time-at-sync-end-used-total).
- Global [RAIL_PACKET_TIME_COUNT](system-timing#rail-packet-time-count)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_COUNT](system-timing#sl-rail-packet-time-count).
- Global [RAIL_PACKET_TIME_DEFAULT](system-timing#rail-packet-time-default)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_DEFAULT](system-timing#sl-rail-packet-time-default).
- Global [RAIL_PACKET_TIME_INVALID](system-timing#rail-packet-time-invalid)  
  RAIL 2.x synonym of [SL_RAIL_PACKET_TIME_INVALID](system-timing#sl-rail-packet-time-invalid).
- Global [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t)  
  RAIL 2.x synonym of [sl_rail_packet_time_position_t](system-timing#sl-rail-packet-time-position-t).
- Class [RAIL_PacketTimeStamp_t](rail-packet-time-stamp-t)  
  RAIL 2.x synonym of [sl_rail_packet_time_stamp_t](sl-rail-packet-time-stamp-t).
- Global [RAIL_PacketTimeStamp_t::packetDurationUs](rail-packet-time-stamp-t#packet-duration-us)  
  RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::packet_duration_us](sl-rail-packet-time-stamp-t#packet-duration-us).
- Global [RAIL_PacketTimeStamp_t::packetTime](rail-packet-time-stamp-t#packet-time)  
  RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::packet_time](sl-rail-packet-time-stamp-t#packet-time).
- Global [RAIL_PacketTimeStamp_t::timePosition](rail-packet-time-stamp-t#time-position)  
  RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::time_position](sl-rail-packet-time-stamp-t#time-position).
- Global [RAIL_PacketTimeStamp_t::totalPacketBytes](rail-packet-time-stamp-t#total-packet-bytes)  
  RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::total_packet_bytes](sl-rail-packet-time-stamp-t#total-packet-bytes).
- Global [RAIL_PaConversionAlgorithm_t](pa-curve-conversions#rail-pa-conversion-algorithm-t)  
  This RAIL 2.x enum has been eliminated in RAIL 3 which uses PA power tables instead.
- Global [RAIL_PACTUNE_IGNORE](calibration#rail-pactune-ignore)  
  This RAIL 2.x define has been eliminated in RAIL 3.
- Class [RAIL_PaDescriptor_t](rail-pa-descriptor-t)  
  This RAIL 2.x type has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t) with different fields.
- Global [RAIL_PaDescriptor_t::algorithm](rail-pa-descriptor-t#algorithm)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PaDescriptor_t::conversion](rail-pa-descriptor-t#conversion)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PaDescriptor_t::max](rail-pa-descriptor-t#max)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PaDescriptor_t::min](rail-pa-descriptor-t#min)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PaDescriptor_t::segments](rail-pa-descriptor-t#segments)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PaPowerSetting_t](pa#rail-pa-power-setting-t)  
  RAIL 2.x synonym for [sl_rail_pa_power_setting_t](pa#sl-rail-pa-power-setting-t).
- Global [RAIL_PauseRxAutoAck](auto-ack#rail-pause-rx-auto-ack)  (RAIL_Handle_t railHandle, bool pause)  
  RAIL 2.x synonym of [sl_rail_pause_rx_auto_ack()](auto-ack#sl-rail-pause-rx-auto-ack).
- Global [RAIL_PauseTxAutoAck](auto-ack#rail-pause-tx-auto-ack)  (RAIL_Handle_t railHandle, bool pause)  
  RAIL 2.x synonym of [sl_rail_pause_tx_auto_ack()](auto-ack#sl-rail-pause-tx-auto-ack).
- Global [RAIL_PeekRxPacket](receive#rail-peek-rx-packet)  (RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, uint8_t *pDst, uint16_t len, uint16_t offset)  
  RAIL 2.x synonym of [sl_rail_peek_rx_packet()](receive#sl-rail-peek-rx-packet).
- Global [RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE](pa-sixx3-xx#rail-power-mode-is-any-dbm-powersetting-mapping-table)  (x)  
  RAIL 2.x. synonym of [SL_RAIL_NUM_PA](pa-efr32-xg2-x#sl-rail-num-pa).  
  RAIL 2.x. synonym of [SL_RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE()](pa-efr32-xg2-x#sl-rail-power-mode-is-any-dbm-powersetting-mapping-table).  
  RAIL 2.x synonym of [SL_RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE()](pa-efr32-xg2-x#sl-rail-power-mode-is-any-dbm-powersetting-mapping-table).
- Global [RAIL_POWER_MODE_IS_ANY_OFDM](pa#rail-power-mode-is-any-ofdm)  (x)  
  RAIL 2.x synonym for [SL_RAIL_POWER_MODE_IS_ANY_OFDM()](pa#sl-rail-power-mode-is-any-ofdm).
- Global [RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_OFDM](pa#rail-power-mode-is-dbm-powersetting-mapping-table-ofdm)  (x)  
  RAIL 2.x synonym for [SL_RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_OFDM()](pa#sl-rail-power-mode-is-dbm-powersetting-mapping-table-ofdm).
- Global [RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_SUBGIG](pa#rail-power-mode-is-dbm-powersetting-mapping-table-subgig)  (x)  
  RAIL 2.x synonym for [SL_RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_SUB_GHZ()](pa#sl-rail-power-mode-is-dbm-powersetting-mapping-table-sub-ghz).
- Global [RAIL_POWER_MODE_SUPPORTS_RAW_SETTING](pa-efr32-xg2-x#rail-power-mode-supports-raw-setting)  (x)  
  RAIL 2.x synonym of [SL_RAIL_POWER_MODE_SUPPORTS_RAW_SETTING()](pa-efr32-xg2-x#sl-rail-power-mode-supports-raw-setting).  
  RAIL 2.x. synonym of [SL_RAIL_POWER_MODE_SUPPORTS_RAW_SETTING()](pa-efr32-xg2-x#sl-rail-power-mode-supports-raw-setting).
- Class [RAIL_PowerConversion_t](rail-power-conversion-t)  
  This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. See [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t).
- Global [RAIL_PowerConversion_t::mappingTable](rail-power-conversion-t#mapping-table)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PowerConversion_t::powerCurve](rail-power-conversion-t#power-curve)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_PrepareChannel](radio-configuration#rail-prepare-channel)  (RAIL_Handle_t railHandle, uint16_t channel)  
  RAIL 2.x synonym of [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel).
- Class [RAIL_PrsLnaBypassConfig_t](rail-prs-lna-bypass-config-t)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t](sl-rail-prs-lna-bypass-config-t).
- Global [RAIL_PrsLnaBypassConfig_t::deltaRssiDbm](rail-prs-lna-bypass-config-t#delta-rssi-dbm)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::delta_rssi_db](sl-rail-prs-lna-bypass-config-t#delta-rssi-db).
- Global [RAIL_PrsLnaBypassConfig_t::polarity](rail-prs-lna-bypass-config-t#polarity)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::polarity](sl-rail-prs-lna-bypass-config-t#polarity).
- Global [RAIL_PrsLnaBypassConfig_t::prsChannel](rail-prs-lna-bypass-config-t#prs-channel)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::prs_channel](sl-rail-prs-lna-bypass-config-t#prs-channel).
- Global [RAIL_PrsLnaBypassConfig_t::threshold](rail-prs-lna-bypass-config-t#threshold)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::threshold](sl-rail-prs-lna-bypass-config-t#threshold).
- Global [RAIL_PrsLnaBypassConfig_t::timeoutUs](rail-prs-lna-bypass-config-t#timeout-us)  
  RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::timeout_us](sl-rail-prs-lna-bypass-config-t#timeout-us).
- Global [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled)  
  RAIL 2.x synonym of [SL_RAIL_PTI_MODE_DISABLED](pti#sl-rail-pti-mode-disabled).
- Global [RAIL_PTI_MODE_SPI](pti#rail-pti-mode-spi)  
  RAIL 2.x synonym of [SL_RAIL_PTI_MODE_SPI](pti#sl-rail-pti-mode-spi).
- Global [RAIL_PTI_MODE_UART](pti#rail-pti-mode-uart)  
  RAIL 2.x synonym of [SL_RAIL_PTI_MODE_UART](pti#sl-rail-pti-mode-uart).
- Global [RAIL_PTI_MODE_UART_ONEWIRE](pti#rail-pti-mode-uart-onewire)  
  RAIL 2.x synonym of [SL_RAIL_PTI_MODE_UART_ONEWIRE](pti#sl-rail-pti-mode-uart-onewire).
- Global [RAIL_PTI_PROTOCOL_802154](pti#rail-pti-protocol-802154)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_802154](pti#sl-rail-pti-protocol-802154).
- Global [RAIL_PTI_PROTOCOL_BLE](pti#rail-pti-protocol-ble)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_BLE](pti#sl-rail-pti-protocol-ble).
- Global [RAIL_PTI_PROTOCOL_BTC](pti#rail-pti-protocol-btc)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_BTC](pti#sl-rail-pti-protocol-btc).
- Global [RAIL_PTI_PROTOCOL_CONNECT](pti#rail-pti-protocol-connect)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_CONNECT](pti#sl-rail-pti-protocol-connect).
- Global [RAIL_PTI_PROTOCOL_CUSTOM](pti#rail-pti-protocol-custom)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_CUSTOM](pti#sl-rail-pti-protocol-custom).
- Global [RAIL_PTI_PROTOCOL_SIDEWALK](pti#rail-pti-protocol-sidewalk)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_SIDEWALK](pti#sl-rail-pti-protocol-sidewalk).
- Global [RAIL_PTI_PROTOCOL_THREAD](pti#rail-pti-protocol-thread)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_THREAD](pti#sl-rail-pti-protocol-thread).
- Global [RAIL_PTI_PROTOCOL_WISUN](pti#rail-pti-protocol-wisun)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_WI_SUN](pti#sl-rail-pti-protocol-wi-sun).
- Global [RAIL_PTI_PROTOCOL_ZIGBEE](pti#rail-pti-protocol-zigbee)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_ZIGBEE](pti#sl-rail-pti-protocol-zigbee).
- Global [RAIL_PTI_PROTOCOL_ZWAVE](pti#rail-pti-protocol-zwave)  
  RAIL 2.x synonym of [SL_RAIL_PTI_PROTOCOL_ZWAVE](pti#sl-rail-pti-protocol-zwave).
- Class [RAIL_PtiConfig_t](rail-pti-config-t)  
  RAIL 2.x synonym of [sl_rail_pti_config_t](sl-rail-pti-config-t).
- Global [RAIL_PtiConfig_t::baud](rail-pti-config-t#baud)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::baud](sl-rail-pti-config-t#baud).
- Global [RAIL_PtiConfig_t::dclkLoc](rail-pti-config-t#dclk-loc)  
  No longer used (ignored); see [sl_rail_pti_config_t::reserved_1](sl-rail-pti-config-t#reserved-1).
- Global [RAIL_PtiConfig_t::dclkPin](rail-pti-config-t#dclk-pin)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dclk_pin](sl-rail-pti-config-t#dclk-pin).
- Global [RAIL_PtiConfig_t::dclkPort](rail-pti-config-t#dclk-port)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dclk_port](sl-rail-pti-config-t#dclk-port).
- Global [RAIL_PtiConfig_t::dframeLoc](rail-pti-config-t#dframe-loc)  
  No longer used (ignored); see [sl_rail_pti_config_t::reserved_2](sl-rail-pti-config-t#reserved-2).
- Global [RAIL_PtiConfig_t::dframePin](rail-pti-config-t#dframe-pin)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dframe_pin](sl-rail-pti-config-t#dframe-pin).
- Global [RAIL_PtiConfig_t::dframePort](rail-pti-config-t#dframe-port)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dframe_port](sl-rail-pti-config-t#dframe-port).
- Global [RAIL_PtiConfig_t::doutLoc](rail-pti-config-t#dout-loc)  
  No longer used (ignored); see [sl_rail_pti_config_t::reserved_0](sl-rail-pti-config-t#reserved-0).
- Global [RAIL_PtiConfig_t::doutPin](rail-pti-config-t#dout-pin)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dout_pin](sl-rail-pti-config-t#dout-pin).
- Global [RAIL_PtiConfig_t::doutPort](rail-pti-config-t#dout-port)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::dout_port](sl-rail-pti-config-t#dout-port).
- Global [RAIL_PtiConfig_t::mode](rail-pti-config-t#mode)  
  RAIL 2.x synonym of [sl_rail_pti_config_t::mode](sl-rail-pti-config-t#mode).
- Global [RAIL_PtiMode_t](pti#rail-pti-mode-t)  
  RAIL 2.x synonym of [sl_rail_pti_mode_t](pti#sl-rail-pti-mode-t).
- Global [RAIL_PtiProtocol_t](pti#rail-pti-protocol-t)  
  RAIL 2.x synonym of [sl_rail_pti_protocol_t](pti#sl-rail-pti-protocol-t).
- Global [RAIL_RadioConfig_t](radio-configuration#rail-radio-config-t)  
  RAIL 2.x synonym of [sl_rail_radio_config_t](radio-configuration#sl-rail-radio-config-t).
- Global [RAIL_RadioConfigChangedCallback_t](radio-configuration#rail-radio-config-changed-callback-t)  )(RAIL_Handle_t railHandle, const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *entry)  
  RAIL 2.x synonym of [sl_rail_radio_config_changed_callback_t()](radio-configuration#sl-rail-radio-config-changed-callback-t).
- Global [RAIL_RadioState_t](state-transitions#rail-radio-state-t)  
  RAIL 2.x synonym of [sl_rail_radio_state_t](state-transitions#sl-rail-radio-state-t).
- Global [RAIL_RadioStateDetail_t](state-transitions#rail-radio-state-detail-t)  
  RAIL 2.x synonym of [sl_rail_radio_state_detail_t](state-transitions#sl-rail-radio-state-detail-t).
- Global [RAIL_ReadRxFifo](data-management#rail-read-rx-fifo)  (RAIL_Handle_t railHandle, uint8_t *dataPtr, uint16_t readLength)  
  RAIL 2.x synonym of [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo).
- Global [RAIL_ReleaseRxPacket](receive#rail-release-rx-packet)  (RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle)  
  RAIL 2.x synonym of [sl_rail_release_rx_packet()](receive#sl-rail-release-rx-packet).
- Global [RAIL_ResetAddressFilter](address-filtering#rail-reset-address-filter)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_reset_address_filter()](address-filtering#sl-rail-reset-address-filter).
- Global [RAIL_ResetCrcInitVal](radio-configuration#rail-reset-crc-init-val)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_reset_crc_init_val()](radio-configuration#sl-rail-reset-crc-init-val).
- Global [RAIL_ResetFifo](data-management#rail-reset-fifo)  (RAIL_Handle_t railHandle, bool txFifo, bool rxFifo)  
  RAIL 2.x synonym of [sl_rail_reset_fifo()](data-management#sl-rail-reset-fifo).
- Global [RAIL_ResetWhiteningInitVal](radio-configuration#rail-reset-whitening-init-val)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_reset_whitening_init_val()](radio-configuration#sl-rail-reset-whitening-init-val).
- Global [RAIL_RETIME_OPTION_DCDC](retiming#rail-retime-option-dcdc)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_DCDC](retiming#sl-rail-retime-option-dcdc).
- Global [RAIL_RETIME_OPTION_DCDC_SHIFT](retiming#rail-retime-option-dcdc-shift)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_DCDC_SHIFT](retiming#sl-rail-retime-option-dcdc-shift).
- Global [RAIL_RETIME_OPTION_HFRCO](retiming#rail-retime-option-hfrco)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_HFRCO](retiming#sl-rail-retime-option-hfrco).
- Global [RAIL_RETIME_OPTION_HFRCO_SHIFT](retiming#rail-retime-option-hfrco-shift)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_HFRCO_SHIFT](retiming#sl-rail-retime-option-hfrco-shift).
- Global [RAIL_RETIME_OPTION_HFXO](retiming#rail-retime-option-hfxo)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_HFXO](retiming#sl-rail-retime-option-hfxo).
- Global [RAIL_RETIME_OPTION_HFXO_SHIFT](retiming#rail-retime-option-hfxo-shift)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_HFXO_SHIFT](retiming#sl-rail-retime-option-hfxo-shift).
- Global [RAIL_RETIME_OPTION_LCD](retiming#rail-retime-option-lcd)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_LCD](retiming#sl-rail-retime-option-lcd).
- Global [RAIL_RETIME_OPTION_LCD_SHIFT](retiming#rail-retime-option-lcd-shift)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTION_LCD_SHIFT](retiming#sl-rail-retime-option-lcd-shift).
- Global [RAIL_RETIME_OPTIONS_ALL](retiming#rail-retime-options-all)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTIONS_ALL](retiming#sl-rail-retime-options-all).
- Global [RAIL_RETIME_OPTIONS_NONE](retiming#rail-retime-options-none)  
  RAIL 2.x synonym of [SL_RAIL_RETIME_OPTIONS_NONE](retiming#sl-rail-retime-options-none).
- Global [RAIL_RetimeOptions_t](retiming#rail-retime-options-t)  
  RAIL 2.x synonym of [sl_rail_retime_options_t](retiming#sl-rail-retime-options-t).
- Global [RAIL_RF_PATHS](calibration-sixx3-xx#rail-rf-paths)  
  RAIL 2.x. synonym of [SL_RAIL_RF_PATHS](calibration-sixx3-xx#sl-rail-rf-paths).  
  RAIL 2.x synonym of [SL_RAIL_RF_PATHS](calibration-sixx3-xx#sl-rail-rf-paths).
- Global [RAIL_RF_PATHS_2P4GIG](calibration-sixx3-xx#rail-rf-paths-2-p4-gig)  
  RAIL 2.x. synonym of [SL_RAIL_RF_PATHS_2P4_GHZ](calibration-sixx3-xx#sl-rail-rf-paths-2-p4-ghz).  
  RAIL 2.x synonym of [SL_RAIL_RF_PATHS_2P4_GHZ](calibration-sixx3-xx#sl-rail-rf-paths-2-p4-ghz).
- Global [RAIL_RF_PATHS_SUBGIG](calibration-sixx3-xx#rail-rf-paths-subgig)  
  RAIL 2.x. synonym of [SL_RAIL_RF_PATHS_SUB_GHZ](calibration-sixx3-xx#sl-rail-rf-paths-sub-ghz).  
  RAIL 2.x synonym of [SL_RAIL_RF_PATHS_SUB_GHZ](calibration-sixx3-xx#sl-rail-rf-paths-sub-ghz).
- Global [RAIL_RF_STATE_ACTIVE](state-transitions#rail-rf-state-active)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_ACTIVE](state-transitions#sl-rail-rf-state-active).
- Global [RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#rail-rf-state-detail-active)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#sl-rail-rf-state-detail-active).
- Global [RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT](state-transitions#rail-rf-state-detail-active-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT](state-transitions#sl-rail-rf-state-detail-active-shift).
- Global [RAIL_RF_STATE_DETAIL_CORE_STATE_MASK](state-transitions#rail-rf-state-detail-core-state-mask)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_CORE_STATE_MASK](state-transitions#sl-rail-rf-state-detail-core-state-mask).
- Global [RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#rail-rf-state-detail-idle-state)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#sl-rail-rf-state-detail-idle-state).
- Global [RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT](state-transitions#rail-rf-state-detail-idle-state-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT](state-transitions#sl-rail-rf-state-detail-idle-state-shift).
- Global [RAIL_RF_STATE_DETAIL_INACTIVE](state-transitions#rail-rf-state-detail-inactive)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_INACTIVE](state-transitions#sl-rail-rf-state-detail-inactive).
- Global [RAIL_RF_STATE_DETAIL_LBT](state-transitions#rail-rf-state-detail-lbt)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_LBT](state-transitions#sl-rail-rf-state-detail-lbt).
- Global [RAIL_RF_STATE_DETAIL_LBT_SHIFT](state-transitions#rail-rf-state-detail-lbt-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_LBT_SHIFT](state-transitions#sl-rail-rf-state-detail-lbt-shift).
- Global [RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#rail-rf-state-detail-no-frames)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#sl-rail-rf-state-detail-no-frames).
- Global [RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT](state-transitions#rail-rf-state-detail-no-frames-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT](state-transitions#sl-rail-rf-state-detail-no-frames-shift).
- Global [RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#rail-rf-state-detail-rx-state)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#sl-rail-rf-state-detail-rx-state).
- Global [RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT](state-transitions#rail-rf-state-detail-rx-state-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT](state-transitions#sl-rail-rf-state-detail-rx-state-shift).
- Global [RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#rail-rf-state-detail-transition)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#sl-rail-rf-state-detail-transition).
- Global [RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT](state-transitions#rail-rf-state-detail-transition-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT](state-transitions#sl-rail-rf-state-detail-transition-shift).
- Global [RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#rail-rf-state-detail-tx-state)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#sl-rail-rf-state-detail-tx-state).
- Global [RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT](state-transitions#rail-rf-state-detail-tx-state-shift)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT](state-transitions#sl-rail-rf-state-detail-tx-state-shift).
- Global [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle).
- Global [RAIL_RF_STATE_INACTIVE](state-transitions#rail-rf-state-inactive)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_INACTIVE](state-transitions#sl-rail-rf-state-inactive).
- Global [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx).
- Global [RAIL_RF_STATE_RX_ACTIVE](state-transitions#rail-rf-state-rx-active)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_RX_ACTIVE](state-transitions#sl-rail-rf-state-rx-active).
- Global [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_TX](state-transitions#sl-rail-rf-state-tx).
- Global [RAIL_RF_STATE_TX_ACTIVE](state-transitions#rail-rf-state-tx-active)  
  RAIL 2.x synonym of [SL_RAIL_RF_STATE_TX_ACTIVE](state-transitions#sl-rail-rf-state-tx-active).
- Global [RAIL_RFSENSE_2_4GHZ](rf-sense#rail-rfsense-2-4-ghz)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_2P4_GHZ](rf-sense#sl-rail-rf-sense-2-p4-ghz).
- Global [RAIL_RFSENSE_2_4GHZ_LOW_SENSITIVITY](rf-sense#rail-rfsense-2-4-ghz-low-sensitivity)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_2P4_GHZ_LOW_SENSITIVITY](rf-sense#sl-rail-rf-sense-2-p4-ghz-low-sensitivity).
- Global [RAIL_RFSENSE_ANY](rf-sense#rail-rfsense-any)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_ANY](rf-sense#sl-rail-rf-sense-any).
- Global [RAIL_RFSENSE_ANY_LOW_SENSITIVITY](rf-sense#rail-rfsense-any-low-sensitivity)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_ANY_LOW_SENSITIVITY](rf-sense#sl-rail-rf-sense-any-low-sensitivity).
- Global [RAIL_RfSense_CallbackPtr_t](rf-sense#rail-rf-sense-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_rf_sense_callback_t()](rf-sense#sl-rail-rf-sense-callback-t).
- Global [RAIL_RFSENSE_LOW_SENSITIVITY_OFFSET](rf-sense#rail-rfsense-low-sensitivity-offset)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_LOW_SENSITIVITY_OFFSET](rf-sense#sl-rail-rf-sense-low-sensitivity-offset).
- Global [RAIL_RFSENSE_MAX](rf-sense#rail-rfsense-max)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_MAX](rf-sense#sl-rail-rf-sense-max).
- Global [RAIL_RFSENSE_OFF](rf-sense#rail-rfsense-off)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_OFF](rf-sense#sl-rail-rf-sense-off).
- Global [RAIL_RFSENSE_SUBGHZ](rf-sense#rail-rfsense-subghz)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_SUB_GHZ](rf-sense#sl-rail-rf-sense-sub-ghz).
- Global [RAIL_RFSENSE_SUBGHZ_LOW_SENSITIVITY](rf-sense#rail-rfsense-subghz-low-sensitivity)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_SUB_GHZ_LOW_SENSITIVITY](rf-sense#sl-rail-rf-sense-sub-ghz-low-sensitivity).
- Global [RAIL_RFSENSE_USE_HW_SYNCWORD](rf-sense#rail-rfsense-use-hw-syncword)  
  RAIL 2.x synonym of [SL_RAIL_RF_SENSE_USE_HW_SYNC_WORD](rf-sense#sl-rail-rf-sense-use-hw-sync-word).
- Global [RAIL_RfSenseBand_t](rf-sense#rail-rf-sense-band-t)  
  RAIL 2.x synonym of [sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t).
- Class [RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t)  
  RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t).
- Global [RAIL_RfSenseSelectiveOokConfig_t::band](rail-rf-sense-selective-ook-config-t#band)  
  RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::band](sl-rail-rf-sense-selective-ook-config-t#band).
- Global [RAIL_RfSenseSelectiveOokConfig_t::cb](rail-rf-sense-selective-ook-config-t#cb)  
  RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::cb](sl-rail-rf-sense-selective-ook-config-t#cb).
- Global [RAIL_RfSenseSelectiveOokConfig_t::syncWord](rail-rf-sense-selective-ook-config-t#sync-word)  
  RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::sync_word](sl-rail-rf-sense-selective-ook-config-t#sync-word).
- Global [RAIL_RfSenseSelectiveOokConfig_t::syncWordNumBytes](rail-rf-sense-selective-ook-config-t#sync-word-num-bytes)  
  RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::sync_word_bytes](sl-rail-rf-sense-selective-ook-config-t#sync-word-bytes).
- Global [RAIL_RSSI_INVALID](receive#rail-rssi-invalid)  
  RAIL 2.x synonym of [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid).
- Global [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm)  
  RAIL 2.x synonym of [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm).
- Global [RAIL_RSSI_LOWEST](receive#rail-rssi-lowest)  
  RAIL 2.x synonym of [SL_RAIL_RSSI_LOWEST](receive#sl-rail-rssi-lowest).
- Global [RAIL_RSSI_OFFSET_MAX](receive#rail-rssi-offset-max)  
  RAIL 2.x synonym of [SL_RAIL_RSSI_OFFSET_MAX](receive#sl-rail-rssi-offset-max).
- Global [RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-static)  
  This RAIL 2.x enum value has been eliminated in RAIL 3.
- Global [RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#rail-rx-channel-hopping-max-sense-time-us)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#sl-rail-rx-channel-hopping-max-sense-time-us).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#rail-rx-channel-hopping-mode-conc)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-conc).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-conc-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-conc-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#rail-rx-channel-hopping-mode-manual)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-manual).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-manual-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-manual-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-multi-sense).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-multi-sense-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-preamble-sense)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-preamble-sense).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-preamble-sense-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-preamble-sense-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1](rx-channel-hopping#rail-rx-channel-hopping-mode-reserved1)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-reserved-4).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-reserved1-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-reserved-4-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#rail-rx-channel-hopping-mode-sq)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-sq-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT](rx-channel-hopping#rail-rx-channel-hopping-mode-timeout)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timeout).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-timeout-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timeout-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-timing-sense)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timing-sense).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-timing-sense-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timing-sense-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TX](rx-channel-hopping#rail-rx-channel-hopping-mode-tx)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-tx).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-tx-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-tx-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#rail-rx-channel-hopping-mode-vt)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-vt).
- Global [RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-vt-with-options)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-vt-with-options).
- Global [RAIL_RX_CHANNEL_HOPPING_MODES_COUNT](rx-channel-hopping#rail-rx-channel-hopping-modes-count)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODES_COUNT](rx-channel-hopping#sl-rail-rx-channel-hopping-modes-count).
- Global [RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE](rx-channel-hopping#rail-rx-channel-hopping-modes-with-options-base)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE](rx-channel-hopping#sl-rail-rx-channel-hopping-modes-with-options-base).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_DEFAULT](rx-channel-hopping#rail-rx-channel-hopping-option-default)  
  Please use [RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#rail-rx-channel-hopping-options-default) instead. Replaced by [SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#sl-rail-rx-channel-hopping-options-default).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#sl-rail-rx-channel-hopping-option-rssi-threshold).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT](rx-channel-hopping#sl-rail-rx-channel-hopping-option-rssi-threshold-shift).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL](rx-channel-hopping#rail-rx-channel-hopping-option-skip-dc-cal)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-dc-cal).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT](rx-channel-hopping#rail-rx-channel-hopping-option-skip-dc-cal-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-dc-cal-shift).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL](rx-channel-hopping#rail-rx-channel-hopping-option-skip-synth-cal)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-synth-cal).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT](rx-channel-hopping#rail-rx-channel-hopping-option-skip-synth-cal-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-synth-cal-shift).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_STOP](rx-channel-hopping#rail-rx-channel-hopping-option-stop)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP](rx-channel-hopping#sl-rail-rx-channel-hopping-option-stop).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT](rx-channel-hopping#rail-rx-channel-hopping-option-stop-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT](rx-channel-hopping#sl-rail-rx-channel-hopping-option-stop-shift).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT](rx-channel-hopping#rail-rx-channel-hopping-options-count)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT](rx-channel-hopping#sl-rail-rx-channel-hopping-options-count).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#rail-rx-channel-hopping-options-default)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#sl-rail-rx-channel-hopping-options-default).
- Global [RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE](rx-channel-hopping#rail-rx-channel-hopping-options-none)  
  RAIL 2.x synonym of [SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE](rx-channel-hopping#sl-rail-rx-channel-hopping-options-none).
- Global [RAIL_RX_DATA_SOURCE_COUNT](data-management#rail-rx-data-source-count)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_COUNT](data-management#sl-rail-rx-data-source-count).
- Global [RAIL_RX_OPTION_ANTENNA0](receive#rail-rx-option-antenna0)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ANTENNA_0](receive#sl-rail-rx-option-antenna-0).
- Global [RAIL_RX_OPTION_ANTENNA0_SHIFT](receive#rail-rx-option-antenna0-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ANTENNA_0_SHIFT](receive#sl-rail-rx-option-antenna-0-shift).
- Global [RAIL_RX_OPTION_ANTENNA1](receive#rail-rx-option-antenna1)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ANTENNA_1](receive#sl-rail-rx-option-antenna-1).
- Global [RAIL_RX_OPTION_ANTENNA1_SHIFT](receive#rail-rx-option-antenna1-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ANTENNA_1_SHIFT](receive#sl-rail-rx-option-antenna-1-shift).
- Global [RAIL_RX_OPTION_ANTENNA_AUTO](receive#rail-rx-option-antenna-auto)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ANTENNA_AUTO](receive#sl-rail-rx-option-antenna-auto).
- Global [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching).
- Global [RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT](receive#rail-rx-option-channel-switching-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT](receive#sl-rail-rx-option-channel-switching-shift).
- Global [RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#rail-rx-option-disable-frame-detection)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#sl-rail-rx-option-disable-frame-detection).
- Global [RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT](receive#rail-rx-option-disable-frame-detection-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT](receive#sl-rail-rx-option-disable-frame-detection-shift).
- Global [RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#rail-rx-option-enable-collision-detection)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#sl-rail-rx-option-enable-collision-detection).
- Global [RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT](receive#rail-rx-option-enable-collision-detection-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT](receive#sl-rail-rx-option-enable-collision-detection-shift).
- Global [RAIL_RX_OPTION_ENABLE_DUALSYNC](receive#rail-rx-option-enable-dualsync)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC](receive#sl-rail-rx-option-enable-dual-sync).
- Global [RAIL_RX_OPTION_ENABLE_DUALSYNC_SHIFT](receive#rail-rx-option-enable-dualsync-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC_SHIFT](receive#sl-rail-rx-option-enable-dual-sync-shift).
- Global [RAIL_RX_OPTION_FAST_RX2RX](receive#rail-rx-option-fast-rx2-rx)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_FAST_RX_TO_RX](receive#sl-rail-rx-option-fast-rx-to-rx).
- Global [RAIL_RX_OPTION_FAST_RX2RX_SHIFT](receive#rail-rx-option-fast-rx2-rx-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_FAST_RX_TO_RX_SHIFT](receive#sl-rail-rx-option-fast-rx-to-rx-shift).
- Global [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#sl-rail-rx-option-ignore-crc-errors).
- Global [RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT](receive#rail-rx-option-ignore-crc-errors-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT](receive#sl-rail-rx-option-ignore-crc-errors-shift).
- Global [RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#sl-rail-rx-option-remove-appended-info).
- Global [RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT](receive#rail-rx-option-remove-appended-info-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT](receive#sl-rail-rx-option-remove-appended-info-shift).
- Global [RAIL_RX_OPTION_STORE_CRC](receive#rail-rx-option-store-crc)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_STORE_CRC](receive#sl-rail-rx-option-store-crc).
- Global [RAIL_RX_OPTION_STORE_CRC_SHIFT](receive#rail-rx-option-store-crc-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_STORE_CRC_SHIFT](receive#sl-rail-rx-option-store-crc-shift).
- Global [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#rail-rx-option-track-aborted-frames)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#sl-rail-rx-option-track-aborted-frames).
- Global [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT](receive#rail-rx-option-track-aborted-frames-shift)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT](receive#sl-rail-rx-option-track-aborted-frames-shift).
- Global [RAIL_RX_OPTIONS_ALL](receive#rail-rx-options-all)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTIONS_ALL](receive#sl-rail-rx-options-all).
- Global [RAIL_RX_OPTIONS_DEFAULT](receive#rail-rx-options-default)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTIONS_DEFAULT](receive#sl-rail-rx-options-default).
- Global [RAIL_RX_OPTIONS_NONE](receive#rail-rx-options-none)  
  RAIL 2.x synonym of [SL_RAIL_RX_OPTIONS_NONE](receive#sl-rail-rx-options-none).
- Global [RAIL_RX_PACKET_ABORT_ABORTED](receive#rail-rx-packet-abort-aborted)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_ABORT_ABORTED](receive#sl-rail-rx-packet-abort-aborted).
- Global [RAIL_RX_PACKET_ABORT_CRC_ERROR](receive#rail-rx-packet-abort-crc-error)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_ABORT_CRC_ERROR](receive#sl-rail-rx-packet-abort-crc-error).
- Global [RAIL_RX_PACKET_ABORT_FILTERED](receive#rail-rx-packet-abort-filtered)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_ABORT_FILTERED](receive#sl-rail-rx-packet-abort-filtered).
- Global [RAIL_RX_PACKET_ABORT_FORMAT](receive#rail-rx-packet-abort-format)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_ABORT_FORMAT](receive#sl-rail-rx-packet-abort-format).
- Global [RAIL_RX_PACKET_ABORT_OVERFLOW](receive#rail-rx-packet-abort-overflow)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_ABORT_OVERFLOW](receive#sl-rail-rx-packet-abort-overflow).
- Global [RAIL_RX_PACKET_HANDLE_INVALID](receive#rail-rx-packet-handle-invalid)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_HANDLE_INVALID](receive#sl-rail-rx-packet-handle-invalid).
- Global [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest).
- Global [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest).
- Global [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete).
- Global [RAIL_RX_PACKET_NONE](receive#rail-rx-packet-none)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_NONE](receive#sl-rail-rx-packet-none).
- Global [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_READY_CRC_ERROR](receive#sl-rail-rx-packet-ready-crc-error).
- Global [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_READY_SUCCESS](receive#sl-rail-rx-packet-ready-success).
- Global [RAIL_RX_PACKET_RECEIVING](receive#rail-rx-packet-receiving)  
  RAIL 2.x synonym of [SL_RAIL_RX_PACKET_RECEIVING](receive#sl-rail-rx-packet-receiving).
- Class [RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t).
- Global [RAIL_RxChannelHoppingConfig_t::buffer](rail-rx-channel-hopping-config-t#buffer)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::p_buffer](sl-rail-rx-channel-hopping-config-t#p-buffer).
- Global [RAIL_RxChannelHoppingConfig_t::bufferLength](rail-rx-channel-hopping-config-t#buffer-length)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::buffer_words](sl-rail-rx-channel-hopping-config-t#buffer-words).
- Global [RAIL_RxChannelHoppingConfig_t::entries](rail-rx-channel-hopping-config-t#entries)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::p_entries](sl-rail-rx-channel-hopping-config-t#p-entries).
- Global [RAIL_RxChannelHoppingConfig_t::numberOfChannels](rail-rx-channel-hopping-config-t#number-of-channels)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::number_of_channels](sl-rail-rx-channel-hopping-config-t#number-of-channels).
- Class [RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t).
- Global [RAIL_RxChannelHoppingConfigEntry_t::channel](rail-rx-channel-hopping-config-entry-t#channel)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::channel](sl-rail-rx-channel-hopping-config-entry-t#channel).
- Global [RAIL_RxChannelHoppingConfigEntry_t::delay](rail-rx-channel-hopping-config-entry-t#delay)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::delay_us](sl-rail-rx-channel-hopping-config-entry-t#delay-us).
- Global [RAIL_RxChannelHoppingConfigEntry_t::delayMode](rail-rx-channel-hopping-config-entry-t#delay-mode)  
  Set delayMode to [RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-static). See [sl_rail_rx_channel_hopping_config_entry_t::reserved_0](sl-rail-rx-channel-hopping-config-entry-t#reserved-0).
- Global [RAIL_RxChannelHoppingConfigEntry_t::mode](rail-rx-channel-hopping-config-entry-t#mode)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::mode](sl-rail-rx-channel-hopping-config-entry-t#mode).
- Global [RAIL_RxChannelHoppingConfigEntry_t::options](rail-rx-channel-hopping-config-entry-t#options)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::options](sl-rail-rx-channel-hopping-config-entry-t#options).
- Global [RAIL_RxChannelHoppingConfigEntry_t::parameter](rail-rx-channel-hopping-config-entry-t#parameter)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::parameter](sl-rail-rx-channel-hopping-config-entry-t#parameter).
- Global [RAIL_RxChannelHoppingConfigEntry_t::reserved2](rail-rx-channel-hopping-config-entry-t#reserved2)  [1]  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::reserved_1](sl-rail-rx-channel-hopping-config-entry-t#reserved-1).
- Global [RAIL_RxChannelHoppingConfigEntry_t::rssiThresholdDbm](rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::rssi_threshold_dbm](sl-rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm).
- Class [RAIL_RxChannelHoppingConfigMultiMode_t](rail-rx-channel-hopping-config-multi-mode-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t](sl-rail-rx-channel-hopping-config-multi-mode-t).
- Global [RAIL_RxChannelHoppingConfigMultiMode_t::preambleSense](rail-rx-channel-hopping-config-multi-mode-t#preamble-sense)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::preamble_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#preamble-sense-us).
- Global [RAIL_RxChannelHoppingConfigMultiMode_t::status](rail-rx-channel-hopping-config-multi-mode-t#status)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::status](sl-rail-rx-channel-hopping-config-multi-mode-t#status).
- Global [RAIL_RxChannelHoppingConfigMultiMode_t::syncDetect](rail-rx-channel-hopping-config-multi-mode-t#sync-detect)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::sync_detect_us](sl-rail-rx-channel-hopping-config-multi-mode-t#sync-detect-us).
- Global [RAIL_RxChannelHoppingConfigMultiMode_t::timingReSense](rail-rx-channel-hopping-config-multi-mode-t#timing-re-sense)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::timing_re_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#timing-re-sense-us).
- Global [RAIL_RxChannelHoppingConfigMultiMode_t::timingSense](rail-rx-channel-hopping-config-multi-mode-t#timing-sense)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::timing_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#timing-sense-us).
- Global [RAIL_RxChannelHoppingDelayMode_t](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-t)  
  Set only to RAIL_RX_CHANNEL_DELAY_MODE_STATIC. This enum type has been eliminated in RAIL 3.
- Global [RAIL_RxChannelHoppingMode_t](rx-channel-hopping#rail-rx-channel-hopping-mode-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_mode_t](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-t).
- Global [RAIL_RxChannelHoppingOptions_t](rx-channel-hopping#rail-rx-channel-hopping-options-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_options_t](rx-channel-hopping#sl-rail-rx-channel-hopping-options-t).
- Global [RAIL_RxChannelHoppingParameter_t](rx-channel-hopping#rail-rx-channel-hopping-parameter-t)  
  RAIL 2.x synonym of [sl_rail_rx_channel_hopping_parameter_t](rx-channel-hopping#sl-rail-rx-channel-hopping-parameter-t).
- Global [RAIL_RxChannelHoppingParameters_t](z-wave#rail-rx-channel-hopping-parameters-t)  [(4U)]  
  RAIL 2.x synonym of [sl_rail_zwave_rx_channel_hopping_parameters_t](z-wave#sl-rail-zwave-rx-channel-hopping-parameters-t).
- Global [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t)  
  RAIL 2.x synonym of [sl_rail_rx_data_source_t](data-management#sl-rail-rx-data-source-t).
- Class [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t).
- Global [RAIL_RxDutyCycleConfig_t::delay](rail-rx-duty-cycle-config-t#delay)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::delay_us](sl-rail-rx-duty-cycle-config-t#delay-us).
- Global [RAIL_RxDutyCycleConfig_t::delayMode](rail-rx-duty-cycle-config-t#delay-mode)  
  Set delayMode to [RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-static). See [sl_rail_rx_duty_cycle_config_t::reserved_0](sl-rail-rx-duty-cycle-config-t#reserved-0).
- Global [RAIL_RxDutyCycleConfig_t::mode](rail-rx-duty-cycle-config-t#mode)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::mode](sl-rail-rx-duty-cycle-config-t#mode).
- Global [RAIL_RxDutyCycleConfig_t::options](rail-rx-duty-cycle-config-t#options)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::options](sl-rail-rx-duty-cycle-config-t#options).
- Global [RAIL_RxDutyCycleConfig_t::parameter](rail-rx-duty-cycle-config-t#parameter)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::parameter](sl-rail-rx-duty-cycle-config-t#parameter).
- Global [RAIL_RxDutyCycleConfig_t::reserved2](rail-rx-duty-cycle-config-t#reserved2)  [1]  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::reserved_1](sl-rail-rx-duty-cycle-config-t#reserved-1).
- Global [RAIL_RxDutyCycleConfig_t::rssiThresholdDbm](rail-rx-duty-cycle-config-t#rssi-threshold-dbm)  
  RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::rssi_threshold_dbm](sl-rail-rx-duty-cycle-config-t#rssi-threshold-dbm).
- Global [RAIL_RxIrCalValues_t](calibration#rail-rx-ir-cal-values-t)  [2]  
  RAIL 2.x synonym of [sl_rail_rx_ir_cal_values_t](calibration#sl-rail-rx-ir-cal-values-t).
- Global [RAIL_RxOptions_t](receive#rail-rx-options-t)  
  RAIL 2.x synonym of [sl_rail_rx_options_t](receive#sl-rail-rx-options-t).
- Class [RAIL_RxPacketDetails_t](rail-rx-packet-details-t)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t).
- Global [RAIL_RxPacketDetails_t::antennaId](rail-rx-packet-details-t#antenna-id)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::antenna_id](sl-rail-rx-packet-details-t#antenna-id).
- Global [RAIL_RxPacketDetails_t::channel](rail-rx-packet-details-t#channel)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::channel](sl-rail-rx-packet-details-t#channel).
- Global [RAIL_RxPacketDetails_t::channelHoppingChannelIndex](rail-rx-packet-details-t#channel-hopping-channel-index)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::channel_hopping_channel_index](sl-rail-rx-packet-details-t#channel-hopping-channel-index).
- Global [RAIL_RxPacketDetails_t::crcPassed](rail-rx-packet-details-t#crc-passed)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::crc_passed](sl-rail-rx-packet-details-t#crc-passed).
- Global [RAIL_RxPacketDetails_t::isAck](rail-rx-packet-details-t#is-ack)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::is_ack](sl-rail-rx-packet-details-t#is-ack).
- Global [RAIL_RxPacketDetails_t::lqi](rail-rx-packet-details-t#lqi)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::lqi](sl-rail-rx-packet-details-t#lqi).
- Global [RAIL_RxPacketDetails_t::rssi](rail-rx-packet-details-t#rssi)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::rssi_dbm](sl-rail-rx-packet-details-t#rssi-dbm).
- Global [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id).
- Global [RAIL_RxPacketDetails_t::syncWordId](rail-rx-packet-details-t#sync-word-id)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::sync_word_id](sl-rail-rx-packet-details-t#sync-word-id).
- Global [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received)  
  RAIL 2.x synonym of [sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received).
- Global [RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)  
  RAIL 2.x synonym of [sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t).
- Class [RAIL_RxPacketInfo_t](rail-rx-packet-info-t)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t).
- Global [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::filter_mask](sl-rail-rx-packet-info-t#filter-mask).
- Global [RAIL_RxPacketInfo_t::firstPortionBytes](rail-rx-packet-info-t#first-portion-bytes)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::first_portion_bytes](sl-rail-rx-packet-info-t#first-portion-bytes).
- Global [RAIL_RxPacketInfo_t::firstPortionData](rail-rx-packet-info-t#first-portion-data)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::p_first_portion_data](sl-rail-rx-packet-info-t#p-first-portion-data).
- Global [RAIL_RxPacketInfo_t::lastPortionData](rail-rx-packet-info-t#last-portion-data)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::p_last_portion_data](sl-rail-rx-packet-info-t#p-last-portion-data).
- Global [RAIL_RxPacketInfo_t::packetBytes](rail-rx-packet-info-t#packet-bytes)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::packet_bytes](sl-rail-rx-packet-info-t#packet-bytes).
- Global [RAIL_RxPacketInfo_t::packetStatus](rail-rx-packet-info-t#packet-status)  
  RAIL 2.x synonym of [sl_rail_rx_packet_info_t::packet_status](sl-rail-rx-packet-info-t#packet-status).
- Global [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t)  
  RAIL 2.x synonym of [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t).
- Global [RAIL_S3LPW_HANDLE](general-sixx3-xx#rail-s3-lpw-handle)  
  RAIL 2.x. synonym of [SL_RAIL_S3LPW_HANDLE](general-sixx3-xx#sl-rail-s3-lpw-handle).
- Global [RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](transmit#rail-scheduled-tx-during-rx-abort-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](transmit#sl-rail-scheduled-tx-during-rx-abort-tx).
- Global [RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX](transmit#rail-scheduled-tx-during-rx-postpone-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX](transmit#sl-rail-scheduled-tx-during-rx-postpone-tx).
- Global [RAIL_ScheduledTxDuringRx_t](transmit#rail-scheduled-tx-during-rx-t)  
  RAIL 2.x synonym of [sl_rail_scheduled_tx_during_rx_t](transmit#sl-rail-scheduled-tx-during-rx-t).
- Global [RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR](multiprotocol#rail-scheduler-average-rssi-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-average-rssi-internal-error).
- Global [RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED](multiprotocol#rail-scheduler-average-rssi-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED](multiprotocol#sl-rail-scheduler-average-rssi-interrupted).
- Global [RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR](multiprotocol#rail-scheduler-average-rssi-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-average-rssi-scheduling-error).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL](multiprotocol#rail-scheduler-scheduled-cca-csma-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL](multiprotocol#sl-rail-scheduler-scheduled-cca-csma-tx-fail).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-scheduled-cca-csma-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-scheduled-cca-csma-tx-internal-error).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED](multiprotocol#rail-scheduler-scheduled-cca-csma-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-scheduled-cca-csma-tx-interrupted).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-scheduled-cca-csma-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-scheduled-cca-csma-tx-scheduling-error).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL](multiprotocol#rail-scheduler-scheduled-cca-lbt-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL](multiprotocol#sl-rail-scheduler-scheduled-cca-lbt-tx-fail).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-scheduled-cca-lbt-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-scheduled-cca-lbt-tx-internal-error).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED](multiprotocol#rail-scheduler-scheduled-cca-lbt-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-scheduled-cca-lbt-tx-interrupted).
- Global [RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-scheduled-cca-lbt-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-scheduled-cca-lbt-tx-scheduling-error).
- Global [RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR](multiprotocol#rail-scheduler-scheduled-rx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-scheduled-rx-internal-error).
- Global [RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED](multiprotocol#rail-scheduler-scheduled-rx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED](multiprotocol#sl-rail-scheduler-scheduled-rx-interrupted).
- Global [RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-scheduled-rx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-scheduled-rx-scheduling-error).
- Global [RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-scheduled-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-scheduled-tx-internal-error).
- Global [RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED](multiprotocol#rail-scheduler-scheduled-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-scheduled-tx-interrupted).
- Global [RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-scheduled-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-scheduled-tx-scheduling-error).
- Global [RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-single-cca-csma-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-single-cca-csma-tx-internal-error).
- Global [RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED](multiprotocol#rail-scheduler-single-cca-csma-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-single-cca-csma-tx-interrupted).
- Global [RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-single-cca-csma-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-single-cca-csma-tx-scheduling-error).
- Global [RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-single-cca-lbt-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-single-cca-lbt-tx-internal-error).
- Global [RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED](multiprotocol#rail-scheduler-single-cca-lbt-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-single-cca-lbt-tx-interrupted).
- Global [RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-single-cca-lbt-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-single-cca-lbt-tx-scheduling-error).
- Global [RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR](multiprotocol#rail-scheduler-single-tx-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-single-tx-internal-error).
- Global [RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED](multiprotocol#rail-scheduler-single-tx-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED](multiprotocol#sl-rail-scheduler-single-tx-interrupted).
- Global [RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR](multiprotocol#rail-scheduler-single-tx-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-single-tx-scheduling-error).
- Global [RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL](multiprotocol#rail-scheduler-status-average-rssi-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL](multiprotocol#sl-rail-scheduler-status-average-rssi-fail).
- Global [RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL](multiprotocol#rail-scheduler-status-cca-csma-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL](multiprotocol#sl-rail-scheduler-status-cca-csma-tx-fail).
- Global [RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL](multiprotocol#rail-scheduler-status-cca-lbt-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL](multiprotocol#sl-rail-scheduler-status-cca-lbt-tx-fail).
- Global [RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED](multiprotocol#rail-scheduler-status-event-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED](multiprotocol#sl-rail-scheduler-status-event-interrupted).
- Global [RAIL_SCHEDULER_STATUS_INTERNAL_ERROR](multiprotocol#rail-scheduler-status-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-status-internal-error).
- Global [RAIL_SCHEDULER_STATUS_MASK](multiprotocol#rail-scheduler-status-mask)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_MASK](multiprotocol#sl-rail-scheduler-status-mask).
- Global [RAIL_SCHEDULER_STATUS_NO_ERROR](multiprotocol#rail-scheduler-status-no-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_NO_ERROR](multiprotocol#sl-rail-scheduler-status-no-error).
- Global [RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL](multiprotocol#rail-scheduler-status-schedule-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL](multiprotocol#sl-rail-scheduler-status-schedule-fail).
- Global [RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL](multiprotocol#rail-scheduler-status-scheduled-rx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL](multiprotocol#sl-rail-scheduler-status-scheduled-rx-fail).
- Global [RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL](multiprotocol#rail-scheduler-status-scheduled-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL](multiprotocol#sl-rail-scheduler-status-scheduled-tx-fail).
- Global [RAIL_SCHEDULER_STATUS_SHIFT](multiprotocol#rail-scheduler-status-shift)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_SHIFT](multiprotocol#sl-rail-scheduler-status-shift).
- Global [RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL](multiprotocol#rail-scheduler-status-single-tx-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL](multiprotocol#sl-rail-scheduler-status-single-tx-fail).
- Global [RAIL_SCHEDULER_STATUS_TASK_FAIL](multiprotocol#rail-scheduler-status-task-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_TASK_FAIL](multiprotocol#sl-rail-scheduler-status-task-fail).
- Global [RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL](multiprotocol#rail-scheduler-status-tx-stream-fail)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL](multiprotocol#sl-rail-scheduler-status-tx-stream-fail).
- Global [RAIL_SCHEDULER_STATUS_UNSUPPORTED](multiprotocol#rail-scheduler-status-unsupported)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_STATUS_UNSUPPORTED](multiprotocol#sl-rail-scheduler-status-unsupported).
- Global [RAIL_SCHEDULER_TASK_AVERAGE_RSSI](multiprotocol#rail-scheduler-task-average-rssi)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI](multiprotocol#sl-rail-scheduler-task-average-rssi).
- Global [RAIL_SCHEDULER_TASK_EMPTY](multiprotocol#rail-scheduler-task-empty)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_EMPTY](multiprotocol#sl-rail-scheduler-task-empty).
- Global [RAIL_SCHEDULER_TASK_MASK](multiprotocol#rail-scheduler-task-mask)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_MASK](multiprotocol#sl-rail-scheduler-task-mask).
- Global [RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX](multiprotocol#rail-scheduler-task-scheduled-cca-csma-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX](multiprotocol#sl-rail-scheduler-task-scheduled-cca-csma-tx).
- Global [RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX](multiprotocol#rail-scheduler-task-scheduled-cca-lbt-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX](multiprotocol#sl-rail-scheduler-task-scheduled-cca-lbt-tx).
- Global [RAIL_SCHEDULER_TASK_SCHEDULED_RX](multiprotocol#rail-scheduler-task-scheduled-rx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX](multiprotocol#sl-rail-scheduler-task-scheduled-rx).
- Global [RAIL_SCHEDULER_TASK_SCHEDULED_TX](multiprotocol#rail-scheduler-task-scheduled-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX](multiprotocol#sl-rail-scheduler-task-scheduled-tx).
- Global [RAIL_SCHEDULER_TASK_SHIFT](multiprotocol#rail-scheduler-task-shift)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SHIFT](multiprotocol#sl-rail-scheduler-task-shift).
- Global [RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX](multiprotocol#rail-scheduler-task-single-cca-csma-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX](multiprotocol#sl-rail-scheduler-task-single-cca-csma-tx).
- Global [RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX](multiprotocol#rail-scheduler-task-single-cca-lbt-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX](multiprotocol#sl-rail-scheduler-task-single-cca-lbt-tx).
- Global [RAIL_SCHEDULER_TASK_SINGLE_TX](multiprotocol#rail-scheduler-task-single-tx)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_SINGLE_TX](multiprotocol#sl-rail-scheduler-task-single-tx).
- Global [RAIL_SCHEDULER_TASK_TX_STREAM](multiprotocol#rail-scheduler-task-tx-stream)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TASK_TX_STREAM](multiprotocol#sl-rail-scheduler-task-tx-stream).
- Global [RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR](multiprotocol#rail-scheduler-tx-stream-internal-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR](multiprotocol#sl-rail-scheduler-tx-stream-internal-error).
- Global [RAIL_SCHEDULER_TX_STREAM_INTERRUPTED](multiprotocol#rail-scheduler-tx-stream-interrupted)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TX_STREAM_INTERRUPTED](multiprotocol#sl-rail-scheduler-tx-stream-interrupted).
- Global [RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR](multiprotocol#rail-scheduler-tx-stream-scheduling-error)  
  RAIL 2.x synonym of [SL_RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR](multiprotocol#sl-rail-scheduler-tx-stream-scheduling-error).
- Class [RAIL_SchedulerInfo_t](rail-scheduler-info-t)  
  RAIL 2.x synonym of [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t).
- Global [RAIL_SchedulerInfo_t::priority](rail-scheduler-info-t#priority)  
  RAIL 2.x synonym of [sl_rail_scheduler_info_t::priority](sl-rail-scheduler-info-t#priority).
- Global [RAIL_SchedulerInfo_t::slipTime](rail-scheduler-info-t#slip-time)  
  RAIL 2.x synonym of [sl_rail_scheduler_info_t::slip_time](sl-rail-scheduler-info-t#slip-time).
- Global [RAIL_SchedulerInfo_t::transactionTime](rail-scheduler-info-t#transaction-time)  
  RAIL 2.x synonym of [sl_rail_scheduler_info_t::transaction_time](sl-rail-scheduler-info-t#transaction-time).
- Global [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t)  
  RAIL 2.x synonym of [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t).
- Global [RAIL_ScheduleRx](receive#rail-schedule-rx)  (RAIL_Handle_t railHandle, uint16_t channel, const [RAIL_ScheduleRxConfig_t](rail-schedule-rx-config-t) *cfg, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx).
- Class [RAIL_ScheduleRxConfig_t](rail-schedule-rx-config-t)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t](sl-rail-scheduled-rx-config-t).
- Global [RAIL_ScheduleRxConfig_t::end](rail-schedule-rx-config-t#end)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::end](sl-rail-scheduled-rx-config-t#end).
- Global [RAIL_ScheduleRxConfig_t::endMode](rail-schedule-rx-config-t#end-mode)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::end_mode](sl-rail-scheduled-rx-config-t#end-mode).
- Global [RAIL_ScheduleRxConfig_t::hardWindowEnd](rail-schedule-rx-config-t#hard-window-end)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::hard_window_end](sl-rail-scheduled-rx-config-t#hard-window-end).
- Global [RAIL_ScheduleRxConfig_t::rxTransitionEndSchedule](rail-schedule-rx-config-t#rx-transition-end-schedule)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::rx_transition_end_schedule](sl-rail-scheduled-rx-config-t#rx-transition-end-schedule).
- Global [RAIL_ScheduleRxConfig_t::start](rail-schedule-rx-config-t#start)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::start](sl-rail-scheduled-rx-config-t#start).
- Global [RAIL_ScheduleRxConfig_t::startMode](rail-schedule-rx-config-t#start-mode)  
  RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::start_mode](sl-rail-scheduled-rx-config-t#start-mode).
- Class [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t)  
  RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t).
- Global [RAIL_ScheduleTxConfig_t::mode](rail-schedule-tx-config-t#mode)  
  RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::mode](sl-rail-scheduled-tx-config-t#mode).
- Global [RAIL_ScheduleTxConfig_t::txDuringRx](rail-schedule-tx-config-t#tx-during-rx)  
  RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::tx_during_rx](sl-rail-scheduled-tx-config-t#tx-during-rx).
- Global [RAIL_ScheduleTxConfig_t::when](rail-schedule-tx-config-t#when)  
  RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::when](sl-rail-scheduled-tx-config-t#when).
- Global [RAIL_SetAddressFilterAddress](address-filtering#rail-set-address-filter-address)  (RAIL_Handle_t railHandle, uint8_t field, uint8_t index, const uint8_t *value, bool enable)  
  RAIL 2.x synonym of [sl_rail_set_address_filter_address()](address-filtering#sl-rail-set-address-filter-address).
- Global [RAIL_SetAddressFilterAddressMask](address-filtering#rail-set-address-filter-address-mask)  (RAIL_Handle_t railHandle, uint8_t field, const uint8_t *bitMask)  
  RAIL 2.x synonym of [sl_rail_set_address_filter_address_mask()](address-filtering#sl-rail-set-address-filter-address-mask).
- Global [RAIL_SetCcaThreshold](transmit#rail-set-cca-threshold)  (RAIL_Handle_t railHandle, int8_t ccaThresholdDbm)  
  RAIL 2.x synonym of [sl_rail_set_cca_threshold()](transmit#sl-rail-set-cca-threshold).
- Global [RAIL_SetCrcInitVal](radio-configuration#rail-set-crc-init-val)  (RAIL_Handle_t railHandle, uint32_t crcInit)  
  RAIL 2.x synonym of [sl_rail_set_crc_init_val()](radio-configuration#sl-rail-set-crc-init-val).
- Global [RAIL_SetFixedLength](radio-configuration#rail-set-fixed-length)  (RAIL_Handle_t railHandle, uint16_t length)  
  RAIL 2.x synonym of [sl_rail_set_fixed_length()](radio-configuration#sl-rail-set-fixed-length).
- Global [RAIL_SETFIXEDLENGTH_INVALID](radio-configuration#rail-setfixedlength-invalid)  
  RAIL 2.x synonym of [SL_RAIL_SET_FIXED_LENGTH_INVALID](radio-configuration#sl-rail-set-fixed-length-invalid).
- Global [RAIL_SetFreqOffset](diagnostic#rail-set-freq-offset)  (RAIL_Handle_t railHandle, RAIL_FrequencyOffset_t freqOffset)  
  RAIL 2.x synonym of [sl_rail_set_freq_offset()](diagnostic#sl-rail-set-freq-offset).
- Global [RAIL_SetMfmPingPongFifo](mfm#rail-set-mfm-ping-pong-fifo)  (RAIL_Handle_t railHandle, const [RAIL_MFM_PingPongBufferConfig_t](rail-mfm-ping-pong-buffer-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_set_mfm_ping_pong_fifo()](mfm#sl-rail-set-mfm-ping-pong-fifo).
- Global [RAIL_SetMultiTimer](system-timing#rail-set-multi-timer)  ([RAIL_MultiTimer_t](rail-multi-timer-t) *tmr, RAIL_Time_t expirationTime, RAIL_TimeMode_t expirationMode, RAIL_MultiTimerCallback_t callback, void *cbArg)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_SetNextTxRepeat](state-transitions#rail-set-next-tx-repeat)  (RAIL_Handle_t railHandle, const [RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t) *repeatConfig)  
  RAIL 2.x synonym of [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat).
- Global [RAIL_SetPaCTune](radio-configuration#rail-set-pa-c-tune)  (RAIL_Handle_t railHandle, uint8_t txPaCtuneValue, uint8_t rxPaCtuneValue)  
  This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_SetPaPowerSetting](pa#rail-set-pa-power-setting)  (RAIL_Handle_t railHandle, RAIL_PaPowerSetting_t paPowerSetting, RAIL_TxPower_t minPowerDbm, RAIL_TxPower_t maxPowerDbm, RAIL_TxPower_t currentPowerDbm)  
  This RAIL 2.x function has been eliminated in RAIL 3 with the use of PA power tables.
- Global [RAIL_SetPtiProtocol](pti#rail-set-pti-protocol)  (RAIL_Handle_t railHandle, RAIL_PtiProtocol_t protocol)  
  RAIL 2.x synonym of [sl_rail_set_pti_protocol()](pti#sl-rail-set-pti-protocol).
- Global [RAIL_SetRfSenseSelectiveOokWakeupPayload](rf-sense#rail-set-rf-sense-selective-ook-wakeup-payload)  (RAIL_Handle_t railHandle, uint8_t numSyncwordBytes, uint32_t syncword)  
  RAIL 2.x synonym of [sl_rail_set_rf_sense_selective_ook_wakeup_payload()](rf-sense#sl-rail-set-rf-sense-selective-ook-wakeup-payload).
- Global [RAIL_SetRssiDetectThreshold](receive#rail-set-rssi-detect-threshold)  (RAIL_Handle_t railHandle, int8_t rssiThresholdDbm)  
  RAIL 2.x synonym of [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold).
- Global [RAIL_SetRssiOffset](receive#rail-set-rssi-offset)  (RAIL_Handle_t railHandle, int8_t rssiOffset)  
  RAIL 2.x synonym of [sl_rail_set_rssi_offset()](receive#sl-rail-set-rssi-offset).
- Global [RAIL_SetRxFifo](data-management#rail-set-rx-fifo)  (RAIL_Handle_t railHandle, uint8_t *addr, uint16_t *size)  
  RAIL 2.x synonym of [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo). Also see [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue). Unlike in RAIL 2.x where the Rx FIFO and internal Packet Queue are shared among all protocols, those RAIL 3 APIs allow a protocol to establish, even when inactive, its own Rx FIFO and Packet Queue independent of other protocols' which are preserved and not reset during protocol switches.
- Global [RAIL_SetRxFifoThreshold](data-management#rail-set-rx-fifo-threshold)  (RAIL_Handle_t railHandle, uint16_t rxThreshold)  
  RAIL 2.x synonym of [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold).
- Global [RAIL_SetRxTransitions](state-transitions#rail-set-rx-transitions)  (RAIL_Handle_t railHandle, const [RAIL_StateTransitions_t](rail-state-transitions-t) *transitions)  
  RAIL 2.x synonym of [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions).
- Global [RAIL_SetStateTiming](state-transitions#rail-set-state-timing)  (RAIL_Handle_t railHandle, [RAIL_StateTiming_t](rail-state-timing-t) *timings)  
  RAIL 2.x synonym of [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing).
- Global [RAIL_SetTaskPriority](multiprotocol#rail-set-task-priority)  (RAIL_Handle_t railHandle, uint8_t priority, RAIL_TaskType_t taskType)  
  RAIL 2.x synonym of [sl_rail_set_task_priority()](multiprotocol#sl-rail-set-task-priority).
- Global [RAIL_SetTime](system-timing#rail-set-time)  (RAIL_Time_t time)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_time()](system-timing#sl-rail-set-time) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_SetTimer](system-timing#rail-set-timer)  (RAIL_Handle_t railHandle, RAIL_Time_t time, RAIL_TimeMode_t mode, RAIL_TimerCallback_t cb)  
  RAIL 2.x synonym of [sl_rail_set_timer()](system-timing#sl-rail-set-timer).
- Global [RAIL_SetTransitionTime](multiprotocol#rail-set-transition-time)  (RAIL_Time_t transitionTime)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_transition_time()](multiprotocol#sl-rail-set-transition-time) with its additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_SetTune](diagnostic#rail-set-tune)  (RAIL_Handle_t railHandle, uint32_t tune)  
  RAIL 2.x synonym of [sl_rail_set_tune()](diagnostic#sl-rail-set-tune).
- Global [RAIL_SetTuneDelta](diagnostic#rail-set-tune-delta)  (RAIL_Handle_t railHandle, int32_t delta)  
  RAIL 2.x synonym of [sl_rail_set_tune_delta()](diagnostic#sl-rail-set-tune-delta).
- Global [RAIL_SetTxAltPreambleLength](transmit#rail-set-tx-alt-preamble-length)  (RAIL_Handle_t railHandle, uint16_t length)  
  RAIL 2.x synonym of [sl_rail_set_tx_alt_preamble_length()](transmit#sl-rail-set-tx-alt-preamble-length).
- Global [RAIL_SetTxFifo](data-management#rail-set-tx-fifo)  (RAIL_Handle_t railHandle, uint8_t *addr, uint16_t initLength, uint16_t size)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) with additional parameters and permits establishing a non-power-of-2-sized Tx FIFO.
- Global [RAIL_SetTxFifoAlt](data-management#rail-set-tx-fifo-alt)  (RAIL_Handle_t railHandle, uint8_t *addr, uint16_t startOffset, uint16_t initLength, uint16_t size)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) with parameters in a different order and permits establishing a non-power-of-2-sized Tx FIFO.
- Global [RAIL_SetTxFifoThreshold](data-management#rail-set-tx-fifo-threshold)  (RAIL_Handle_t railHandle, uint16_t txThreshold)  
  RAIL 2.x synonym of [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold).
- Global [RAIL_SetTxPower](pa#rail-set-tx-power)  (RAIL_Handle_t railHandle, RAIL_TxPowerLevel_t powerLevel)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_set_tx_power().
- Global [RAIL_SetTxPowerDbm](pa#rail-set-tx-power-dbm)  (RAIL_Handle_t railHandle, RAIL_TxPower_t power)  
  RAIL 2.x synonym of [sl_rail_set_tx_power_dbm()](pa#sl-rail-set-tx-power-dbm).
- Global [RAIL_SetTxTransitions](state-transitions#rail-set-tx-transitions)  (RAIL_Handle_t railHandle, const [RAIL_StateTransitions_t](rail-state-transitions-t) *transitions)  
  RAIL 2.x synonym of [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions).
- Global [RAIL_SetWhiteningInitVal](radio-configuration#rail-set-whitening-init-val)  (RAIL_Handle_t railHandle, uint16_t whiteInit)  
  RAIL 2.x synonym of [sl_rail_set_whitening_init_val()](radio-configuration#sl-rail-set-whitening-init-val).
- Global [RAIL_Sidewalk_ConfigPhy2GFSK50kbps](sidewalk-phy#rail-sidewalk-config-phy2-gfsk50kbps)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_sidewalk_config_phy_2gfsk_50_kbps()](sidewalk-phy#sl-rail-sidewalk-config-phy-2gfsk-50-kbps).
- Global [RAIL_Sidewalk_Phy2GFSK50kbps](sidewalk-phy#rail-sidewalk-phy2-gfsk50kbps)  
  RAIL 2.x synonym of [sl_rail_sidewalk_phy_2gfsk_50_kbps](sidewalk-phy#sl-rail-sidewalk-phy-2gfsk-50-kbps).
- Global [RAIL_Sleep](sleep#rail-sleep)  (uint16_t wakeupProcessTime, bool *deepSleepAllowed)  
  RAIL 2.x synonym of [sl_rail_sleep()](sleep#sl-rail-sleep).
- Global [RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED](sleep#rail-sleep-config-timersync-disabled)  
  RAIL 2.x synonym of [SL_RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED](sleep#sl-rail-sleep-config-timersync-disabled).
- Global [RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled)  
  RAIL 2.x synonym of [SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#sl-rail-sleep-config-timersync-enabled).
- Global [RAIL_SleepConfig_t](sleep#rail-sleep-config-t)  
  RAIL 2.x synonym of [sl_rail_sleep_config_t](sleep#sl-rail-sleep-config-t).
- Class [RAIL_StackInfoCommon_t](rail-stack-info-common-t)  
  RAIL 2.x synonym of [sl_rail_stack_info_common_t](sl-rail-stack-info-common-t).
- Global [RAIL_StackInfoCommon_t::phyId](rail-stack-info-common-t#phy-id)  
  RAIL 2.x synonym of [sl_rail_stack_info_common_t::phy_id](sl-rail-stack-info-common-t#phy-id).
- Global [RAIL_StackInfoCommon_t::protocolId](rail-stack-info-common-t#protocol-id)  
  RAIL 2.x synonym of [sl_rail_stack_info_common_t::protocol_id](sl-rail-stack-info-common-t#protocol-id).
- Global [RAIL_StartAverageRssi](receive#rail-start-average-rssi)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_Time_t averagingTimeUs, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi).
- Global [RAIL_StartCcaCsmaTx](packet-tx#rail-start-cca-csma-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_CsmaConfig_t](rail-csma-config-t) *csmaConfig, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx).
- Global [RAIL_StartCcaLbtTx](packet-tx#rail-start-cca-lbt-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_LbtConfig_t](rail-lbt-config-t) *lbtConfig, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx).
- Global [RAIL_StartRfSense](rf-sense#rail-start-rf-sense)  (RAIL_Handle_t railHandle, RAIL_RfSenseBand_t band, RAIL_Time_t senseTime, RAIL_RfSense_CallbackPtr_t cb)  
  RAIL 2.x synonym of [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense).
- Global [RAIL_StartRx](receive#rail-start-rx)  (RAIL_Handle_t railHandle, uint16_t channel, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_rx()](receive#sl-rail-start-rx).
- Global [RAIL_StartScheduledCcaCsmaTx](packet-tx#rail-start-scheduled-cca-csma-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *scheduleTxConfig, const [RAIL_CsmaConfig_t](rail-csma-config-t) *csmaConfig, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx).
- Global [RAIL_StartScheduledCcaLbtTx](packet-tx#rail-start-scheduled-cca-lbt-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *scheduleTxConfig, const [RAIL_LbtConfig_t](rail-lbt-config-t) *lbtConfig, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx).
- Global [RAIL_StartScheduledTx](packet-tx#rail-start-scheduled-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *config, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx).
- Global [RAIL_StartSelectiveOokRfSense](rf-sense#rail-start-selective-ook-rf-sense)  (RAIL_Handle_t railHandle, [RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense).
- Global [RAIL_StartThermistorMeasurement](external-thermistor#rail-start-thermistor-measurement)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement).
- Global [RAIL_StartTx](packet-tx#rail-start-tx)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_start_tx()](packet-tx#sl-rail-start-tx).
- Global [RAIL_StartTxStream](diagnostic#rail-start-tx-stream)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_StreamMode_t mode)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream) with its additional parameter.
- Global [RAIL_StartTxStreamAlt](diagnostic#rail-start-tx-stream-alt)  (RAIL_Handle_t railHandle, uint16_t channel, RAIL_StreamMode_t mode, RAIL_TxOptions_t options)  
  RAIL 2.x synonym of [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream).
- Global [RAIL_StateBuffer_t](general#rail-state-buffer-t)  [1]  
  RAIL 2.x synonym of [sl_rail_opaque_value_t](general#sl-rail-opaque-value-t).
- Class [RAIL_StateTiming_t](rail-state-timing-t)  
  RAIL 2.x synonym of [sl_rail_state_timing_t](sl-rail-state-timing-t).
- Global [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx).
- Global [RAIL_StateTiming_t::idleToTx](rail-state-timing-t#idle-to-tx)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::idle_to_tx](sl-rail-state-timing-t#idle-to-tx).
- Global [RAIL_StateTiming_t::rxSearchTimeout](rail-state-timing-t#rx-search-timeout)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::rxsearch_timeout](sl-rail-state-timing-t#rxsearch-timeout).
- Global [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx).
- Global [RAIL_StateTiming_t::txToRx](rail-state-timing-t#tx-to-rx)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_rx](sl-rail-state-timing-t#tx-to-rx).
- Global [RAIL_StateTiming_t::txToRxSearchTimeout](rail-state-timing-t#tx-to-rx-search-timeout)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_rxsearch_timeout](sl-rail-state-timing-t#tx-to-rxsearch-timeout).
- Global [RAIL_StateTiming_t::txToTx](rail-state-timing-t#tx-to-tx)  
  RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_tx](sl-rail-state-timing-t#tx-to-tx).
- Class [RAIL_StateTransitions_t](rail-state-transitions-t)  
  RAIL 2.x synonym of [sl_rail_state_transitions_t](sl-rail-state-transitions-t).
- Global [RAIL_StateTransitions_t::error](rail-state-transitions-t#error)  
  RAIL 2.x synonym of [sl_rail_state_transitions_t::error](sl-rail-state-transitions-t#error).
- Global [RAIL_StateTransitions_t::success](rail-state-transitions-t#success)  
  RAIL 2.x synonym of [sl_rail_state_transitions_t::success](sl-rail-state-transitions-t#success).
- Global [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).
- Global [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).
- Global [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state).
- Global [RAIL_STATUS_NO_ERROR](general#rail-status-no-error)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error).
- Global [RAIL_STATUS_SCHED_ERROR](general#rail-status-sched-error)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_SCHED_ERROR](general#sl-rail-status-sched-error).
- Global [RAIL_STATUS_SUSPENDED](general#rail-status-suspended)  
  RAIL 2.x synonym of [SL_RAIL_STATUS_SUSPENDED](general#sl-rail-status-suspended).
- Global [RAIL_Status_t](general#rail-status-t)  
  RAIL 2.x synonym of [sl_rail_status_t](general#sl-rail-status-t).
- Global [RAIL_STOP_MODE_ACTIVE](transmit#rail-stop-mode-active)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODE_ACTIVE](transmit#sl-rail-stop-mode-active).
- Global [RAIL_STOP_MODE_ACTIVE_SHIFT](transmit#rail-stop-mode-active-shift)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODE_ACTIVE_SHIFT](transmit#sl-rail-stop-mode-active-shift).
- Global [RAIL_STOP_MODE_PENDING](transmit#rail-stop-mode-pending)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODE_PENDING](transmit#sl-rail-stop-mode-pending).
- Global [RAIL_STOP_MODE_PENDING_SHIFT](transmit#rail-stop-mode-pending-shift)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODE_PENDING_SHIFT](transmit#sl-rail-stop-mode-pending-shift).
- Global [RAIL_STOP_MODES_ALL](transmit#rail-stop-modes-all)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODES_ALL](transmit#sl-rail-stop-modes-all).
- Global [RAIL_STOP_MODES_NONE](transmit#rail-stop-modes-none)  
  RAIL 2.x synonym of [SL_RAIL_STOP_MODES_NONE](transmit#sl-rail-stop-modes-none).
- Global [RAIL_StopInfinitePreambleTx](diagnostic#rail-stop-infinite-preamble-tx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_stop_infinite_preamble_tx()](diagnostic#sl-rail-stop-infinite-preamble-tx).
- Global [RAIL_StopMode_t](transmit#rail-stop-mode-t)  
  RAIL 2.x synonym of [sl_rail_stop_mode_t](transmit#sl-rail-stop-mode-t).
- Global [RAIL_StopTx](transmit#rail-stop-tx)  (RAIL_Handle_t railHandle, RAIL_StopMode_t mode)  
  RAIL 2.x synonym of [sl_rail_stop_tx()](transmit#sl-rail-stop-tx).
- Global [RAIL_StopTxStream](diagnostic#rail-stop-tx-stream)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_stop_tx_stream()](diagnostic#sl-rail-stop-tx-stream).
- Global [RAIL_STREAM_1000_STREAM](diagnostic#rail-stream-1000-stream)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_1000_STREAM](diagnostic#sl-rail-stream-1000-stream).
- Global [RAIL_STREAM_10_STREAM](diagnostic#rail-stream-10-stream)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_10_STREAM](diagnostic#sl-rail-stream-10-stream).
- Global [RAIL_STREAM_CARRIER_WAVE](diagnostic#rail-stream-carrier-wave)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_CARRIER_WAVE](diagnostic#sl-rail-stream-carrier-wave).
- Global [RAIL_STREAM_CARRIER_WAVE_PHASENOISE](diagnostic#rail-stream-carrier-wave-phasenoise)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_CARRIER_WAVE_PHASENOISE](diagnostic#sl-rail-stream-carrier-wave-phasenoise).
- Global [RAIL_STREAM_CARRIER_WAVE_SHIFTED](diagnostic#rail-stream-carrier-wave-shifted)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_CARRIER_WAVE_SHIFTED](diagnostic#sl-rail-stream-carrier-wave-shifted).
- Global [RAIL_STREAM_MODES_COUNT](diagnostic#rail-stream-modes-count)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_MODES_COUNT](diagnostic#sl-rail-stream-modes-count).
- Global [RAIL_STREAM_PN9_STREAM](diagnostic#rail-stream-pn9-stream)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_PN9_STREAM](diagnostic#sl-rail-stream-pn9-stream).
- Global [RAIL_STREAM_RAMP_STREAM](diagnostic#rail-stream-ramp-stream)  
  RAIL 2.x synonym of [SL_RAIL_STREAM_RAMP_STREAM](diagnostic#sl-rail-stream-ramp-stream).
- Global [RAIL_StreamMode_t](diagnostic#rail-stream-mode-t)  
  RAIL 2.x synonym of [sl_rail_stream_mode_t](diagnostic#sl-rail-stream-mode-t).
- Global [RAIL_SUBGIG_MAX](pa-efr32-xg2-x#rail-subgig-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_MAX.
- Global [RAIL_SUBGIG_MIN](pa-efr32-xg2-x#rail-subgig-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_MIN.
- Global [RAIL_Supports2p4GHzBand](features#rail-supports2p4-g-hz-band)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_2p4_ghz_band()](features#sl-rail-supports-2p4-ghz-band).
- Global [RAIL_SUPPORTS_2P4GHZ_BAND](features#rail-supports-2-p4-ghz-band)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-supports-2-p4-ghz-band).
- Global [RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#rail-supports-addr-filter-address-bit-mask-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#sl-rail-supports-addr-filter-address-bit-mask-1).
- Global [RAIL_SUPPORTS_ADDR_FILTER_MASK](features#rail-supports-addr-filter-mask-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_ADDR_FILTER_MASK](features#sl-rail-supports-addr-filter-mask-1).
- Global [RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#rail-supports-alternate-tx-power-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#sl-rail-supports-alternate-tx-power-1).
- Global [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1).
- Global [RAIL_SUPPORTS_AUXADC](features#rail-supports-auxadc)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_AUXADC](features#sl-rail-supports-auxadc).
- Global [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1).
- Global [RAIL_SUPPORTS_COLLISION_DETECTION](features#rail-supports-collision-detection-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_COLLISION_DETECTION](features#sl-rail-supports-collision-detection-1).
- Global [RAIL_SUPPORTS_DBM_POWERSETTING_MAPPING_TABLE](features#rail-supports-dbm-powersetting-mapping-table)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_DBM_POWERSETTING_MAPPING_TABLE](features#sl-rail-supports-dbm-powersetting-mapping-table).
- Global [RAIL_SUPPORTS_DIRECT_MODE](features#rail-supports-direct-mode-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_DIRECT_MODE](features#sl-rail-supports-direct-mode-1).
- Global [RAIL_SUPPORTS_DUAL_BAND](features#rail-supports-dual-band-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_DUAL_BAND](features#sl-rail-supports-dual-band-1).
- Global [RAIL_SUPPORTS_DUAL_SYNC_WORDS](features#rail-supports-dual-sync-words-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_DUAL_SYNC_WORDS](features#sl-rail-supports-dual-sync-words-1).
- Global [RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#rail-supports-external-thermistor-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1).
- Global [RAIL_SUPPORTS_FAST_RX2RX](features#rail-supports-fast-rx2-rx-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_FAST_RX_TO_RX](features#sl-rail-supports-fast-rx-to-rx-1).
- Global [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1).
- Global [RAIL_SUPPORTS_IEEE802154_BAND_2P4](features#rail-supports-ieee802154-band-2-p4)  
  RAIL 2.x synonym of [SL_RAIL_IEEE802154_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-ieee802154-supports-2-p4-ghz-band).
- Global [RAIL_SUPPORTS_MFM](features#rail-supports-mfm-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_MFM](features#sl-rail-supports-mfm-1).
- Global [RAIL_SUPPORTS_OFDM_PA](features#rail-supports-ofdm-pa)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_OFDM_PA](features#sl-rail-supports-ofdm-pa-1).
- Global [RAIL_SUPPORTS_PATH_DIVERSITY](features#rail-supports-path-diversity-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PATH_DIVERSITY](features#sl-rail-supports-path-diversity-1).
- Global [RAIL_SUPPORTS_PRECISION_LFRCO](features#rail-supports-precision-lfrco-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PRECISION_LFRCO](features#sl-rail-supports-precision-lfrco-1).
- Global [RAIL_SUPPORTS_PROTOCOL_BLE](features#rail-supports-protocol-ble-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PROTOCOL_BLE](features#sl-rail-supports-protocol-ble-1).
- Global [RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#rail-supports-protocol-ieee802154-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#sl-rail-supports-protocol-ieee802154-1).
- Global [RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#rail-supports-protocol-sidewalk-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#sl-rail-supports-protocol-sidewalk-1).
- Global [RAIL_SUPPORTS_PROTOCOL_WI_SUN](features#rail-supports-protocol-wi-sun-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PROTOCOL_WI_SUN](features#sl-rail-supports-protocol-wi-sun-1).
- Global [RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#rail-supports-protocol-zwave)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#sl-rail-supports-protocol-zwave-1).
- Global [RAIL_SUPPORTS_PRS_LNA_BYPASS](features#rail-supports-prs-lna-bypass-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_PRS_LNA_BYPASS](features#sl-rail-supports-prs-lna-bypass-1).
- Global [RAIL_SUPPORTS_RADIO_ENTROPY](features#rail-supports-radio-entropy-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RADIO_ENTROPY](features#sl-rail-supports-radio-entropy-1).
- Global [RAIL_SUPPORTS_RFSENSE_ENERGY_DETECTION](features#rail-supports-rfsense-energy-detection)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RF_SENSE_ENERGY_DETECTION](features#sl-rail-supports-rf-sense-energy-detection-1).
- Global [RAIL_SUPPORTS_RFSENSE_SELECTIVE_OOK](features#rail-supports-rfsense-selective-ook)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RF_SENSE_SELECTIVE_OOK](features#sl-rail-supports-rf-sense-selective-ook-1).
- Global [RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD](features#rail-supports-rssi-detect-threshold-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD](features#sl-rail-supports-rssi-detect-threshold-1).
- Global [RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO](features#rail-supports-rx-direct-mode-data-to-fifo-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO](features#sl-rail-supports-rx-direct-mode-data-to-fifo-1).
- Global [RAIL_SUPPORTS_RX_RAW_DATA](features#rail-supports-rx-raw-data-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_RX_RAW_DATA](features#sl-rail-supports-rx-raw-data-1).
- Global [RAIL_SUPPORTS_SQ_PHY](features#rail-supports-sq-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_SQ_PHY](features#sl-rail-supports-sq-phy-1).
- Global [RAIL_SUPPORTS_SUBGHZ_BAND](features#rail-supports-subghz-band)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_SUB_GHZ_BAND](features#sl-rail-supports-sub-ghz-band-1).
- Global [RAIL_SUPPORTS_THERMAL_PROTECTION](features#rail-supports-thermal-protection-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_THERMAL_PROTECTION](features#sl-rail-supports-thermal-protection-1).
- Global [RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#rail-supports-trustzone-secure-peripherals)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#sl-rail-supports-trustzone-secure-peripherals-1).
- Global [RAIL_SUPPORTS_TX_REPEAT_START_TO_START](features#rail-supports-tx-repeat-start-to-start-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_TX_REPEAT_START_TO_START](features#sl-rail-supports-tx-repeat-start-to-start-1).
- Global [RAIL_SUPPORTS_TX_TO_TX](features#rail-supports-tx-to-tx-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_TX_TO_TX](features#sl-rail-supports-tx-to-tx-1).
- Global [RAIL_SUPPORTS_VDET](features#rail-supports-vdet-1)  
  RAIL 2.x synonym of [SL_RAIL_SUPPORTS_VDET](features#sl-rail-supports-vdet-1).
- Global [RAIL_SupportsAddrFilterAddressBitMask](features#rail-supports-addr-filter-address-bit-mask)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_addr_filter_address_bit_mask()](features#sl-rail-supports-addr-filter-address-bit-mask).
- Global [RAIL_SupportsAddrFilterMask](features#rail-supports-addr-filter-mask)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_addr_filter_mask()](features#sl-rail-supports-addr-filter-mask).
- Global [RAIL_SupportsAlternateTxPower](features#rail-supports-alternate-tx-power)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_alternate_tx_power()](features#sl-rail-supports-alternate-tx-power).
- Global [RAIL_SupportsAntennaDiversity](features#rail-supports-antenna-diversity)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_antenna_diversity()](features#sl-rail-supports-antenna-diversity).
- Global [RAIL_SupportsAuxAdc](features#rail-supports-aux-adc)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_aux_adc()](features#sl-rail-supports-aux-adc).
- Global [RAIL_SupportsChannelHopping](features#rail-supports-channel-hopping)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping).
- Global [RAIL_SupportsCollisionDetection](features#rail-supports-collision-detection)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_collision_detection()](features#sl-rail-supports-collision-detection).
- Global [RAIL_SupportsDirectMode](features#rail-supports-direct-mode)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_direct_mode()](features#sl-rail-supports-direct-mode).
- Global [RAIL_SupportsDualBand](features#rail-supports-dual-band)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_dual_band()](features#sl-rail-supports-dual-band).
- Global [RAIL_SupportsDualSyncWords](features#rail-supports-dual-sync-words)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_dual_sync_words()](features#sl-rail-supports-dual-sync-words).
- Global [RAIL_SupportsExternalThermistor](features#rail-supports-external-thermistor)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_external_thermistor()](features#sl-rail-supports-external-thermistor).
- Global [RAIL_SupportsFastRx2Rx](features#rail-supports-fast-rx2-rx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_fast_rx_to_rx()](features#sl-rail-supports-fast-rx-to-rx).
- Global [RAIL_SupportsHFXOCompensation](features#rail-supports-hfxo-compensation)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_hfxo_compensation()](features#sl-rail-supports-hfxo-compensation).
- Global [RAIL_SupportsIEEE802154Band2P4](features#rail-supports-ieee802154-band2-p4)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_ieee802154_supports_2p4_ghz_band()](features#sl-rail-ieee802154-supports-2p4-ghz-band).
- Global [RAIL_SupportsMfm](features#rail-supports-mfm)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_mfm()](features#sl-rail-supports-mfm).
- Global [RAIL_SupportsOFDMPA](features#rail-supports-ofdmpa)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_ofdm_pa()](features#sl-rail-supports-ofdm-pa).
- Global [RAIL_SupportsPathDiversity](features#rail-supports-path-diversity)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_path_diversity()](features#sl-rail-supports-path-diversity).
- Global [RAIL_SupportsPrecisionLFRCO](features#rail-supports-precision-lfrco)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_precision_lfrco()](features#sl-rail-supports-precision-lfrco).
- Global [RAIL_SupportsProtocolBLE](features#rail-supports-protocol-ble)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_protocol_ble()](features#sl-rail-supports-protocol-ble).
- Global [RAIL_SupportsProtocolIEEE802154](features#rail-supports-protocol-ieee802154)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_protocol_ieee802154()](features#sl-rail-supports-protocol-ieee802154).
- Global [RAIL_SupportsProtocolSidewalk](features#rail-supports-protocol-sidewalk)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_protocol_sidewalk()](features#sl-rail-supports-protocol-sidewalk).
- Global [RAIL_SupportsProtocolWiSUN](features#rail-supports-protocol-wi-sun)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_protocol_wi_sun()](features#sl-rail-supports-protocol-wi-sun).
- Global [RAIL_SupportsProtocolZWave](features#rail-supports-protocol-z-wave)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_protocol_zwave()](features#sl-rail-supports-protocol-zwave).
- Global [RAIL_SupportsPrsLnaBypass](features#rail-supports-prs-lna-bypass)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_prs_lna_bypass()](features#sl-rail-supports-prs-lna-bypass).
- Global [RAIL_SupportsRadioEntropy](features#rail-supports-radio-entropy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_radio_entropy()](features#sl-rail-supports-radio-entropy).
- Global [RAIL_SupportsRfSenseEnergyDetection](features#rail-supports-rf-sense-energy-detection)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_rf_sense_energy_detection()](features#sl-rail-supports-rf-sense-energy-detection).
- Global [RAIL_SupportsRfSenseSelectiveOok](features#rail-supports-rf-sense-selective-ook)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_rf_sense_selective_ook()](features#sl-rail-supports-rf-sense-selective-ook).
- Global [RAIL_SupportsRssiDetectThreshold](features#rail-supports-rssi-detect-threshold)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_rssi_detect_threshold()](features#sl-rail-supports-rssi-detect-threshold).
- Global [RAIL_SupportsRxDirectModeDataToFifo](features#rail-supports-rx-direct-mode-data-to-fifo)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_rx_direct_mode_data_to_fifo()](features#sl-rail-supports-rx-direct-mode-data-to-fifo).
- Global [RAIL_SupportsRxRawData](features#rail-supports-rx-raw-data)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_rx_raw_data()](features#sl-rail-supports-rx-raw-data).
- Global [RAIL_SupportsSQPhy](features#rail-supports-sq-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_sq_phy()](features#sl-rail-supports-sq-phy).
- Global [RAIL_SupportsSubGHzBand](features#rail-supports-sub-g-hz-band)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_sub_ghz_band()](features#sl-rail-supports-sub-ghz-band).
- Global [RAIL_SupportsThermalProtection](features#rail-supports-thermal-protection)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_thermal_protection()](features#sl-rail-supports-thermal-protection).
- Global [RAIL_SupportsTrustZoneSecurePeripherals](features#rail-supports-trust-zone-secure-peripherals)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_trustzone_secure_peripherals()](features#sl-rail-supports-trustzone-secure-peripherals).
- Global [RAIL_SupportsTxPowerMode](features#rail-supports-tx-power-mode)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t powerMode, RAIL_TxPowerLevel_t *pMaxPowerLevel)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily replaced with sli_rail_supports_tx_power_mode() with its additional parameter.
- Global [RAIL_SupportsTxPowerModeAlt](features#rail-supports-tx-power-mode-alt)  (RAIL_Handle_t railHandle, RAIL_TxPowerMode_t *powerMode, RAIL_TxPowerLevel_t *maxPowerLevel, RAIL_TxPowerLevel_t *minPowerLevel)  
  This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_supports_tx_power_mode().
- Global [RAIL_SupportsTxRepeatStartToStart](features#rail-supports-tx-repeat-start-to-start)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_tx_repeat_start_to_start()](features#sl-rail-supports-tx-repeat-start-to-start).
- Global [RAIL_SupportsTxToTx](features#rail-supports-tx-to-tx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_tx_to_tx()](features#sl-rail-supports-tx-to-tx).
- Global [RAIL_SupportsVdet](features#rail-supports-vdet)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_supports_vdet()](features#sl-rail-supports-vdet).
- Class [RAIL_SyncWordConfig_t](rail-sync-word-config-t)  
  RAIL 2.x synonym of [sl_rail_sync_word_config_t](sl-rail-sync-word-config-t).
- Global [RAIL_SyncWordConfig_t::syncWord1](rail-sync-word-config-t#sync-word1)  
  RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_0](sl-rail-sync-word-config-t#sync-word-0).
- Global [RAIL_SyncWordConfig_t::syncWord2](rail-sync-word-config-t#sync-word2)  
  RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_1](sl-rail-sync-word-config-t#sync-word-1).
- Global [RAIL_SyncWordConfig_t::syncWordBits](rail-sync-word-config-t#sync-word-bits)  
  RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_bits](sl-rail-sync-word-config-t#sync-word-bits).
- Global [RAIL_TASK_TYPE_OTHER](multiprotocol#rail-task-type-other)  
  RAIL 2.x synonym of [SL_RAIL_TASK_TYPE_OTHER](multiprotocol#sl-rail-task-type-other).
- Global [RAIL_TASK_TYPE_START_RX](multiprotocol#rail-task-type-start-rx)  
  RAIL 2.x synonym of [SL_RAIL_TASK_TYPE_START_RX](multiprotocol#sl-rail-task-type-start-rx).
- Global [RAIL_TaskType_t](multiprotocol#rail-task-type-t)  
  RAIL 2.x synonym of [sl_rail_task_type_t](multiprotocol#sl-rail-task-type-t).
- Global [RAIL_TEMP_MEASURE_COUNT](thermal-protection#rail-temp-measure-count)  
  RAIL 2.x synonym of [SL_RAIL_TEMP_MEASURE_COUNT](thermal-protection#sl-rail-temp-measure-count).
- Global [RAIL_TIME_ABSOLUTE](system-timing#rail-time-absolute)  
  RAIL 2.x synonym of [SL_RAIL_TIME_ABSOLUTE](system-timing#sl-rail-time-absolute).
- Global [RAIL_TIME_DELAY](system-timing#rail-time-delay)  
  RAIL 2.x synonym of [SL_RAIL_TIME_DELAY](system-timing#sl-rail-time-delay).
- Global [RAIL_TIME_DISABLED](system-timing#rail-time-disabled)  
  RAIL 2.x synonym of [SL_RAIL_TIME_DISABLED](system-timing#sl-rail-time-disabled).
- Global [RAIL_Time_t](system-timing#rail-time-t)  
  RAIL 2.x synonym of [sl_rail_time_t](system-timing#sl-rail-time-t).
- Global [RAIL_TimeMode_t](system-timing#rail-time-mode-t)  
  RAIL 2.x synonym of [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t).
- Global [RAIL_TIMER_SYNC_DEFAULT](sleep#rail-timer-sync-default)  
  RAIL 2.x synonym of [SL_RAIL_TIMER_SYNC_DEFAULT](sleep#sl-rail-timer-sync-default).
- Global [RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep#rail-timer-sync-prs-channel-default)  
  RAIL 2.x synonym of [SL_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep#sl-rail-timer-sync-prs-channel-default).
- Global [RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep#rail-timer-sync-rtcc-channel-default)  
  RAIL 2.x synonym of [SL_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep#sl-rail-timer-sync-rtcc-channel-default).
- Global [RAIL_TimerCallback_t](system-timing#rail-timer-callback-t)  )(RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_timer_callback_t()](system-timing#sl-rail-timer-callback-t).
- Class [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t)  
  RAIL 2.x synonym of [sl_rail_timer_sync_config_t](sl-rail-timer-sync-config-t).
- Global [RAIL_TimerSyncConfig_t::prsChannel](rail-timer-sync-config-t#prs-channel)  
  RAIL 2.x synonym of [sl_rail_timer_sync_config_t::prs_channel](sl-rail-timer-sync-config-t#prs-channel).
- Global [RAIL_TimerSyncConfig_t::rtccChannel](rail-timer-sync-config-t#rtcc-channel)  
  RAIL 2.x synonym of [sl_rail_timer_sync_config_t::rtcc_channel](sl-rail-timer-sync-config-t#rtcc-channel).
- Global [RAIL_TimerSyncConfig_t::sleep](rail-timer-sync-config-t#sleep)  
  RAIL 2.x synonym of [sl_rail_timer_sync_config_t::sleep](sl-rail-timer-sync-config-t#sleep).
- Global [RAIL_TRANSITION_TIME_KEEP](state-transitions#rail-transition-time-keep)  
  RAIL 2.x synonym of [SL_RAIL_TRANSITION_TIME_KEEP](state-transitions#sl-rail-transition-time-keep).
- Global [RAIL_TransitionTime_t](state-transitions#rail-transition-time-t)  
  RAIL 2.x synonym of [sl_rail_transition_time_t](state-transitions#sl-rail-transition-time-t).
- Global [RAIL_TriggerRxChannelHop](rx-channel-hopping#rail-trigger-rx-channel-hop)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_trigger_rx_channel_hop()](rx-channel-hopping#sl-rail-trigger-rx-channel-hop).
- Global [RAIL_TX_DATA_SOURCE_COUNT](data-management#rail-tx-data-source-count)  
  RAIL 2.x synonym of [SL_RAIL_TX_DATA_SOURCE_COUNT](data-management#sl-rail-tx-data-source-count).
- Global [RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#rail-tx-option-alt-preamble-len)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#sl-rail-tx-option-alt-preamble-len).
- Global [RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT](transmit#rail-tx-option-alt-preamble-len-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT](transmit#sl-rail-tx-option-alt-preamble-len-shift).
- Global [RAIL_TX_OPTION_ANTENNA0](transmit#rail-tx-option-antenna0)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ANTENNA_0](transmit#sl-rail-tx-option-antenna-0).
- Global [RAIL_TX_OPTION_ANTENNA0_SHIFT](transmit#rail-tx-option-antenna0-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ANTENNA_0_SHIFT](transmit#sl-rail-tx-option-antenna-0-shift).
- Global [RAIL_TX_OPTION_ANTENNA1](transmit#rail-tx-option-antenna1)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ANTENNA_1](transmit#sl-rail-tx-option-antenna-1).
- Global [RAIL_TX_OPTION_ANTENNA1_SHIFT](transmit#rail-tx-option-antenna1-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_ANTENNA_1_SHIFT](transmit#sl-rail-tx-option-antenna-1-shift).
- Global [RAIL_TX_OPTION_CCA_ONLY](transmit#rail-tx-option-cca-only)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_CCA_ONLY](transmit#sl-rail-tx-option-cca-only).
- Global [RAIL_TX_OPTION_CCA_ONLY_SHIFT](transmit#rail-tx-option-cca-only-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_CCA_ONLY_SHIFT](transmit#sl-rail-tx-option-cca-only-shift).
- Global [RAIL_TX_OPTION_CCA_PEAK_RSSI](transmit#rail-tx-option-cca-peak-rssi)  
  This option define has been eliminated in RAIL 3.
- Global [RAIL_TX_OPTION_CCA_PEAK_RSSI_SHIFT](transmit#rail-tx-option-cca-peak-rssi-shift)  
  This option enum has been eliminated in RAIL 3.
- Global [RAIL_TX_OPTION_CONCURRENT_PHY_ID](transmit#rail-tx-option-concurrent-phy-id)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID](transmit#sl-rail-tx-option-concurrent-phy-id).
- Global [RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT](transmit#rail-tx-option-concurrent-phy-id-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT](transmit#sl-rail-tx-option-concurrent-phy-id-shift).
- Global [RAIL_TX_OPTION_REMOVE_CRC](transmit#rail-tx-option-remove-crc)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_REMOVE_CRC](transmit#sl-rail-tx-option-remove-crc).
- Global [RAIL_TX_OPTION_REMOVE_CRC_SHIFT](transmit#rail-tx-option-remove-crc-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_REMOVE_CRC_SHIFT](transmit#sl-rail-tx-option-remove-crc-shift).
- Global [RAIL_TX_OPTION_RESEND](transmit#rail-tx-option-resend)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_RESEND](transmit#sl-rail-tx-option-resend).
- Global [RAIL_TX_OPTION_RESEND_SHIFT](transmit#rail-tx-option-resend-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_RESEND_SHIFT](transmit#sl-rail-tx-option-resend-shift).
- Global [RAIL_TX_OPTION_SYNC_WORD_ID](transmit#rail-tx-option-sync-word-id)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_SYNC_WORD_ID](transmit#sl-rail-tx-option-sync-word-id).
- Global [RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT](transmit#rail-tx-option-sync-word-id-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT](transmit#sl-rail-tx-option-sync-word-id-shift).
- Global [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack).
- Global [RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT](transmit#rail-tx-option-wait-for-ack-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT](transmit#sl-rail-tx-option-wait-for-ack-shift).
- Global [RAIL_TX_OPTIONS_ALL](transmit#rail-tx-options-all)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTIONS_ALL](transmit#sl-rail-tx-options-all).
- Global [RAIL_TX_OPTIONS_COUNT](transmit#rail-tx-options-count)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTIONS_COUNT](transmit#sl-rail-tx-options-count).
- Global [RAIL_TX_OPTIONS_DEFAULT](transmit#rail-tx-options-default)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTIONS_DEFAULT](transmit#sl-rail-tx-options-default).
- Global [RAIL_TX_OPTIONS_NONE](transmit#rail-tx-options-none)  
  RAIL 2.x synonym of [SL_RAIL_TX_OPTIONS_NONE](transmit#sl-rail-tx-options-none).
- Global [RAIL_TX_PA_POWER_SETTING_UNSUPPORTED](pa#rail-tx-pa-power-setting-unsupported)  
  RAIL 2.x synonym for [SL_RAIL_TX_PA_POWER_SETTING_UNSUPPORTED](pa#sl-rail-tx-pa-power-setting-unsupported).
- Global [RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT](pa#rail-tx-power-curve-default-increment)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT](pa#sl-rail-tx-power-curve-default-increment).
- Global [RAIL_TX_POWER_CURVE_DEFAULT_MAX](pa#rail-tx-power-curve-default-max)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_CURVE_DEFAULT_MAX](pa#sl-rail-tx-power-curve-default-max).
- Global [RAIL_TX_POWER_DBM_SCALING_FACTOR](pa#rail-tx-power-dbm-scaling-factor)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_DBM_SCALING_FACTOR](pa#sl-rail-tx-power-dbm-scaling-factor).
- Global [RAIL_TX_POWER_LEVEL_2P4_HP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-hp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_HP_MAX.
- Global [RAIL_TX_POWER_LEVEL_2P4_HP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-hp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_HP_MIN.
- Global [RAIL_TX_POWER_LEVEL_2P4_LLP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-llp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_LLP_MAX.
- Global [RAIL_TX_POWER_LEVEL_2P4_LLP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-llp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_LLP_MIN.
- Global [RAIL_TX_POWER_LEVEL_2P4_LP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-lp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_LP_MAX.
- Global [RAIL_TX_POWER_LEVEL_2P4_LP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-lp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_LP_MIN.
- Global [RAIL_TX_POWER_LEVEL_2P4_MP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-mp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_MP_MAX.
- Global [RAIL_TX_POWER_LEVEL_2P4_MP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-mp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_2P4_GHZ_MP_MIN.
- Global [RAIL_TX_POWER_LEVEL_HP_MAX](pa-efr32-xg2-x#rail-tx-power-level-hp-max)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_HP_MIN](pa-efr32-xg2-x#rail-tx-power-level-hp-min)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid)  
  This RAIL 2.x define has been eliminated in RAIL 3, temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_INVALID.
- Global [RAIL_TX_POWER_LEVEL_LP_MAX](pa-efr32-xg2-x#rail-tx-power-level-lp-max)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_LP_MIN](pa-efr32-xg2-x#rail-tx-power-level-lp-min)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_MAX](pa#rail-tx-power-level-max)  
  This RAIL 2.x define has been eliminated in RAIL 3, temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_MAX.
- Global [RAIL_TX_POWER_LEVEL_MP_MAX](pa-efr32-xg2-x#rail-tx-power-level-mp-max)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_MP_MIN](pa-efr32-xg2-x#rail-tx-power-level-mp-min)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_HP_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-hp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_HP_MAX.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_HP_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-hp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_HP_MIN.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_LLP_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-llp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_LLP_MAX.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_LLP_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-llp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_LLP_MIN.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_LP_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-lp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_LP_MAX.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_LP_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-lp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_LP_MIN.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-max)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-min)  
  Backwards compatibility define.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_MP_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-mp-max)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_MP_MAX.
- Global [RAIL_TX_POWER_LEVEL_SUBGIG_MP_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-mp-min)  
  This RAIL 2.x define has been eliminated temporarily a synonym of SLI_RAIL_TX_POWER_LEVEL_SUB_GHZ_MP_MIN.
- Global [RAIL_TX_POWER_MAX](pa#rail-tx-power-max)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MAX](pa#sl-rail-tx-power-max).
- Global [RAIL_TX_POWER_MIN](pa#rail-tx-power-min)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MIN](pa#sl-rail-tx-power-min).
- Global [RAIL_TX_POWER_MODE_2P4_HIGHEST](pa#rail-tx-power-mode-2-p4-highest)  
  Please use [RAIL_TX_POWER_MODE_2P4GIG_HIGHEST](pa#rail-tx-power-mode-2-p4-gig-highest) instead.
- Global [RAIL_TX_POWER_MODE_2P4_HP](pa#rail-tx-power-mode-2-p4-hp)  
  Please use [RAIL_TX_POWER_MODE_2P4GIG_HP](pa#rail-tx-power-mode-2-p4-gig-hp) instead.
- Global [RAIL_TX_POWER_MODE_2P4_LP](pa#rail-tx-power-mode-2-p4-lp)  
  Please use [RAIL_TX_POWER_MODE_2P4GIG_LP](pa#rail-tx-power-mode-2-p4-gig-lp) instead.
- Global [RAIL_TX_POWER_MODE_2P4_MP](pa#rail-tx-power-mode-2-p4-mp)  
  Please use [RAIL_TX_POWER_MODE_2P4GIG_MP](pa#rail-tx-power-mode-2-p4-gig-mp) instead.
- Global [RAIL_TX_POWER_MODE_2P4GIG_HIGHEST](pa#rail-tx-power-mode-2-p4-gig-highest)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_2P4_GHZ_HIGHEST](pa#sl-rail-tx-power-mode-2-p4-ghz-highest).
- Global [RAIL_TX_POWER_MODE_2P4GIG_HP](pa#rail-tx-power-mode-2-p4-gig-hp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_2P4_GHZ_HP](pa#sl-rail-tx-power-mode-2-p4-ghz-hp).
- Global [RAIL_TX_POWER_MODE_2P4GIG_LLP](pa#rail-tx-power-mode-2-p4-gig-llp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_2P4_GHZ_LLP](pa#sl-rail-tx-power-mode-2-p4-ghz-llp).
- Global [RAIL_TX_POWER_MODE_2P4GIG_LP](pa#rail-tx-power-mode-2-p4-gig-lp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_2P4_GHZ_LP](pa#sl-rail-tx-power-mode-2-p4-ghz-lp).
- Global [RAIL_TX_POWER_MODE_2P4GIG_MP](pa#rail-tx-power-mode-2-p4-gig-mp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_2P4_GHZ_MP](pa#sl-rail-tx-power-mode-2-p4-ghz-mp).
- Global [RAIL_TX_POWER_MODE_NAMES](pa#rail-tx-power-mode-names)  
  This RAIL 2.x define has been replaced in RAIL 3 by [SL_RAIL_TX_POWER_MODE_NAMES](pa#sl-rail-tx-power-mode-names) with RAIL 3 power mode names.
- Global [RAIL_TX_POWER_MODE_NONE](pa#rail-tx-power-mode-none)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_NONE](pa#sl-rail-tx-power-mode-none).
- Global [RAIL_TX_POWER_MODE_OFDM_PA](pa#rail-tx-power-mode-ofdm-pa)  
  Please use [RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE](pa#rail-tx-power-mode-ofdm-pa-powersetting-table) instead.
- Global [RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE](pa#rail-tx-power-mode-ofdm-pa-powersetting-table)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE](pa#sl-rail-tx-power-mode-ofdm-pa-powersetting-table).
- Global [RAIL_TX_POWER_MODE_SUBGIG](pa#rail-tx-power-mode-subgig)  
  Please use [RAIL_TX_POWER_MODE_SUBGIG_HP](pa#rail-tx-power-mode-subgig-hp) instead.
- Global [RAIL_TX_POWER_MODE_SUBGIG_HIGHEST](pa#rail-tx-power-mode-subgig-highest)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_HIGHEST](pa#sl-rail-tx-power-mode-sub-ghz-highest).
- Global [RAIL_TX_POWER_MODE_SUBGIG_HP](pa#rail-tx-power-mode-subgig-hp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_HP](pa#sl-rail-tx-power-mode-sub-ghz-hp).
- Global [RAIL_TX_POWER_MODE_SUBGIG_LLP](pa#rail-tx-power-mode-subgig-llp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_LLP](pa#sl-rail-tx-power-mode-sub-ghz-llp).
- Global [RAIL_TX_POWER_MODE_SUBGIG_LP](pa#rail-tx-power-mode-subgig-lp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_LP](pa#sl-rail-tx-power-mode-sub-ghz-lp).
- Global [RAIL_TX_POWER_MODE_SUBGIG_MP](pa#rail-tx-power-mode-subgig-mp)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_MP](pa#sl-rail-tx-power-mode-sub-ghz-mp).
- Global [RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE](pa#rail-tx-power-mode-subgig-powersetting-table)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_MODE_SUB_GHZ_POWERSETTING_TABLE](pa#sl-rail-tx-power-mode-sub-ghz-powersetting-table).
- Global [RAIL_TX_POWER_VOLTAGE_SCALING_FACTOR](pa#rail-tx-power-voltage-scaling-factor)  
  RAIL 2.x synonym for [SL_RAIL_TX_POWER_VOLTAGE_SCALING_FACTOR](pa#sl-rail-tx-power-voltage-scaling-factor).
- Global [RAIL_TX_REPEAT_INFINITE_ITERATIONS](transmit#rail-tx-repeat-infinite-iterations)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_INFINITE_ITERATIONS](transmit#sl-rail-tx-repeat-infinite-iterations).
- Global [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop).
- Global [RAIL_TX_REPEAT_OPTION_HOP_SHIFT](transmit#rail-tx-repeat-option-hop-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTION_HOP_SHIFT](transmit#sl-rail-tx-repeat-option-hop-shift).
- Global [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#sl-rail-tx-repeat-option-start-to-start).
- Global [RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT](transmit#rail-tx-repeat-option-start-to-start-shift)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT](transmit#sl-rail-tx-repeat-option-start-to-start-shift).
- Global [RAIL_TX_REPEAT_OPTIONS_DEFAULT](transmit#rail-tx-repeat-options-default)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTIONS_DEFAULT](transmit#sl-rail-tx-repeat-options-default).
- Global [RAIL_TX_REPEAT_OPTIONS_NONE](transmit#rail-tx-repeat-options-none)  
  RAIL 2.x synonym of [SL_RAIL_TX_REPEAT_OPTIONS_NONE](transmit#sl-rail-tx-repeat-options-none).
- Global [RAIL_TX_STARTED_BYTES](events#rail-tx-started-bytes)  
  RAIL 2.x synonym of [SL_RAIL_TX_STARTED_BYTES](events#sl-rail-tx-started-bytes).
- Class [RAIL_TxChannelHoppingConfig_t](rail-tx-channel-hopping-config-t)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t](sl-rail-tx-channel-hopping-config-t).
- Global [RAIL_TxChannelHoppingConfig_t::buffer](rail-tx-channel-hopping-config-t#buffer)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::p_buffer](sl-rail-tx-channel-hopping-config-t#p-buffer).
- Global [RAIL_TxChannelHoppingConfig_t::bufferLength](rail-tx-channel-hopping-config-t#buffer-length)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::buffer_words](sl-rail-tx-channel-hopping-config-t#buffer-words).
- Global [RAIL_TxChannelHoppingConfig_t::entries](rail-tx-channel-hopping-config-t#entries)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::p_entries](sl-rail-tx-channel-hopping-config-t#p-entries).
- Global [RAIL_TxChannelHoppingConfig_t::numberOfChannels](rail-tx-channel-hopping-config-t#number-of-channels)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::number_of_channels](sl-rail-tx-channel-hopping-config-t#number-of-channels).
- Global [RAIL_TxChannelHoppingConfig_t::reserved](rail-tx-channel-hopping-config-t#reserved)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::reserved](sl-rail-tx-channel-hopping-config-t#reserved).
- Class [RAIL_TxChannelHoppingConfigEntry_t](rail-tx-channel-hopping-config-entry-t)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t](sl-rail-tx-channel-hopping-config-entry-t).
- Global [RAIL_TxChannelHoppingConfigEntry_t::channel](rail-tx-channel-hopping-config-entry-t#channel)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::channel](sl-rail-tx-channel-hopping-config-entry-t#channel).
- Global [RAIL_TxChannelHoppingConfigEntry_t::delay](rail-tx-channel-hopping-config-entry-t#delay)  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::delay_us](sl-rail-tx-channel-hopping-config-entry-t#delay-us).
- Global [RAIL_TxChannelHoppingConfigEntry_t::reserved](rail-tx-channel-hopping-config-entry-t#reserved)  [2]  
  RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::reserved](sl-rail-tx-channel-hopping-config-entry-t#reserved).
- Global [RAIL_TxDataSource_t](data-management#rail-tx-data-source-t)  
  RAIL 2.x synonym of [sl_rail_tx_data_source_t](data-management#sl-rail-tx-data-source-t).
- Class [RAIL_TxIrCalValues_t](rail-tx-ir-cal-values-t)  
  RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t](sl-rail-tx-ir-cal-values-t).
- Global [RAIL_TxIrCalValues_t::dcOffsetIQ](rail-tx-ir-cal-values-t#dc-offset-iq)  
  RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t::dc_offset_iq](sl-rail-tx-ir-cal-values-t#dc-offset-iq).
- Global [RAIL_TxIrCalValues_t::phiEpsilon](rail-tx-ir-cal-values-t#phi-epsilon)  
  RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t::phi_epsilon](sl-rail-tx-ir-cal-values-t#phi-epsilon).
- Global [RAIL_TxOptions_t](transmit#rail-tx-options-t)  
  RAIL 2.x synonym of [sl_rail_tx_options_t](transmit#sl-rail-tx-options-t).
- Class [RAIL_TxPacketDetails_t](rail-tx-packet-details-t)  
  RAIL 2.x synonym of [sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t).
- Global [RAIL_TxPacketDetails_t::isAck](rail-tx-packet-details-t#is-ack)  
  RAIL 2.x synonym of [sl_rail_tx_packet_details_t::is_ack](sl-rail-tx-packet-details-t#is-ack).
- Global [RAIL_TxPacketDetails_t::timeSent](rail-tx-packet-details-t#time-sent)  
  RAIL 2.x synonym of [sl_rail_tx_packet_details_t::time_sent](sl-rail-tx-packet-details-t#time-sent).
- Global [RAIL_TxPower_t](pa#rail-tx-power-t)  
  RAIL 2.x synonym for [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).
- Class [RAIL_TxPowerConfig_t](rail-tx-power-config-t)  
  RAIL 2.x synonym for [sl_rail_tx_power_config_t](sl-rail-tx-power-config-t).
- Global [RAIL_TxPowerConfig_t::mode](rail-tx-power-config-t#mode)  
  RAIL 2.x synonym for [sl_rail_tx_power_config_t::mode](sl-rail-tx-power-config-t#mode).
- Global [RAIL_TxPowerConfig_t::rampTime](rail-tx-power-config-t#ramp-time)  
  RAIL 2.x synonym for [sl_rail_tx_power_config_t::ramp_time_us](sl-rail-tx-power-config-t#ramp-time-us).
- Global [RAIL_TxPowerConfig_t::voltage](rail-tx-power-config-t#voltage)  
  RAIL 2.x synonym for [sl_rail_tx_power_config_t::voltage_mv](sl-rail-tx-power-config-t#voltage-mv).
- Class [RAIL_TxPowerCurveAlt_t](rail-tx-power-curve-alt-t)  
  This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. See [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t).
- Global [RAIL_TxPowerCurveAlt_t::maxPower](rail-tx-power-curve-alt-t#max-power)  
  This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::max_power_ddbm](sl-rail-pa-descriptor-t#max-power-ddbm).
- Global [RAIL_TxPowerCurveAlt_t::minPower](rail-tx-power-curve-alt-t#min-power)  
  This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::min_power_ddbm](sl-rail-pa-descriptor-t#min-power-ddbm).
- Global [RAIL_TxPowerCurveAlt_t::powerParams](rail-tx-power-curve-alt-t#power-params)  []  
  This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::p_power_setting_table](sl-rail-pa-descriptor-t#p-power-setting-table).
- Class [RAIL_TxPowerCurves_t](rail-tx-power-curves-t)  
  This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables.
- Global [RAIL_TxPowerCurves_t::maxPower](rail-tx-power-curves-t#max-power)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurves_t::minPower](rail-tx-power-curves-t#min-power)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurves_t::powerParams](rail-tx-power-curves-t#power-params)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Class [RAIL_TxPowerCurvesConfig_t](rail-tx-power-curves-config-t)  
  This RAIL 2.x enum has been eliminated in RAIL 3 which uses PA power tables instead.
- Global [RAIL_TxPowerCurvesConfig_t::piecewiseSegments](rail-tx-power-curves-config-t#piecewise-segments)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurvesConfig_t::txPower24HpCurves](rail-tx-power-curves-config-t#tx-power24-hp-curves)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurvesConfig_t::txPower24LpCurves](rail-tx-power-curves-config-t#tx-power24-lp-curves)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurvesConfig_t::txPowerSgCurves](rail-tx-power-curves-config-t#tx-power-sg-curves)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Class [RAIL_TxPowerCurvesConfigAlt](rail-tx-power-curves-config-alt)  
  This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_tx_power_table_config](sl-rail-tx-power-table-config) with different fields.
- Class [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t)  
  This RAIL 2.x type has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t) with different fields.
- Global [RAIL_TxPowerCurvesConfigAlt_t::curves](rail-tx-power-curves-config-alt-t#curves)  [RAIL_NUM_PA]  
  This RAIL 2.x field has been replaced in RAIL 3 by other [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t) fields.
- Global [RAIL_TxPowerCurvesConfigAlt_t::paVoltage](rail-tx-power-curves-config-alt-t#pa-voltage)  
  This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t::pa_voltage_mv](sl-rail-tx-power-table-config-t#pa-voltage-mv) .
- Global [RAIL_TxPowerCurvesConfigAlt_t::signature](rail-tx-power-curves-config-alt-t#signature)  
  This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t::signature](sl-rail-tx-power-table-config-t#signature).
- Global [RAIL_TxPowerCurvesDcdc](pa-curve-conversions#rail-tx-power-curves-dcdc)  
  This RAIL 2.x variable has been eliminated in RAIL 3. See RAIL 3 discussion in [RAIL 2.x PA Power Conversion Utility](rail-util-pa).
- Class [RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t)  
  This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables.
- Global [RAIL_TxPowerCurveSegment_t::intercept](rail-tx-power-curve-segment-t#intercept)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurveSegment_t::maxPowerLevel](rail-tx-power-curve-segment-t#max-power-level)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurveSegment_t::slope](rail-tx-power-curve-segment-t#slope)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_TxPowerCurvesVbat](pa-curve-conversions#rail-tx-power-curves-vbat)  
  This RAIL 2.x variable has been eliminated in RAIL 3. See RAIL 3 discussion in [RAIL 2.x PA Power Conversion Utility](rail-util-pa).
- Global [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t)  
  This RAIL 2.x tpye has been eliminated in RAIL 3, temporarily a synonym of sli_rail_tx_power_level_t.
- Global [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)  
  RAIL 2.x synonym for [sl_rail_tx_power_mode_t](pa#sl-rail-tx-power-mode-t).
- Class [RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t)  
  This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t) with fewer fields.
- Global [RAIL_TxPowerSettingEntry_t::currentPaPowerDdbm](rail-tx-power-setting-entry-t#current-pa-power-ddbm)  
  This RAIL 2.x field is equivalent to RAIL 3 [sl_rail_tx_power_setting_entry_t::curr_pa_power_ddbm](sl-rail-tx-power-setting-entry-t#curr-pa-power-ddbm).
- Global [RAIL_TxPowerSettingEntry_t::maxPaPowerDdbm](rail-tx-power-setting-entry-t#max-pa-power-ddbm)  
  This RAIL 2.x field has been eliminated in RAIL 3 [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t).
- Global [RAIL_TxPowerSettingEntry_t::minPaPowerDdbm](rail-tx-power-setting-entry-t#min-pa-power-ddbm)  
  This RAIL 2.x field has been eliminated in RAIL 3 [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t).
- Global [RAIL_TxPowerSettingEntry_t::paPowerSetting](rail-tx-power-setting-entry-t#pa-power-setting)  
  This RAIL 2.x field is eqivalent to RAIL 3 [sl_rail_tx_power_setting_entry_t::pa_power_setting](sl-rail-tx-power-setting-entry-t#pa-power-setting).
- Class [RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t](sl-rail-tx-repeat-config-t).
- Global [RAIL_TxRepeatConfig_t::channelHopping](rail-tx-repeat-config-t#channel-hopping)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::channel_hopping](sl-rail-tx-repeat-config-t#channel-hopping).
- Global [RAIL_TxRepeatConfig_t::delay](rail-tx-repeat-config-t#delay)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::delay_us](sl-rail-tx-repeat-config-t#delay-us).
- Global [RAIL_TxRepeatConfig_t::delayOrHop](rail-tx-repeat-config-t#delay-or-hop)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::delay_or_hop](sl-rail-tx-repeat-config-t#delay-or-hop).
- Global [RAIL_TxRepeatConfig_t::iterations](rail-tx-repeat-config-t#iterations)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::iterations](sl-rail-tx-repeat-config-t#iterations).
- Global [RAIL_TxRepeatConfig_t::repeatOptions](rail-tx-repeat-config-t#repeat-options)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::repeat_options](sl-rail-tx-repeat-config-t#repeat-options).
- Global [RAIL_TxRepeatOptions_t](transmit#rail-tx-repeat-options-t)  
  RAIL 2.x synonym of [sl_rail_tx_repeat_options_t](transmit#sl-rail-tx-repeat-options-t).
- Global [RAIL_TZ_ChangedDcdcCallbackPtr_t](trust-zone#rail-tz-changed-dcdc-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_changed_dcdc_callback_t()](trust-zone#sl-rail-tz-changed-dcdc-callback-t).
- Global [RAIL_TZ_CheckPeripheralsSecureStates](trust-zone#rail-tz-check-peripherals-secure-states)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_check_peripherals_secure_states()](trust-zone#sl-rail-tz-check-peripherals-secure-states).
- Class [RAIL_TZ_Config_t](rail-tz-config-t)  
  RAIL 2.x synonym of [sl_rail_tz_config_t](sl-rail-tz-config-t).
- Global [RAIL_TZ_Config_t::changedDcdcCallback](rail-tz-config-t#changed-dcdc-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::changed_dcdc_callback](sl-rail-tz-config-t#changed-dcdc-callback).
- Global [RAIL_TZ_Config_t::configAntennaGpioCallback](rail-tz-config-t#config-antenna-gpio-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::config_antenna_gpio_callback](sl-rail-tz-config-t#config-antenna-gpio-callback).
- Global [RAIL_TZ_Config_t::configureHfxoCallback](rail-tz-config-t#configure-hfxo-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::configure_hfxo_callback](sl-rail-tz-config-t#configure-hfxo-callback).
- Global [RAIL_TZ_Config_t::disableSecureRadioIrqsCallback](rail-tz-config-t#disable-secure-radio-irqs-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::disable_secure_radio_irqs_callback](sl-rail-tz-config-t#disable-secure-radio-irqs-callback).
- Global [RAIL_TZ_Config_t::enableSecureRadioIrqsCallback](rail-tz-config-t#enable-secure-radio-irqs-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::enable_secure_radio_irqs_callback](sl-rail-tz-config-t#enable-secure-radio-irqs-callback).
- Global [RAIL_TZ_Config_t::getRadioClockFreqHzCallback](rail-tz-config-t#get-radio-clock-freq-hz-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::get_radio_clock_freq_hz_callback](sl-rail-tz-config-t#get-radio-clock-freq-hz-callback).
- Global [RAIL_TZ_Config_t::isCmuSecure](rail-tz-config-t#is-cmu-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_cmu_secure](sl-rail-tz-config-t#is-cmu-secure).
- Global [RAIL_TZ_Config_t::isEmuSecure](rail-tz-config-t#is-emu-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_emu_secure](sl-rail-tz-config-t#is-emu-secure).
- Global [RAIL_TZ_Config_t::isGpioSecure](rail-tz-config-t#is-gpio-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_gpio_secure](sl-rail-tz-config-t#is-gpio-secure).
- Global [RAIL_TZ_Config_t::isHfxoSecure](rail-tz-config-t#is-hfxo-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_hfxo_secure](sl-rail-tz-config-t#is-hfxo-secure).
- Global [RAIL_TZ_Config_t::isLdmaSecure](rail-tz-config-t#is-ldma-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_ldma_secure](sl-rail-tz-config-t#is-ldma-secure).
- Global [RAIL_TZ_Config_t::isPrsSecure](rail-tz-config-t#is-prs-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_prs_secure](sl-rail-tz-config-t#is-prs-secure).
- Global [RAIL_TZ_Config_t::isSysrtcSecure](rail-tz-config-t#is-sysrtc-secure)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::is_sysrtc_secure](sl-rail-tz-config-t#is-sysrtc-secure).
- Global [RAIL_TZ_Config_t::radioClockEnableCallback](rail-tz-config-t#radio-clock-enable-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::radio_clock_enable_callback](sl-rail-tz-config-t#radio-clock-enable-callback).
- Global [RAIL_TZ_Config_t::radioPerformM2mLdmaCallback](rail-tz-config-t#radio-perform-m2m-ldma-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::radio_perform_m2m_ldma_callback](sl-rail-tz-config-t#radio-perform-m2m-ldma-callback).
- Global [RAIL_TZ_Config_t::readInternalTemperatureCallback](rail-tz-config-t#read-internal-temperature-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::read_internal_temperature_callback](sl-rail-tz-config-t#read-internal-temperature-callback).
- Global [RAIL_TZ_Config_t::rfecaClockEnableCallback](rail-tz-config-t#rfeca-clock-enable-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::rfeca_clock_enable_callback](sl-rail-tz-config-t#rfeca-clock-enable-callback).
- Global [RAIL_TZ_Config_t::rfecaIsClockEnabledCallback](rail-tz-config-t#rfeca-is-clock-enabled-callback)  
  RAIL 2.x synonym of [sl_rail_tz_config_t::rfeca_is_clock_enabled_callback](sl-rail-tz-config-t#rfeca-is-clock-enabled-callback).
- Global [RAIL_TZ_ConfigAntennaGpio](trust-zone#rail-tz-config-antenna-gpio)  (const [RAIL_AntennaConfig_t](rail-antenna-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_tz_config_antenna_gpio()](trust-zone#sl-rail-tz-config-antenna-gpio).
- Global [RAIL_TZ_ConfigAntennaGpioCallbackPtr_t](trust-zone#rail-tz-config-antenna-gpio-callback-ptr-t)  )(const [RAIL_AntennaConfig_t](rail-antenna-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_tz_config_antenna_gpio_callback_t()](trust-zone#sl-rail-tz-config-antenna-gpio-callback-t).
- Global [RAIL_TZ_ConfigureHfxo](trust-zone#rail-tz-configure-hfxo)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_configure_hfxo()](trust-zone#sl-rail-tz-configure-hfxo).
- Global [RAIL_TZ_ConfigureHfxoCallbackPtr_t](trust-zone#rail-tz-configure-hfxo-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_configure_hfxo_callback_t()](trust-zone#sl-rail-tz-configure-hfxo-callback-t).
- Global [RAIL_TZ_DisableSecureRadioIrqs](trust-zone#rail-tz-disable-secure-radio-irqs)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_disable_secure_radio_irqs()](trust-zone#sl-rail-tz-disable-secure-radio-irqs).
- Global [RAIL_TZ_DisableSecureRadioIrqsCallbackPtr_t](trust-zone#rail-tz-disable-secure-radio-irqs-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_disable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-disable-secure-radio-irqs-callback-t).
- Global [RAIL_TZ_EnableSecureRadioIrqs](trust-zone#rail-tz-enable-secure-radio-irqs)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_enable_secure_radio_irqs()](trust-zone#sl-rail-tz-enable-secure-radio-irqs).
- Global [RAIL_TZ_EnableSecureRadioIrqsCallbackPtr_t](trust-zone#rail-tz-enable-secure-radio-irqs-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_enable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-enable-secure-radio-irqs-callback-t).
- Global [RAIL_TZ_GetRadioClockFreqHzCallbackPtr_t](trust-zone#rail-tz-get-radio-clock-freq-hz-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_get_radio_clock_freq_hz_callback_t()](trust-zone#sl-rail-tz-get-radio-clock-freq-hz-callback-t).
- Global [RAIL_TZ_InitNonSecure](trust-zone#rail-tz-init-non-secure)  (const [RAIL_TZ_Config_t](rail-tz-config-t) *pTzConfig)  
  RAIL 2.x synonym of [sl_rail_tz_init_non_secure()](trust-zone#sl-rail-tz-init-non-secure).
- Global [RAIL_TZ_InitSecure](trust-zone#rail-tz-init-secure)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_init_secure()](trust-zone#sl-rail-tz-init-secure).
- Global [RAIL_TZ_RadioClockEnable](trust-zone#rail-tz-radio-clock-enable)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_radio_clock_enable()](trust-zone#sl-rail-tz-radio-clock-enable).
- Global [RAIL_TZ_RadioClockEnableCallbackPtr_t](trust-zone#rail-tz-radio-clock-enable-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_radio_clock_enable_callback_t()](trust-zone#sl-rail-tz-radio-clock-enable-callback-t).
- Global [RAIL_TZ_RadioPerformM2mLdma](trust-zone#rail-tz-radio-perform-m2m-ldma)  (uint32_t *pDest, const uint32_t *pSrc, uint32_t numWords)  
  RAIL 2.x synonym of [sl_rail_tz_radio_perform_m2m_ldma()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma).
- Global [RAIL_TZ_RadioPerformM2mLdmaCallbackPtr_t](trust-zone#rail-tz-radio-perform-m2m-ldma-callback-ptr-t)  )(uint32_t *pDest, const uint32_t *pSrc, uint32_t numWords)  
  RAIL 2.x synonym of [sl_rail_tz_radio_perform_m2m_ldma_callback_t()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma-callback-t).
- Global [RAIL_TZ_ReadInternalTemperature](trust-zone#rail-tz-read-internal-temperature)  (uint16_t *internalTemperatureKelvin, bool enableTemperatureInterrupts)  
  RAIL 2.x synonym of [sl_rail_tz_read_internal_temperature()](trust-zone#sl-rail-tz-read-internal-temperature).
- Global [RAIL_TZ_ReadInternalTemperatureCallbackPtr_t](trust-zone#rail-tz-read-internal-temperature-callback-ptr-t)  )(uint16_t *internalTemperatureKelvin, bool enableTemperatureInterrupts)  
  RAIL 2.x synonym of [sl_rail_tz_read_internal_temperature_callback_t()](trust-zone#sl-rail-tz-read-internal-temperature-callback-t).
- Global [RAIL_TZ_RfecaClockEnable](trust-zone#rail-tz-rfeca-clock-enable)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_rfeca_clock_enable()](trust-zone#sl-rail-tz-rfeca-clock-enable).
- Global [RAIL_TZ_RfecaClockEnableCallbackPtr_t](trust-zone#rail-tz-rfeca-clock-enable-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_rfeca_clock_enable_callback_t()](trust-zone#sl-rail-tz-rfeca-clock-enable-callback-t).
- Global [RAIL_TZ_RfecaIsClockEnabled](trust-zone#rail-tz-rfeca-is-clock-enabled)  (void)  
  RAIL 2.x synonym of [sl_rail_tz_rfeca_is_clock_enabled()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled).
- Global [RAIL_TZ_RfecaIsClockEnabledCallbackPtr_t](trust-zone#rail-tz-rfeca-is-clock-enabled-callback-ptr-t)  )(void)  
  RAIL 2.x synonym of [sl_rail_tz_rfeca_is_clock_enabled_callback_t()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled-callback-t).
- Global [RAIL_UseDma](general#rail-use-dma)  (uint8_t channel)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_use_dma()](general#sl-rail-use-dma) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter.
- Global [RAIL_UseTxFifoForAutoAck](auto-ack#rail-use-tx-fifo-for-auto-ack)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_use_tx_fifo_for_auto_ack()](auto-ack#sl-rail-use-tx-fifo-for-auto-ack).
- Global [RAIL_VDET_MODE_AUTOMATIC](vdet#rail-vdet-mode-automatic)  
  RAIL 2.x synonym of [SL_RAIL_VDET_MODE_AUTOMATIC](vdet#sl-rail-vdet-mode-automatic).
- Global [RAIL_VDET_MODE_COUNT](vdet#rail-vdet-mode-count)  
  RAIL 2.x synonym of [SL_RAIL_VDET_MODE_COUNT](vdet#sl-rail-vdet-mode-count).
- Global [RAIL_VDET_MODE_DISABLED](vdet#rail-vdet-mode-disabled)  
  RAIL 2.x synonym of [SL_RAIL_VDET_MODE_DISABLED](vdet#sl-rail-vdet-mode-disabled).
- Global [RAIL_VDET_MODE_ENUM_NAMES](vdet#rail-vdet-mode-enum-names)  
  RAIL 2.x synonym of [SL_RAIL_VDET_MODE_ENUM_NAMES](vdet#sl-rail-vdet-mode-enum-names).
- Global [RAIL_VDET_MODE_IMMEDIATE](vdet#rail-vdet-mode-immediate)  
  RAIL 2.x synonym of [SL_RAIL_VDET_MODE_IMMEDIATE](vdet#sl-rail-vdet-mode-immediate).
- Global [RAIL_Vdet_Mode_t](vdet#rail-vdet-mode-t)  
  RAIL 2.x synonym of [sl_rail_vdet_mode_t](vdet#sl-rail-vdet-mode-t).
- Global [RAIL_VDET_RESOLUTION_10_BIT](vdet#rail-vdet-resolution-10-bit)  
  RAIL 2.x synonym of [SL_RAIL_VDET_RESOLUTION_10_BIT](vdet#sl-rail-vdet-resolution-10-bit).
- Global [RAIL_VDET_RESOLUTION_11_BIT](vdet#rail-vdet-resolution-11-bit)  
  RAIL 2.x synonym of [SL_RAIL_VDET_RESOLUTION_11_BIT](vdet#sl-rail-vdet-resolution-11-bit).
- Global [RAIL_VDET_RESOLUTION_12_BIT](vdet#rail-vdet-resolution-12-bit)  
  RAIL 2.x synonym of [SL_RAIL_VDET_RESOLUTION_12_BIT](vdet#sl-rail-vdet-resolution-12-bit).
- Global [RAIL_VDET_RESOLUTION_COUNT](vdet#rail-vdet-resolution-count)  
  RAIL 2.x synonym of [SL_RAIL_VDET_RESOLUTION_COUNT](vdet#sl-rail-vdet-resolution-count).
- Global [RAIL_VDET_RESOLUTION_ENUM_NAMES](vdet#rail-vdet-resolution-enum-names)  
  RAIL 2.x synonym of [SL_RAIL_VDET_RESOLUTION_ENUM_NAMES](vdet#sl-rail-vdet-resolution-enum-names).
- Global [RAIL_Vdet_Resolution_t](vdet#rail-vdet-resolution-t)  
  RAIL 2.x synonym of [sl_rail_vdet_resolution_t](vdet#sl-rail-vdet-resolution-t).
- Global [RAIL_VDET_STATUS_10_BIT_DONE](vdet#rail-vdet-status-10-bit-done)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_10_BIT_DONE](vdet#sl-rail-vdet-status-10-bit-done).
- Global [RAIL_VDET_STATUS_11_BIT_DONE](vdet#rail-vdet-status-11-bit-done)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_11_BIT_DONE](vdet#sl-rail-vdet-status-11-bit-done).
- Global [RAIL_VDET_STATUS_12_BIT_DONE](vdet#rail-vdet-status-12-bit-done)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_12_BIT_DONE](vdet#sl-rail-vdet-status-12-bit-done).
- Global [RAIL_VDET_STATUS_BLOCKED](vdet#rail-vdet-status-blocked)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_BLOCKED](vdet#sl-rail-vdet-status-blocked).
- Global [RAIL_VDET_STATUS_COUNT](vdet#rail-vdet-status-count)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_COUNT](vdet#sl-rail-vdet-status-count).
- Global [RAIL_VDET_STATUS_ENUM_NAMES](vdet#rail-vdet-status-enum-names)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_ENUM_NAMES](vdet#sl-rail-vdet-status-enum-names).
- Global [RAIL_VDET_STATUS_ERROR](vdet#rail-vdet-status-error)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_ERROR](vdet#sl-rail-vdet-status-error).
- Global [RAIL_VDET_STATUS_IDLE](vdet#rail-vdet-status-idle)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_IDLE](vdet#sl-rail-vdet-status-idle).
- Global [RAIL_VDET_STATUS_START](vdet#rail-vdet-status-start)  
  RAIL 2.x synonym of [SL_RAIL_VDET_STATUS_START](vdet#sl-rail-vdet-status-start).
- Global [RAIL_Vdet_Status_t](vdet#rail-vdet-status-t)  
  RAIL 2.x synonym of [sl_rail_vdet_status_t](vdet#sl-rail-vdet-status-t).
- Class [RAIL_VdetConfig_t](rail-vdet-config-t)  
  RAIL 2.x synonym of [sl_rail_vdet_config_t](sl-rail-vdet-config-t).
- Global [RAIL_VdetConfig_t::delayUs](rail-vdet-config-t#delay-us)  
  RAIL 2.x synonym of [sl_rail_vdet_config_t::delay_us](sl-rail-vdet-config-t#delay-us).
- Global [RAIL_VdetConfig_t::mode](rail-vdet-config-t#mode)  
  RAIL 2.x synonym of [sl_rail_vdet_config_t::mode](sl-rail-vdet-config-t#mode).
- Global [RAIL_VdetConfig_t::resolution](rail-vdet-config-t#resolution)  
  RAIL 2.x synonym of [sl_rail_vdet_config_t::resolution](sl-rail-vdet-config-t#resolution).
- Global [RAIL_Verify](diagnostic#rail-verify)  ([RAIL_VerifyConfig_t](rail-verify-config-t) *configVerify, uint32_t durationUs, bool restart)  
  This RAIL 2.x function has been eliminated in RAIL 3. This functionality is no longer supported.
- Global [RAIL_VERIFY_DURATION_MAX](diagnostic#rail-verify-duration-max)  
  This RAIL 2.x define has been eliminated in RAIL 3.
- Global [RAIL_VerifyCallbackPtr_t](diagnostic#rail-verify-callback-ptr-t)  )(uint32_t address, uint32_t expectedValue, uint32_t actualValue)  
  This RAIL 2.x type has been eliminated in RAIL 3. This functionality is no longer supported.
- Class [RAIL_VerifyConfig_t](rail-verify-config-t)  
  This RAIL 2.x type has been eliminated in RAIL 3.
- Global [RAIL_VerifyConfig_t::cb](rail-verify-config-t#cb)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_VerifyConfig_t::correspondingHandle](rail-verify-config-t#corresponding-handle)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_VerifyConfig_t::nextIndexToVerify](rail-verify-config-t#next-index-to-verify)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_VerifyConfig_t::override](rail-verify-config-t#override)  
  This RAIL 2.x field has been eliminated in RAIL 3.
- Global [RAIL_VerifyTxPowerCurves](pa#rail-verify-tx-power-curves)  (const struct [RAIL_TxPowerCurvesConfigAlt](rail-tx-power-curves-config-alt) *config)  
  RAIL 2.x synonym of [sl_rail_verify_tx_power_conversion()](pa#sl-rail-verify-tx-power-conversion).
- Class [RAIL_Version_t](rail-version-t)  
  RAIL 2.x synonym of [sl_rail_version_t](sl-rail-version-t).
- Global [RAIL_Version_t::build](rail-version-t#build)  
  RAIL 2.x synonym of [sl_rail_version_t::build](sl-rail-version-t#build).
- Global [RAIL_Version_t::flags](rail-version-t#flags)  
  RAIL 2.x synonym of [sl_rail_version_t::flags](sl-rail-version-t#flags).
- Global [RAIL_Version_t::hash](rail-version-t#hash)  
  RAIL 2.x synonym of [sl_rail_version_t::hash](sl-rail-version-t#hash).
- Global [RAIL_Version_t::major](rail-version-t#major)  
  RAIL 2.x synonym of [sl_rail_version_t::major](sl-rail-version-t#major).
- Global [RAIL_Version_t::minor](rail-version-t#minor)  
  RAIL 2.x synonym of [sl_rail_version_t::minor](sl-rail-version-t#minor).
- Global [RAIL_Version_t::multiprotocol](rail-version-t#multiprotocol)  
  RAIL 2.x synonym of [sl_rail_version_t::multiprotocol](sl-rail-version-t#multiprotocol).
- Global [RAIL_Version_t::rev](rail-version-t#rev)  
  RAIL 2.x synonym of [sl_rail_version_t::rev](sl-rail-version-t#rev).
- Global [RAIL_Wake](sleep#rail-wake)  (RAIL_Time_t elapsedTime)  
  RAIL 2.x synonym of [sl_rail_wake()](sleep#sl-rail-wake).
- Global [RAIL_WMBUS_Config](wmbus#rail-wmbus-config)  (RAIL_Handle_t railHandle, bool enableSimultaneousTCRx)  
  RAIL 2.x synonym of [sl_rail_wmbus_config()](wmbus#sl-rail-wmbus-config).
- Global [RAIL_WMBUS_ModeCFrameA](wmbus#rail-wmbus-mode-c-frame-a)  
  RAIL 2.x synonym of [SL_RAIL_WMBUS_MODE_C_FRAME_A](wmbus#sl-rail-wmbus-mode-c-frame-a).
- Global [RAIL_WMBUS_ModeCFrameB](wmbus#rail-wmbus-mode-c-frame-b)  
  RAIL 2.x synonym of [SL_RAIL_WMBUS_MODE_C_FRAME_B](wmbus#sl-rail-wmbus-mode-c-frame-b).
- Global [RAIL_WMBUS_ModeTFrameA](wmbus#rail-wmbus-mode-t-frame-a)  
  RAIL 2.x synonym of [SL_RAIL_WMBUS_MODE_T_FRAME_A](wmbus#sl-rail-wmbus-mode-t-frame-a).
- Global [RAIL_WMBUS_Phy_t](wmbus#rail-wmbus-phy-t)  
  RAIL 2.x synonym of [sl_rail_wmbus_phy_t](wmbus#sl-rail-wmbus-phy-t).
- Global [RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#rail-wmbus-supports-simultaneous-t-c-rx)  
  RAIL 2.x synonym of [SL_RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#sl-rail-wmbus-supports-simultaneous-t-c-rx-1).
- Global [RAIL_WMBUS_SupportsSimultaneousTCRx](features#rail-wmbus-supports-simultaneous-tc-rx)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_wmbus_supports_simultaneous_t_c_rx()](features#sl-rail-wmbus-supports-simultaneous-t-c-rx).
- Global [RAIL_WriteAutoAckFifo](auto-ack#rail-write-auto-ack-fifo)  (RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)  
  RAIL 2.x synonym of [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo).
- Global [RAIL_WriteTxFifo](data-management#rail-write-tx-fifo)  (RAIL_Handle_t railHandle, const uint8_t *dataPtr, uint16_t writeLength, bool reset)  
  RAIL 2.x synonym of [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo).
- Global [RAIL_YieldRadio](multiprotocol#rail-yield-radio)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio).
- Global [RAIL_ZWAVE_BAUD_100K](z-wave#rail-zwave-baud-100-k)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_BAUD_100_K](z-wave#sl-rail-zwave-baud-100-k).
- Global [RAIL_ZWAVE_BAUD_40K](z-wave#rail-zwave-baud-40-k)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_BAUD_40_K](z-wave#sl-rail-zwave-baud-40-k).
- Global [RAIL_ZWAVE_BAUD_9600](z-wave#rail-zwave-baud-9600)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_BAUD_9600](z-wave#sl-rail-zwave-baud-9600).
- Global [RAIL_ZWAVE_BAUD_INVALID](z-wave#rail-zwave-baud-invalid)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_BAUD_INVALID](z-wave#sl-rail-zwave-baud-invalid).
- Global [RAIL_ZWAVE_Baud_t](z-wave#rail-zwave-baud-t)  
  RAIL 2.x synonym of [sl_rail_zwave_baud_t](z-wave#sl-rail-zwave-baud-t).
- Class [RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t)  
  RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t).
- Global [RAIL_ZWAVE_BeamRxConfig_t::channelHoppingConfig](rail-zwave-beam-rx-config-t#channel-hopping-config)  
  RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::channel_hopping_config](sl-rail-zwave-beam-rx-config-t#channel-hopping-config).
- Global [RAIL_ZWAVE_BeamRxConfig_t::receiveConfig_100](rail-zwave-beam-rx-config-t#receive-config-100)  
  RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::receive_config_100_kbps](sl-rail-zwave-beam-rx-config-t#receive-config-100-kbps).
- Global [RAIL_ZWAVE_BeamRxConfig_t::receiveConfig_40](rail-zwave-beam-rx-config-t#receive-config-40)  
  RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::receive_config_40_kbps](sl-rail-zwave-beam-rx-config-t#receive-config-40-kbps).
- Class [RAIL_ZWAVE_Config_t](rail-zwave-config-t)  
  RAIL 2.x synonym of [sl_rail_zwave_config_t](sl-rail-zwave-config-t).
- Global [RAIL_ZWAVE_Config_t::ackConfig](rail-zwave-config-t#ack-config)  
  RAIL 2.x synonym of [sl_rail_zwave_config_t::ack_config](sl-rail-zwave-config-t#ack-config).
- Global [RAIL_ZWAVE_Config_t::options](rail-zwave-config-t#options)  
  RAIL 2.x synonym of [sl_rail_zwave_config_t::options](sl-rail-zwave-config-t#options).
- Global [RAIL_ZWAVE_Config_t::timings](rail-zwave-config-t#timings)  
  RAIL 2.x synonym of [sl_rail_zwave_config_t::timings](sl-rail-zwave-config-t#timings).
- Global [RAIL_ZWAVE_ConfigBeamRx](z-wave#rail-zwave-config-beam-rx)  (RAIL_Handle_t railHandle, const [RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_zwave_config_beam_rx()](z-wave#sl-rail-zwave-config-beam-rx).
- Global [RAIL_ZWAVE_ConfigOptions](z-wave#rail-zwave-config-options)  (RAIL_Handle_t railHandle, RAIL_ZWAVE_Options_t mask, RAIL_ZWAVE_Options_t options)  
  RAIL 2.x synonym of [sl_rail_zwave_config_options()](z-wave#sl-rail-zwave-config-options).
- Global [RAIL_ZWAVE_ConfigRegion](z-wave#rail-zwave-config-region)  (RAIL_Handle_t railHandle, const [RAIL_ZWAVE_RegionConfig_t](rail-zwave-region-config-t) *regionCfg)  
  RAIL 2.x synonym of [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region).
- Global [RAIL_ZWAVE_ConfigRxChannelHopping](z-wave#rail-zwave-config-rx-channel-hopping)  (RAIL_Handle_t railHandle, [RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_zwave_config_rx_channel_hopping()](z-wave#sl-rail-zwave-config-rx-channel-hopping).
- Global [RAIL_ZWAVE_Deinit](z-wave#rail-zwave-deinit)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_deinit()](z-wave#sl-rail-zwave-deinit).
- Global [RAIL_ZWAVE_ENERGY_DETECT](z-wave#rail-zwave-energy-detect)  
  This RAIL 2.x baud rate has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_ZWAVE_FREQ_INVALID](z-wave#rail-zwave-freq-invalid)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_FREQ_INVALID](z-wave#sl-rail-zwave-freq-invalid).
- Global [RAIL_ZWAVE_GetBeamChannelIndex](z-wave#rail-zwave-get-beam-channel-index)  (RAIL_Handle_t railHandle, uint8_t *pChannelIndex)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::channel_index](sl-rail-zwave-beam-details-t#channel-index).
- Global [RAIL_ZWAVE_GetBeamHomeIdHash](z-wave#rail-zwave-get-beam-home-id-hash)  (RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeIdHash_t *pBeamHomeIdHash)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::home_id_hash](sl-rail-zwave-beam-details-t#home-id-hash).
- Global [RAIL_ZWAVE_GetBeamNodeId](z-wave#rail-zwave-get-beam-node-id)  (RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t *pNodeId)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::node_id](sl-rail-zwave-beam-details-t#node-id).
- Global [RAIL_ZWAVE_GetBeamRssi](z-wave#rail-zwave-get-beam-rssi)  (RAIL_Handle_t railHandle, int8_t *pBeamRssi)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::rssi_dbm](sl-rail-zwave-beam-details-t#rssi-dbm).
- Global [RAIL_ZWAVE_GetLrBeamTxPower](z-wave#rail-zwave-get-lr-beam-tx-power)  (RAIL_Handle_t railHandle, uint8_t *pLrBeamTxPower)  
  This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::lr_tx_power](sl-rail-zwave-beam-details-t#lr-tx-power).
- Global [RAIL_ZWAVE_GetRegion](z-wave#rail-zwave-get-region)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_get_region()](z-wave#sl-rail-zwave-get-region).
- Global [RAIL_ZWAVE_GetRxBeamConfig](z-wave#rail-zwave-get-rx-beam-config)  ([RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t) *pConfig)  
  RAIL 2.x synonym of [sl_rail_zwave_get_rx_beam_config()](z-wave#sl-rail-zwave-get-rx-beam-config).
- Global [RAIL_ZWAVE_GetTxLowPower](z-wave#rail-zwave-get-tx-low-power)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated.
- Global [RAIL_ZWAVE_GetTxLowPowerDbm](z-wave#rail-zwave-get-tx-low-power-dbm)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_get_tx_low_power_dbm()](z-wave#sl-rail-zwave-get-tx-low-power-dbm).
- Global [RAIL_ZWAVE_HOME_ID_DEFAULT](z-wave#rail-zwave-home-id-default)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_DEFAULT](z-wave#sl-rail-zwave-home-id-default).
- Global [RAIL_ZWAVE_HOME_ID_HASH_DEFAULT](z-wave#rail-zwave-home-id-hash-default)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_HASH_DEFAULT](z-wave#sl-rail-zwave-home-id-hash-default).
- Global [RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#rail-zwave-home-id-hash-dont-care)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#sl-rail-zwave-home-id-hash-dont-care).
- Global [RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1](z-wave#rail-zwave-home-id-hash-illegal-1)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_0](z-wave#sl-rail-zwave-home-id-hash-illegal-0).
- Global [RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2](z-wave#rail-zwave-home-id-hash-illegal-2)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1](z-wave#sl-rail-zwave-home-id-hash-illegal-1).
- Global [RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3](z-wave#rail-zwave-home-id-hash-illegal-3)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2](z-wave#sl-rail-zwave-home-id-hash-illegal-2).
- Global [RAIL_ZWAVE_HOME_ID_UNKNOWN](z-wave#rail-zwave-home-id-unknown)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_HOME_ID_UNKNOWN](z-wave#sl-rail-zwave-home-id-unknown).
- Global [RAIL_ZWAVE_HomeId_t](z-wave#rail-zwave-home-id-t)  
  RAIL 2.x synonym of [sl_rail_zwave_home_id_t](z-wave#sl-rail-zwave-home-id-t).
- Global [RAIL_ZWAVE_HomeIdHash_t](z-wave#rail-zwave-home-id-hash-t)  
  RAIL 2.x synonym of [sl_rail_zwave_home_id_hash_t](z-wave#sl-rail-zwave-home-id-hash-t).
- Global [RAIL_ZWAVE_Init](z-wave#rail-zwave-init)  (RAIL_Handle_t railHandle, const [RAIL_ZWAVE_Config_t](rail-zwave-config-t) *config)  
  RAIL 2.x synonym of [sl_rail_zwave_init()](z-wave#sl-rail-zwave-init).
- Class [RAIL_ZWAVE_IrcalVal_t](rail-zwave-ircal-val-t)  
  RAIL 2.x synonym of [sl_rail_zwave_ir_cal_val_t](sl-rail-zwave-ir-cal-val-t).
- Global [RAIL_ZWAVE_IrcalVal_t::imageRejection](rail-zwave-ircal-val-t#image-rejection)  [2]  
  RAIL 2.x synonym of [sl_rail_zwave_ir_cal_val_t::image_rejection](sl-rail-zwave-ir-cal-val-t#image-rejection).
- Global [RAIL_ZWAVE_IsEnabled](z-wave#rail-zwave-is-enabled)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_is_enabled()](z-wave#sl-rail-zwave-is-enabled).
- Global [RAIL_ZWAVE_LR](z-wave#rail-zwave-lr)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_BAUD_LR](z-wave#sl-rail-zwave-baud-lr).
- Global [RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID](z-wave#rail-zwave-lr-beam-tx-power-invalid)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID](z-wave#sl-rail-zwave-lr-beam-tx-power-invalid).
- Class [RAIL_ZWAVE_LrAckData_t](rail-zwave-lr-ack-data-t)  
  RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t](sl-rail-zwave-lr-ack-data-t).
- Global [RAIL_ZWAVE_LrAckData_t::noiseFloorDbm](rail-zwave-lr-ack-data-t#noise-floor-dbm)  
  RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::noise_floor_dbm](sl-rail-zwave-lr-ack-data-t#noise-floor-dbm).
- Global [RAIL_ZWAVE_LrAckData_t::receiveRssiDbm](rail-zwave-lr-ack-data-t#receive-rssi-dbm)  
  RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::receive_rssi_dbm](sl-rail-zwave-lr-ack-data-t#receive-rssi-dbm).
- Global [RAIL_ZWAVE_LrAckData_t::txPowerDbm](rail-zwave-lr-ack-data-t#tx-power-dbm)  
  RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::transmit_power_dbm](sl-rail-zwave-lr-ack-data-t#transmit-power-dbm).
- Global [RAIL_ZWAVE_NODE_ID_BROADCAST](z-wave#rail-zwave-node-id-broadcast)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_NODE_ID_BROADCAST](z-wave#sl-rail-zwave-node-id-broadcast).
- Global [RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE](z-wave#rail-zwave-node-id-broadcast-longrange)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_BROADCAST](z-wave#sl-rail-zwave-node-id-long-range-broadcast).
- Global [RAIL_ZWAVE_NODE_ID_DEFAULT](z-wave#rail-zwave-node-id-default)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_NODE_ID_DEFAULT](z-wave#sl-rail-zwave-node-id-default).
- Global [RAIL_ZWAVE_NODE_ID_DEFAULT_LONGRANGE](z-wave#rail-zwave-node-id-default-longrange)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_DEFAULT](z-wave#sl-rail-zwave-node-id-long-range-default).
- Global [RAIL_ZWAVE_NODE_ID_NONE](z-wave#rail-zwave-node-id-none)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_NODE_ID_NONE](z-wave#sl-rail-zwave-node-id-none).
- Global [RAIL_ZWAVE_NodeId_t](z-wave#rail-zwave-node-id-t)  
  RAIL 2.x synonym of [sl_rail_zwave_node_id_t](z-wave#sl-rail-zwave-node-id-t).
- Global [RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#rail-zwave-option-detect-beam-frames)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#sl-rail-zwave-option-detect-beam-frames).
- Global [RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT](z-wave#rail-zwave-option-detect-beam-frames-shift)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT](z-wave#sl-rail-zwave-option-detect-beam-frames-shift).
- Global [RAIL_ZWAVE_OPTION_NODE_ID_FILTERING](z-wave#rail-zwave-option-node-id-filtering)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING](z-wave#sl-rail-zwave-option-node-id-filtering).
- Global [RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT](z-wave#rail-zwave-option-node-id-filtering-shift)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT](z-wave#sl-rail-zwave-option-node-id-filtering-shift).
- Global [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#sl-rail-zwave-option-promiscuous-beam-mode).
- Global [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT](z-wave#rail-zwave-option-promiscuous-beam-mode-shift)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT](z-wave#sl-rail-zwave-option-promiscuous-beam-mode-shift).
- Global [RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#rail-zwave-option-promiscuous-mode)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#sl-rail-zwave-option-promiscuous-mode).
- Global [RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT](z-wave#rail-zwave-option-promiscuous-mode-shift)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT](z-wave#sl-rail-zwave-option-promiscuous-mode-shift).
- Global [RAIL_ZWAVE_OPTIONS_ALL](z-wave#rail-zwave-options-all)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTIONS_ALL](z-wave#sl-rail-zwave-options-all).
- Global [RAIL_ZWAVE_OPTIONS_DEFAULT](z-wave#rail-zwave-options-default)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTIONS_DEFAULT](z-wave#sl-rail-zwave-options-default).
- Global [RAIL_ZWAVE_OPTIONS_NONE](z-wave#rail-zwave-options-none)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_OPTIONS_NONE](z-wave#sl-rail-zwave-options-none).
- Global [RAIL_ZWAVE_Options_t](z-wave#rail-zwave-options-t)  
  RAIL 2.x synonym of [sl_rail_zwave_options_t](z-wave#sl-rail-zwave-options-t).
- Global [RAIL_ZWAVE_PerformIrcal](z-wave#rail-zwave-perform-ircal)  (RAIL_Handle_t railHandle, [RAIL_ZWAVE_IrcalVal_t](rail-zwave-ircal-val-t) *pIrCalVals, bool forceIrcal)  
  RAIL 2.x synonym of [sl_rail_zwave_perform_ir_cal()](z-wave#sl-rail-zwave-perform-ir-cal).
- Global [RAIL_ZWAVE_ReceiveBeam](z-wave#rail-zwave-receive-beam)  (RAIL_Handle_t railHandle, uint8_t *beamDetectIndex, const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *schedulerInfo)  
  RAIL 2.x synonym of [sl_rail_zwave_receive_beam()](z-wave#sl-rail-zwave-receive-beam).
- Global [RAIL_ZWAVE_REGION_ANZ](z-wave#rail-zwave-region-anz)  
  RAIL 2.x synonym of [sl_rail_zwave_region_anz](z-wave#sl-rail-zwave-region-anz).
- Global [RAIL_ZWAVE_REGION_CN](z-wave#rail-zwave-region-cn)  
  RAIL 2.x synonym of [sl_rail_zwave_region_cn](z-wave#sl-rail-zwave-region-cn).
- Global [RAIL_ZWAVE_REGION_EU](z-wave#rail-zwave-region-eu)  
  RAIL 2.x synonym of [sl_rail_zwave_region_eu](z-wave#sl-rail-zwave-region-eu).
- Global [RAIL_ZWAVE_REGION_EU_LR1](z-wave#rail-zwave-region-eu-lr1)  
  RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_1](z-wave#sl-rail-zwave-region-eu-lr-1).
- Global [RAIL_ZWAVE_REGION_EU_LR2](z-wave#rail-zwave-region-eu-lr2)  
  RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_2](z-wave#sl-rail-zwave-region-eu-lr-2).
- Global [RAIL_ZWAVE_REGION_EU_LR3](z-wave#rail-zwave-region-eu-lr3)  
  RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_3](z-wave#sl-rail-zwave-region-eu-lr-3).
- Global [RAIL_ZWAVE_REGION_EU_LR_END_DEVICE](z-wave#rail-zwave-region-eu-lr-end-device)  
  Backwards-compatible define.
- Global [RAIL_ZWAVE_REGION_HK](z-wave#rail-zwave-region-hk)  
  RAIL 2.x synonym of [sl_rail_zwave_region_hk](z-wave#sl-rail-zwave-region-hk).
- Global [RAIL_ZWAVE_REGION_IL](z-wave#rail-zwave-region-il)  
  RAIL 2.x synonym of [sl_rail_zwave_region_il](z-wave#sl-rail-zwave-region-il).
- Global [RAIL_ZWAVE_REGION_IN](z-wave#rail-zwave-region-in)  
  RAIL 2.x synonym of [sl_rail_zwave_region_in](z-wave#sl-rail-zwave-region-in).
- Global [RAIL_ZWAVE_REGION_INVALID](z-wave#rail-zwave-region-invalid)  
  RAIL 2.x synonym of [sl_rail_zwave_region_invalid](z-wave#sl-rail-zwave-region-invalid).
- Global [RAIL_ZWAVE_REGION_JP](z-wave#rail-zwave-region-jp)  
  RAIL 2.x synonym of [sl_rail_zwave_region_jp](z-wave#sl-rail-zwave-region-jp).
- Global [RAIL_ZWAVE_REGION_JPED](z-wave#rail-zwave-region-jped)  
  This RAIL 2.x region config has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_ZWAVE_REGION_KR](z-wave#rail-zwave-region-kr)  
  RAIL 2.x synonym of [sl_rail_zwave_region_kr](z-wave#sl-rail-zwave-region-kr).
- Global [RAIL_ZWAVE_REGION_KRED](z-wave#rail-zwave-region-kred)  
  This RAIL 2.x region config has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_ZWAVE_REGION_MY](z-wave#rail-zwave-region-my)  
  RAIL 2.x synonym of [sl_rail_zwave_region_my](z-wave#sl-rail-zwave-region-my).
- Global [RAIL_ZWAVE_REGION_RU](z-wave#rail-zwave-region-ru)  
  RAIL 2.x synonym of [sl_rail_zwave_region_ru](z-wave#sl-rail-zwave-region-ru).
- Global [RAIL_ZWAVE_REGION_US](z-wave#rail-zwave-region-us)  
  RAIL 2.x synonym of [sl_rail_zwave_region_us](z-wave#sl-rail-zwave-region-us).
- Global [RAIL_ZWAVE_REGION_US_LR1](z-wave#rail-zwave-region-us-lr1)  
  RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_1](z-wave#sl-rail-zwave-region-us-lr-1).
- Global [RAIL_ZWAVE_REGION_US_LR2](z-wave#rail-zwave-region-us-lr2)  
  RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_2](z-wave#sl-rail-zwave-region-us-lr-2).
- Global [RAIL_ZWAVE_REGION_US_LR3](z-wave#rail-zwave-region-us-lr3)  
  RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_3](z-wave#sl-rail-zwave-region-us-lr-3).
- Global [RAIL_ZWAVE_REGION_US_LR_END_DEVICE](z-wave#rail-zwave-region-us-lr-end-device)  
  Backwards-compatible define.
- Class [RAIL_ZWAVE_RegionConfig_t](rail-zwave-region-config-t)  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t](sl-rail-zwave-region-config-t).
- Global [RAIL_ZWAVE_RegionConfig_t::baudRate](rail-zwave-region-config-t#baud-rate)  [(4U)]  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t::baud_rate](sl-rail-zwave-region-config-t#baud-rate).
- Global [RAIL_ZWAVE_RegionConfig_t::frequency](rail-zwave-region-config-t#frequency)  [(4U)]  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t::frequency_hz](sl-rail-zwave-region-config-t#frequency-hz).
- Global [RAIL_ZWAVE_RegionConfig_t::maxPower](rail-zwave-region-config-t#max-power)  [(4U)]  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t::max_power_dbm](sl-rail-zwave-region-config-t#max-power-dbm).
- Global [RAIL_ZWAVE_RegionConfig_t::regionId](rail-zwave-region-config-t#region-id)  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t::region_id](sl-rail-zwave-region-config-t#region-id).
- Global [RAIL_ZWAVE_RegionConfig_t::regionSpecific](rail-zwave-region-config-t#region-specific)  
  RAIL 2.x synonym of [sl_rail_zwave_region_config_t::region_options](sl-rail-zwave-region-config-t#region-options).
- Global [RAIL_ZWAVE_REGIONID_ANZ](z-wave#rail-zwave-regionid-anz)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_ANZ](z-wave#sl-rail-zwave-region-id-anz).
- Global [RAIL_ZWAVE_REGIONID_CN](z-wave#rail-zwave-regionid-cn)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_CN](z-wave#sl-rail-zwave-region-id-cn).
- Global [RAIL_ZWAVE_REGIONID_COUNT](z-wave#rail-zwave-regionid-count)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_COUNT](z-wave#sl-rail-zwave-region-id-count).
- Global [RAIL_ZWAVE_REGIONID_EU](z-wave#rail-zwave-regionid-eu)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_EU](z-wave#sl-rail-zwave-region-id-eu).
- Global [RAIL_ZWAVE_REGIONID_EU_LR1](z-wave#rail-zwave-regionid-eu-lr1)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_EU_LR_1](z-wave#sl-rail-zwave-region-id-eu-lr-1).
- Global [RAIL_ZWAVE_REGIONID_EU_LR2](z-wave#rail-zwave-regionid-eu-lr2)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_EU_LR_2](z-wave#sl-rail-zwave-region-id-eu-lr-2).
- Global [RAIL_ZWAVE_REGIONID_EU_LR3](z-wave#rail-zwave-regionid-eu-lr3)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_EU_LR_3](z-wave#sl-rail-zwave-region-id-eu-lr-3).
- Global [RAIL_ZWAVE_REGIONID_EU_LR_END_DEVICE](z-wave#rail-zwave-regionid-eu-lr-end-device)  
  This RAIL 2.x backwards compatible enum value has been eliminated in RAIL 3, use [SL_RAIL_ZWAVE_REGION_ID_EU_LR_3](z-wave#sl-rail-zwave-region-id-eu-lr-3).
- Global [RAIL_ZWAVE_REGIONID_HK](z-wave#rail-zwave-regionid-hk)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_HK](z-wave#sl-rail-zwave-region-id-hk).
- Global [RAIL_ZWAVE_REGIONID_IL](z-wave#rail-zwave-regionid-il)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_IL](z-wave#sl-rail-zwave-region-id-il).
- Global [RAIL_ZWAVE_REGIONID_IN](z-wave#rail-zwave-regionid-in)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_IN](z-wave#sl-rail-zwave-region-id-in).
- Global [RAIL_ZWAVE_REGIONID_JP](z-wave#rail-zwave-regionid-jp)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_JP](z-wave#sl-rail-zwave-region-id-jp).
- Global [RAIL_ZWAVE_REGIONID_KR](z-wave#rail-zwave-regionid-kr)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_KR](z-wave#sl-rail-zwave-region-id-kr).
- Global [RAIL_ZWAVE_REGIONID_MY](z-wave#rail-zwave-regionid-my)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_MY](z-wave#sl-rail-zwave-region-id-my).
- Global [RAIL_ZWAVE_REGIONID_RU](z-wave#rail-zwave-regionid-ru)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_RU](z-wave#sl-rail-zwave-region-id-ru).
- Global [RAIL_ZWAVE_RegionId_t](z-wave#rail-zwave-region-id-t)  
  RAIL 2.x synonym of [sl_rail_zwave_region_id_t](z-wave#sl-rail-zwave-region-id-t).
- Global [RAIL_ZWAVE_REGIONID_UNKNOWN](z-wave#rail-zwave-regionid-unknown)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_UNKNOWN](z-wave#sl-rail-zwave-region-id-unknown).
- Global [RAIL_ZWAVE_REGIONID_US](z-wave#rail-zwave-regionid-us)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_US](z-wave#sl-rail-zwave-region-id-us).
- Global [RAIL_ZWAVE_REGIONID_US_LR1](z-wave#rail-zwave-regionid-us-lr1)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_US_LR_1](z-wave#sl-rail-zwave-region-id-us-lr-1).
- Global [RAIL_ZWAVE_REGIONID_US_LR2](z-wave#rail-zwave-regionid-us-lr2)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_US_LR_2](z-wave#sl-rail-zwave-region-id-us-lr-2).
- Global [RAIL_ZWAVE_REGIONID_US_LR3](z-wave#rail-zwave-regionid-us-lr3)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_REGION_ID_US_LR_3](z-wave#sl-rail-zwave-region-id-us-lr-3).
- Global [RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE](z-wave#rail-zwave-regionid-us-lr-end-device)  
  This RAIL 2.x backwards compatible enum value has been eliminated in RAIL 3; use [SL_RAIL_ZWAVE_REGION_ID_US_LR_3](z-wave#sl-rail-zwave-region-id-us-lr-3).
- Global [RAIL_ZWAVE_SetDefaultRxBeamConfig](z-wave#rail-zwave-set-default-rx-beam-config)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_set_default_rx_beam_config()](z-wave#sl-rail-zwave-set-default-rx-beam-config).
- Global [RAIL_ZWAVE_SetHomeId](z-wave#rail-zwave-set-home-id)  (RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeId_t homeId, RAIL_ZWAVE_HomeIdHash_t homeIdHash)  
  RAIL 2.x synonym of [sl_rail_zwave_set_home_id()](z-wave#sl-rail-zwave-set-home-id).
- Global [RAIL_ZWAVE_SetLrAckData](z-wave#rail-zwave-set-lr-ack-data)  (RAIL_Handle_t railHandle, const [RAIL_ZWAVE_LrAckData_t](rail-zwave-lr-ack-data-t) *pLrAckData)  
  RAIL 2.x synonym of [sl_rail_zwave_set_lr_ack_data()](z-wave#sl-rail-zwave-set-lr-ack-data).
- Global [RAIL_ZWAVE_SetNodeId](z-wave#rail-zwave-set-node-id)  (RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t nodeId)  
  RAIL 2.x synonym of [sl_rail_zwave_set_node_id()](z-wave#sl-rail-zwave-set-node-id).
- Global [RAIL_ZWAVE_SetTxLowPower](z-wave#rail-zwave-set-tx-low-power)  (RAIL_Handle_t railHandle, uint8_t powerLevel)  
  This RAIL 2.x function has been eliminated.
- Global [RAIL_ZWAVE_SetTxLowPowerDbm](z-wave#rail-zwave-set-tx-low-power-dbm)  (RAIL_Handle_t railHandle, RAIL_TxPower_t power)  
  RAIL 2.x synonym of [sl_rail_zwave_set_tx_low_power_dbm()](z-wave#sl-rail-zwave-set-tx-low-power-dbm).
- Global [RAIL_ZWAVE_SUPPORTS_CONC_PHY](features#rail-zwave-supports-conc-phy-1)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_SUPPORTS_CONC_PHY](features#sl-rail-zwave-supports-conc-phy-1).
- Global [RAIL_ZWAVE_SUPPORTS_ED_PHY](features#rail-zwave-supports-ed-phy)  
  This RAIL 2.x define has been eliminated in RAIL 3;
- Global [RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#rail-zwave-supports-region-pti-1)  
  RAIL 2.x synonym of [SL_RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#sl-rail-zwave-supports-region-pti-1).
- Global [RAIL_ZWAVE_SupportsConcPhy](features#rail-zwave-supports-conc-phy)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_supports_conc_phy()](features#sl-rail-zwave-supports-conc-phy).
- Global [RAIL_ZWAVE_SupportsEnergyDetectPhy](features#rail-zwave-supports-energy-detect-phy)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported.
- Global [RAIL_ZWAVE_SupportsRegionPti](features#rail-zwave-supports-region-pti)  (RAIL_Handle_t railHandle)  
  RAIL 2.x synonym of [sl_rail_zwave_supports_region_pti()](features#sl-rail-zwave-supports-region-pti).
- Global [RAILCb_AssertFailed](assertions#rail-cb-assert-failed)  (RAIL_Handle_t railHandle, RAIL_AssertErrorCodes_t errorCode)  
  This RAIL 2.x callback has been replaced in RAIL 3 by [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed) with an additional parameter.
- Global [RAILCb_ConfigFrameTypeLength](receive#rail-cb-config-frame-type-length)  (RAIL_Handle_t railHandle, const [RAIL_FrameType_t](rail-frame-type-t) *frameType)  
  This RAIL 2.x callback has been eliminated in RAIL 3. Applications needing frame type length decoding must call [sl_rail_include_frame_type_length()](receive#sl-rail-include-frame-type-length).
- Global [RAILCb_ConfigSleepTimerSync](sleep#rail-cb-config-sleep-timer-sync)  ([RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) *timerSyncConfig)  
  This RAIL 2.x callback has been eliminated in RAIL 3. Use [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) to specify use of default or specific PRS and RTCC channels.
- Global [RAILCb_IEEE802154_IsModeSwitchNewChannelValid](ieee802-15-4#rail-cb-ieee802154-is-mode-switch-new-channel-valid)  (uint32_t currentBaseFreq, uint8_t newPhyModeId, const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *configEntryNewPhyModeId, uint16_t *pChannel)  
  RAIL 2.x synonym of [sl_railcb_ieee802154_is_mode_switch_new_channel_valid()](ieee802-15-4#sl-railcb-ieee802154-is-mode-switch-new-channel-valid).
- Global [RAILCb_PaAutoModeDecision](pa#rail-cb-pa-auto-mode-decision)  (RAIL_Handle_t railHandle, RAIL_TxPower_t *power, RAIL_TxPowerMode_t *mode, const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *chCfgEntry)  
  This RAIL 2.x callback has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.
- Global [RAILCb_SetupRxFifo](data-management#rail-cb-setup-rx-fifo)  (RAIL_Handle_t railHandle)  
  This RAIL 2.x callback has been eliminated in RAIL 3. The Rx FIFO (and Packet Queue) can be configured in the [sl_rail_config_t](sl-rail-config-t) passed into [sl_rail_init()](general#sl-rail-init), or later via [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) and/or [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue). Unlike in RAIL 2.x where the Rx FIFO and internal Packet Queue are shared among all protocols, those RAIL 3 APIs allow a protocol to establish, even when inactive, its own Rx FIFO and Packet Queue independent of other protocols' which are preserved and not reset during protocol switches.
- Global [RAILINT_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep-sixx3-xx#railint-timer-sync-prs-channel-default)  
  RAIL 2.x. synonym of [SLI_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep-sixx3-xx#sli-rail-timer-sync-prs-channel-default).  
  RAIL 2.x synonym of [SLI_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep-sixx3-xx#sli-rail-timer-sync-prs-channel-default).
- Global [RAILINT_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep-sixx3-xx#railint-timer-sync-rtcc-channel-default)  
  RAIL 2.x. synonym of [SLI_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep-sixx3-xx#sli-rail-timer-sync-rtcc-channel-default).  
  RAIL 2.x synonym of [SLI_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep-sixx3-xx#sli-rail-timer-sync-rtcc-channel-default).
- Class [RAILSched_Config_t](rail-sched-config-t)  
  This RAIL 2.x type has been eliminated in RAIL 3.
- Global [RAILSched_Config_t::buffer](rail-sched-config-t#buffer)  [1]  
  This RAIL 2.x type has been eliminated in RAIL 3.
- Global [RX_DEMOD_DATA](data-management#rx-demod-data)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA](data-management#sl-rail-rx-data-source-demod-data).
- Global [RX_DIRECT_MODE_DATA](data-management#rx-direct-mode-data)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA](data-management#sl-rail-rx-data-source-direct-mode-data).
- Global [RX_DIRECT_SYNCHRONOUS_MODE_DATA](data-management#rx-direct-synchronous-mode-data)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_DIRECT_SYNCHRONOUS_MODE_DATA](data-management#sl-rail-rx-data-source-direct-synchronous-mode-data).
- Global [RX_IQDATA_FILTLSB](data-management#rx-iqdata-filtlsb)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB](data-management#sl-rail-rx-data-source-iqdata-filtlsb).
- Global [RX_IQDATA_FILTMSB](data-management#rx-iqdata-filtmsb)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB](data-management#sl-rail-rx-data-source-iqdata-filtmsb).
- Global [RX_PACKET_DATA](data-management#rx-packet-data)  
  RAIL 2.x synonym of [SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data).
- Global [sl_rail_antenna_config_t::reserved](sl-rail-antenna-config-t#reserved)  
  No longer used (ignored).
- Global [sl_rail_util_pa_get_tx_power_config_2p4ghz](pa-power-conversions#sl-rail-util-pa-get-tx-power-config-2p4ghz)  (void)  
  This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init).
- Global [sl_rail_util_pa_get_tx_power_config_ofdm](pa-power-conversions#sl-rail-util-pa-get-tx-power-config-ofdm)  (void)  
  This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init).
- Global [sl_rail_util_pa_get_tx_power_config_subghz](pa-power-conversions#sl-rail-util-pa-get-tx-power-config-subghz)  (void)  
  This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init).
- Global [TRANSITION_TIME_US](multiprotocol-efr32-xg2-x#transition-time-us)  
  RAIL 2.x synonym of [SL_RAIL_TRANSITION_TIME_US](multiprotocol-sixx3-xx#sl-rail-transition-time-us).  
  RAIL 2.x. synonym of [SL_RAIL_TRANSITION_TIME_US](multiprotocol-sixx3-xx#sl-rail-transition-time-us).
- Global [TX_MFM_DATA](data-management#tx-mfm-data)  
  RAIL 2.x synonym of [SL_RAIL_TX_DATA_SOURCE_MFM_DATA](data-management#sl-rail-tx-data-source-mfm-data).
- Global [TX_PACKET_DATA](data-management#tx-packet-data)  
  RAIL 2.x synonym of [SL_RAIL_TX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-tx-data-source-packet-data).

### RAIL Library

 Silicon Labs Radio Abstraction Interface Layer (RAIL) is a library that can be used as a generic interface for all Silicon Labs radio parts. By programming against this API, you can write code that easily ports across different radio parts while having access to hardware acceleration wherever possible.

#### Introduction

The RAIL library is mostly standalone with a few external dependencies. Simplicity Studio application builder is not required but is recommended because it simplifies building applications using RAIL. Depending on the hardware platform that you're using, you may be required to provide certain HAL functionality for the library to work properly. These functions are described in hardware-specific documentation sections and valid implementations can be found as a part of the provided emlib/emdrv HAL layers. It is recommended that you use these versions for maximum support, but you're free to re-implement them if necessary.

#### Using RAIL

##### Features

At a high level, the functionality supported by RAIL is shown below. For more specifics on the APIs and how to use them, see the module documentation.

- [General](general)  
  - Initialize the RAIL API layer.  
  - Collect entropy from the radio (if available).
- [Radio Configuration](radio-configuration)  
  - Configure the radio frequency, packet format, channel configuration and other PHY parameters.  
  - Query current PHY data rates and parameters like current channel.
- [State Transitions](state-transitions)  
  - Configure automatic radio state transitions and transition timings.
- [Auto-Ack](auto-ack)  
  - Configure the radio for automatic acknowledgments.  
  - Load the auto ACK payload.
- [System Timing](system-timing)  
  - Get the current time in the RAIL timebase.  
  - Configure a timer to trigger an event callback after an absolute or relative delay.  
  - Specify where within a packet its timestamp is desired.
- [Sleep](sleep)  
  - Configure RAIL behavior and timekeeping for low power modes.
- [Events](events)  
  - Configure which radio or RAIL events the application wants to be told about via callback.
- [Data Management](data-management)  
  - Allows the application to choose the type of data and the method of data interaction through RAIL.
- [Receive](receive)  
  - Configure receive options like CRC checking.  
  - Start or schedule when to receive.  
  - Enable and configure [Address Filtering](address-filtering) for each packet.  
  - Enable and configure [RX Channel Hopping](rx-channel-hopping) for receiving packets across several channels.
- [Transmit](transmit)  
  - Configure the power amplifier ([Power Amplifier (PA)](pa)) and set transmit power output.  
  - Load and send packet data, either immediately, scheduled, or using CSMA or LBT.  
  - Control per-transmit options like CRC generation, ACK waiting, etc.
- [Antenna Control](antenna-control)  
  - Configuring multi-antenna selection.
- [Multiprotocol](multiprotocol)  
  - Manage time-sharing of the radio among different protocols.
- [Series 3 Scheduler](scheduler-series-3)  
  - Control scheduled transaction requests between internal and external radio requestors.
- [Calibration](calibration)  
  - APIs for handling various radio calibrations for optimal performance.
- [RF Sense](rf-sense)  
  - Enable RF energy sensing of specified duration across the 2.4 GHz and/or Sub-GHz bands (supported only on certain EFR32 chips).
- [PTI Packet Trace](pti)  
  - Configure Packet Trace pins and serial protocol.  
  - Specify the stack protocol to aid network analyzer packet decoding.
- [Front End Module Voltage Detection](vdet)  
  - Configure RAIL to measure the voltage on a Front End Module during the transmit packet.
- [Assertions](assertions)  
  - Detecting and handling fatal runtime errors detected by RAIL.
- [Diagnostic](diagnostic)  
  - Output debug signals like an unmodulated tone and a continuously modulated stream of data.  
  - Configure crystal tuning for your radio.  
  - Fine-tune the radio tuner frequency.
- [Features](features)  
  - Macros to indicate which features exist on which chip families.

[Protocol-specific](protocol-specific) hardware acceleration (each only on supported chips):

- [BLE](ble)  
  - Configure the Bluetooth Low Energy PHYs available for your device (1 Mbps, 2 Mbps, Coded PHY).  
  - Preamble, sync word and whitening adjustment function for connections.
- [IEEE 802.15.4](ieee802-15-4)  
  - Configure the IEEE802.15.4 2.4 GHz PHY.  
  - Configure node address and address filtering for IEEE 802.15.4.  
  - Configure auto ACK for IEEE 802.15.4.
- [Sidewalk Radio Configurations](sidewalk-phy)  
  - Configure 2GFSK 50 kbps Sidewalk PHY.
- [Wireless M-Bus](wmbus)  
  - Configure simultaneous M2O RX of T and C modes feature.
- [Z-Wave](z-wave)  
  - Configure the Z-Wave PHY appropriate for your region.  
  - Configure your NodeId and HomeId for receive filtering and wakeup beam filtering.

##### Getting Started Example

Below is a simple example to show you how to initialize the RAIL library in your application. Notice that this requires the channel configurations, which can be generated from the radio calculator in Simplicity Studio. By default, RAIL interacts with data on a per-packet basis. For more information, see [Data Management](data-management).

_Note: Before the radio can transmit, PA power conversion tables or curves must be established for your platform, which is described in the Hardware-specific Configuration section below but in general should use the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin._

```c
#include <assert.h>
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h" // in sl_rail_util_pa plugin
#include "rail_config.h" // Generated by radio calculator

#define TX_FIFO_BYTES (128)  // Any power of 2 from [64, 4096] on the EFR32

static sl_rail_handle_t rail_handle = SL_RAIL_EFR32_HANDLE;
static sl_rail_tx_power_t tx_power_ddbm = 200; // Default to 20 dBm
static SL_RAIL_DECLARE_FIFO_BUFFER(aligned_tx_fifo, TX_FIFO_BYTES);
static uint8_t *tx_fifo = (uint8_t *)aligned_tx_fifo; // For byte access

static void radio_event_handler(sl_rail_handle_t rail_handle,
                                sl_rail_events_t events)
{
  // ... handle RAIL events, e.g., receive and transmit completion
}

// Initializes the radio out of startup so that it's ready to receive.
void radio_initialize(void)
{
  sl_rail_status_t status;
  sl_rail_config_t rail_config = {
    .events_callback = &radio_event_handler,
  //.p_opaque_handle_0 = ... // app-specific if desired
  //.p_opaque_handle_1 = ... // app-specific if desired
  //.opaque_value = ... // app-specific if desired
    .rx_packet_queue_entries = SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes = SL_RAIL_BUILTIN_RX_FIFO_BYTES,
    .tx_fifo_bytes = TX_FIFO_BYTES,
    .tx_fifo_init_bytes = 0U,
    .p_rx_packet_queue = sl_rail_builtin_rx_packet_queue_ptr,
    .p_rx_fifo_buffer = sl_rail_builtin_rx_fifo_ptr,
    .p_tx_fifo_buffer = aligned_tx_fifo,
  };

  sl_rail_util_pa_init(); // Establish PA conversion table(s)

  // Initialize the RAIL library and any internal state it requires.
  status = sl_rail_init(&rail_handle, &rail_config, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  // Here rail_handle has been converted to a real protocol instance handle

  // Configure calibration settings.
  status = sl_rail_config_cal(rail_handle, SL_RAIL_CAL_ALL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Configure radio according to the generated radio settings.
  // channelConfigs[] comes from calculator-generated rail_config.c/.h files.
  status = sl_rail_config_channels(rail_handle, channelConfigs[0],
                                   &sl_rail_util_pa_on_channel_config_change);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_set_tx_power_dbm(rail_handle, tx_power_ddbm);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Configure the most useful callbacks and catch a few errors.
  status = sl_rail_config_events(rail_handle,
                                 SL_RAIL_EVENTS_ALL,
                                 (SL_RAIL_EVENT_TX_PACKET_SENT
                                  | SL_RAIL_EVENT_RX_PACKET_RECEIVED
                                  | SL_RAIL_EVENT_RX_FRAME_ERROR));
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Set automatic transitions to always receive once started.
  sl_rail_state_transitions_t state_transitions = {
    .success = SL_RAIL_RF_STATE_RX,
    .error   = SL_RAIL_RF_STATE_RX,
  };
  status = sl_rail_set_rx_transitions(rail_handle, &state_transitions);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_set_tx_transitions(rail_handle, &state_transitions);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

```

#### Hardware-Specific Configuration

For hardware-specific configuration and setup information, see subsequent sections.

[EFR32](efr32-main)

### RAIL API

This is the primary API layer for the Radio Abstraction Interface Layer (RAIL). 

#### Modules

[Antenna Control](antenna-control)

[Assertions](assertions)

[Auto-Ack](auto-ack)

[Calibration](calibration)

[Chip-Specific](chip-specific)

[Data Management](data-management)

[Diagnostic](diagnostic)

[Events](events)

[External Thermistor](external-thermistor)

[Features](features)

[Front End Module Voltage Detection](vdet)

[General](general)

[Multiprotocol](multiprotocol)

[PTI Packet Trace](pti)

[Protocol-specific](protocol-specific)

[RF Sense](rf-sense)

[RX Channel Hopping](rx-channel-hopping)

[Radio Configuration](radio-configuration)

[Receive](receive)

[Retiming](retiming)

[Series 3 Scheduler](scheduler-series-3)

[Sleep](sleep)

[State Transitions](state-transitions)

[System Timing](system-timing)

[TX Channel Hopping](tx-channel-hopping)

[Thermal Protection](thermal-protection)

[Transmit](transmit)

[TrustZone](trust-zone)

#### Assertions

Callbacks called by assertions. 

The assertion framework was implemented to not only assert that certain conditions are true in a block of code, but also to handle them more appropriately. In previous implementations, the behavior upon a failed assert was to hang in a while(1) loop. However, with the callback, each assert is given a unique error code so that they can be handled on a more case-by-case basis. For documentation on each of the errors, see the [rail_assert_error_codes.h](rail-assert-error-codes-h) file. [RAIL_ASSERT_ERROR_MESSAGES](assertions#rail-assert-error-messages)[errorCode] gives the explanation of the error. With asserts built into the library, users can choose how to handle each error inside the callback.

The assertion framework was implemented to not only assert that certain conditions are true in a block of code, but also to handle them more appropriately. In previous implementations, the behavior upon a failed assert was to hang in a while(1) loop. However, with the callback, each assert is given a unique error code so that they can be handled on a more case-by-case basis. For documentation on each of the errors, see the [rail_assert_error_codes.h](rail-assert-error-codes-h) file. [SL_RAIL_ASSERT_ERROR_MESSAGES](assertions#sl-rail-assert-error-messages)[error_code] gives the explanation of the error. With asserts built into the library, users can choose how to handle each error inside the callback. 

##### Enumerations

###### RAIL_AssertErrorCodes_t

```
enum RAIL_AssertErrorCodes_t {
    RAIL_ASSERT_FAILED_APPENDED_INFO_MISSING = 0
    RAIL_ASSERT_FAILED_RX_FIFO_BYTES = 1
    RAIL_ASSERT_UNUSED_2 = 2
    RAIL_ASSERT_FAILED_ILLEGAL_RXLEN_ENTRY_STATUS = 3
    RAIL_ASSERT_FAILED_BAD_PACKET_LENGTH = 4
    RAIL_ASSERT_FAILED_SYNTH_DIVCTRL_ENUM_CONVERSION_ERROR = 5
    RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO = 6
    RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RXLEN_FIFO = 7
    RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO = 8
    RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TXACK_FIFO = 9
    RAIL_ASSERT_INVALID_MEMORY_ACCESS = 10
    RAIL_ASSERT_FAILED_UNSUPPORTED_RX_DATA_SOURCE = 11
    RAIL_ASSERT_UNUSED_12 = 12
    RAIL_ASSERT_FAILED_RTCC_POST_WAKEUP = 13
    RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY = 14
    RAIL_ASSERT_FAILED_RAC_STATE = 15
    RAIL_ASSERT_FAILED_SYNTH_INVALID_VCOCTRL = 16
    RAIL_ASSERT_FAILED_NESTED_SEQUENCER_LOCK = 17
    RAIL_ASSERT_FAILED_RSSI_AVERAGE_DONE = 18
    RAIL_ASSERT_UNUSED_19 = 19
    RAIL_ASSERT_FAILED_PROTIMER_RANDOM_SEED = 20
    RAIL_ASSERT_UNUSED_21 = 21
    RAIL_ASSERT_FAILED_PROTIMER_CHANNEL = 22
    RAIL_ASSERT_UNUSED_23 = 23
    RAIL_ASSERT_FAILED_BASECNTTOP = 24
    RAIL_ASSERT_UNUSED_25 = 25
    RAIL_ASSERT_FAILED_RTCC_SYNC_MISSED = 26
    RAIL_ASSERT_FAILED_CLOCK_SOURCE_NOT_READY = 27
    RAIL_ASSERT_UNUSED_28 = 28
    RAIL_ASSERT_NULL_HANDLE = 29
    RAIL_ASSERT_UNUSED_30 = 30
    RAIL_ASSERT_FAILED_NO_ACTIVE_CONFIG = 31
    RAIL_ASSERT_UNUSED_32 = 32
    RAIL_ASSERT_UNUSED_33 = 33
    RAIL_ASSERT_UNUSED_34 = 34
    RAIL_ASSERT_UNUSED_35 = 35
    RAIL_ASSERT_UNUSED_36 = 36
    RAIL_ASSERT_UNUSED_37 = 37
    RAIL_ASSERT_FAILED_TX_SYNTH_ENABLE = 38
    RAIL_ASSERT_DEPRECATED_FUNCTION = 39
    RAIL_ASSERT_MULTIPROTOCOL_NO_EVENT = 40
    RAIL_ASSERT_FAILED_INVALID_INTERRUPT_ENABLED = 41
    RAIL_ASSERT_UNUSED_42 = 42
    RAIL_ASSERT_DIVISION_BY_ZERO = 43
    RAIL_ASSERT_CANT_USE_HARDWARE = 44
    RAIL_ASSERT_NULL_PARAMETER = 45
    RAIL_ASSERT_SECURE_ELEMENT_FAULT = 46
    RAIL_ASSERT_SMALL_SYNTH_RADIO_CONFIG_BUFFER = 47
    RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT = 48
    RAIL_ASSERT_INVALID_MODULE_ACTION = 49
    RAIL_ASSERT_CHANNEL_HOPPING_INVALID_RADIO_CONFIG = 50
    RAIL_ASSERT_CHANNEL_CHANGE_FAILED = 51
    RAIL_ASSERT_INVALID_REGISTER = 52
    RAIL_ASSERT_CP_DMA_INTERNAL_GENERIC_ERROR = 53
    RAIL_ASSERT_CACHE_CONFIG_FAILED = 54
    RAIL_ASSERT_NULL_TRANSITIONS = 55
    RAIL_ASSERT_BAD_LDMA_TRANSFER = 56
    RAIL_ASSERT_INVALID_RTCC_SYNC_VALUES = 57
    RAIL_ASSERT_SEQUENCER_FAULT = 58
    RAIL_ASSERT_BUS_ERROR = 59
    RAIL_ASSERT_INVALID_FILTERING_CONFIG = 60
    RAIL_ASSERT_RETIMING_CONFIG = 61
    RAIL_ASSERT_FAILED_TX_CRC_CONFIG = 62
    RAIL_ASSERT_INVALID_PA_OPERATION = 63
    RAIL_ASSERT_SEQ_INVALID_PA_SELECTED = 64
    RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG = 65
    RAIL_ASSERT_INVALID_XTAL_FREQUENCY = 66
    RAIL_ASSERT_INTERNAL_GENERIC_ERROR = 67
    RAIL_ASSERT_UNSUPPORTED_SOFTWARE_MODEM_MODULATION = 68
    RAIL_ASSERT_FAILED_RTCC_SYNC_STOP = 69
    RAIL_ASSERT_FAILED_MULTITIMER_CORRUPT = 70
    RAIL_ASSERT_FAILED_TEMPCAL_ERROR = 71
    RAIL_ASSERT_INVALID_VDET_CONFIGURATION = 72
    RAIL_ASSERT_INVALID_RFFPLL_CONFIGURATION = 73
    RAIL_ASSERT_SECURE_ACCESS_FAULT = 74
    RAIL_ASSERT_FAILED_SYSRTC0_NOT_RUNNING = 75
    RAIL_ASSERT_RADIO_CONFIG_NOT_UP_TO_DATE = 76
    RAIL_ASSERT_FAILED_RSSI_THRESHOLD = 77
    RAIL_ASSERT_INCORRECT_ZWAVE_REGION = 78
    RAIL_ASSERT_FAILED_RTCC_SYNC_STALE_DATA = 79
    RAIL_ASSERT_INVALID_LOG2X4_CLEAR_CONDITION = 80
    RAIL_ASSERT_FAILED_DMA_WRITE_INCOMPLETE = 81
    RAIL_ASSERT_CALCULATOR_NOT_SUPPORTED = 82
    RAIL_ASSERT_INVALID_SEQUENCER_IMAGE = 83
    RAIL_ASSERT_MISSING_SEQUENCER_IMAGE = 84
    RAIL_ASSERT_INVALID_OR_MISSING_SOFTWARE_MODEM_IMAGE = 85
    RAIL_ASSERT_SEQ_USER_SEQUENCER_GENERIC_ERROR = 86
    RAIL_ASSERT_SEQUENCE_TIMEOUT = 87
}
```

**Description:**

Enumeration of all possible error codes from RAIL_ASSERT.

**Enumerator:**

|   |   |
|---|---|
|RAIL_ASSERT_FAILED_APPENDED_INFO_MISSING|Appended info missing from RX packet.|
|RAIL_ASSERT_FAILED_RX_FIFO_BYTES|Receive FIFO too small for IR calibration.|
|RAIL_ASSERT_UNUSED_2|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_ILLEGAL_RXLEN_ENTRY_STATUS|Receive FIFO entry has invalid status.|
|RAIL_ASSERT_FAILED_BAD_PACKET_LENGTH|Receive FIFO entry bad packet length.|
|RAIL_ASSERT_FAILED_SYNTH_DIVCTRL_ENUM_CONVERSION_ERROR|Unable to configure radio for IR calibration.|
|RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO|Reached unexpected state while handling RX FIFO events.|
|RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RXLEN_FIFO|Reached unexpected state while handling RXLEN FIFO events.|
|RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO|Reached unexpected state while handling TX FIFO events.|
|RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TXACK_FIFO|Reached unexpected state while handling TX ACK FIFO events.|
|RAIL_ASSERT_INVALID_MEMORY_ACCESS|Invalid memory region accessed.|
|RAIL_ASSERT_FAILED_UNSUPPORTED_RX_DATA_SOURCE|Unsupported RX Data Source.|
|RAIL_ASSERT_UNUSED_12|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_RTCC_POST_WAKEUP|Error synchronizing the RAIL timebase after sleep.|
|RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY|VCO frequency outside supported range.|
|RAIL_ASSERT_FAILED_RAC_STATE|Radio active while changing channels.|
|RAIL_ASSERT_FAILED_SYNTH_INVALID_VCOCTRL|Invalid Synth VCOCTRL field calculation.|
|RAIL_ASSERT_FAILED_NESTED_SEQUENCER_LOCK|Nested attempt to lock the sequencer.|
|RAIL_ASSERT_FAILED_RSSI_AVERAGE_DONE|RSSI averaging enabled without a valid callback.|
|RAIL_ASSERT_UNUSED_19|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_PROTIMER_RANDOM_SEED|Unable to seed radio pseudo random number generator.|
|RAIL_ASSERT_UNUSED_21|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_PROTIMER_CHANNEL|Invalid timer channel specified.|
|RAIL_ASSERT_UNUSED_23|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_BASECNTTOP|LBT config exceeds register size.|
|RAIL_ASSERT_UNUSED_25|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_RTCC_SYNC_MISSED|Could not synchronize RAIL timebase with the RTC.|
|RAIL_ASSERT_FAILED_CLOCK_SOURCE_NOT_READY|Clock source not ready.|
|RAIL_ASSERT_UNUSED_28|Invalid assert, no longer used.|
|RAIL_ASSERT_NULL_HANDLE|NULL was supplied as a RAIL_Handle_t argument.|
|RAIL_ASSERT_UNUSED_30|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_NO_ACTIVE_CONFIG|API improperly called while protocol inactive.|
|RAIL_ASSERT_UNUSED_32|Invalid assert, no longer used.|
|RAIL_ASSERT_UNUSED_33|Invalid assert, no longer used.|
|RAIL_ASSERT_UNUSED_34|Invalid assert, no longer used.|
|RAIL_ASSERT_UNUSED_35|Invalid assert, no longer used.|
|RAIL_ASSERT_UNUSED_36|Invalid assert, no longer used.|
|RAIL_ASSERT_UNUSED_37|Invalid assert, no longer used.|
|RAIL_ASSERT_FAILED_TX_SYNTH_ENABLE|Failed to enable synth for transmit.|
|RAIL_ASSERT_DEPRECATED_FUNCTION|This function is deprecated and must not be called.|
|RAIL_ASSERT_MULTIPROTOCOL_NO_EVENT|Multiprotocol task started with no event to run.|
|RAIL_ASSERT_FAILED_INVALID_INTERRUPT_ENABLED|Invalid interrupt enabled.|
|RAIL_ASSERT_UNUSED_42|Invalid assert, no longer used.|
|RAIL_ASSERT_DIVISION_BY_ZERO|Division by zero.|
|RAIL_ASSERT_CANT_USE_HARDWARE|Function cannot be called without access to the hardware.|
|RAIL_ASSERT_NULL_PARAMETER|Pointer parameter was passed as NULL.|
|RAIL_ASSERT_SECURE_ELEMENT_FAULT|Secure Element fault.|
|RAIL_ASSERT_SMALL_SYNTH_RADIO_CONFIG_BUFFER|Synth radio config buffer for channel hopping too small.|
|RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT|Buffer provided for RX Channel Hopping is too small.|
|RAIL_ASSERT_INVALID_MODULE_ACTION|Invalid action was attempted on a module.|
|RAIL_ASSERT_CHANNEL_HOPPING_INVALID_RADIO_CONFIG|The radio config for this channel is not compatible with channel hopping.|
|RAIL_ASSERT_CHANNEL_CHANGE_FAILED|Channel change failed.|
|RAIL_ASSERT_INVALID_REGISTER|Attempted to read invalid register.|
|RAIL_ASSERT_CP_DMA_INTERNAL_GENERIC_ERROR|CP/DMA Invalid error.|
|RAIL_ASSERT_CACHE_CONFIG_FAILED|DMP radio config caching failed.|
|RAIL_ASSERT_NULL_TRANSITIONS|NULL was supplied as a [RAIL_StateTransitions_t](rail-state-transitions-t) argument.|
|RAIL_ASSERT_BAD_LDMA_TRANSFER|LDMA transfer failed.|
|RAIL_ASSERT_INVALID_RTCC_SYNC_VALUES|Attempted to wake up with invalid RTCC sync data.|
|RAIL_ASSERT_SEQUENCER_FAULT|Radio sequencer hit a fault condition.|
|RAIL_ASSERT_BUS_ERROR|Bus fault.|
|RAIL_ASSERT_INVALID_FILTERING_CONFIG|The current radio config cannot be used with packet filtering.|
|RAIL_ASSERT_RETIMING_CONFIG|Retiming configuration error.|
|RAIL_ASSERT_FAILED_TX_CRC_CONFIG|TX CRC configuration is corrupt.|
|RAIL_ASSERT_INVALID_PA_OPERATION|The current PA config does not allow for this operation.|
|RAIL_ASSERT_SEQ_INVALID_PA_SELECTED|The sequencer selected an invalid PA.|
|RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG|Invalid/unsupported channel config.|
|RAIL_ASSERT_INVALID_XTAL_FREQUENCY|Radio Calculator configuration HFXO frequency mismatch with chip.|
|RAIL_ASSERT_INTERNAL_GENERIC_ERROR|Internal error.|
|RAIL_ASSERT_UNSUPPORTED_SOFTWARE_MODEM_MODULATION|Software modem image does not support requested modulation <br />|
|RAIL_ASSERT_FAILED_RTCC_SYNC_STOP|Failed to disable RTCC synchronization.|
|RAIL_ASSERT_FAILED_MULTITIMER_CORRUPT|Multitimer linked list corrupted.|
|RAIL_ASSERT_FAILED_TEMPCAL_ERROR|Unable to configure radio for temperature calibration.|
|RAIL_ASSERT_INVALID_VDET_CONFIGURATION|Invalid VDET configuration.|
|RAIL_ASSERT_INVALID_RFFPLL_CONFIGURATION|Invalid RFFPLL configuration.|
|RAIL_ASSERT_SECURE_ACCESS_FAULT|Secure access fault.|
|RAIL_ASSERT_FAILED_SYSRTC0_NOT_RUNNING|SYSRTC0 not running.|
|RAIL_ASSERT_RADIO_CONFIG_NOT_UP_TO_DATE|Radio Configurator not updated.|
|RAIL_ASSERT_FAILED_RSSI_THRESHOLD|Failed to set the event for configurable RSSI threshold.|
|RAIL_ASSERT_INCORRECT_ZWAVE_REGION|Intended and actual Z-Wave region configuration mismatch.|
|RAIL_ASSERT_FAILED_RTCC_SYNC_STALE_DATA|Attempted to sleep with stale RTCC synchronization data.|
|RAIL_ASSERT_INVALID_LOG2X4_CLEAR_CONDITION|Attempted to clear LOG2X4 with a DEC1 value not equal to 0.|
|RAIL_ASSERT_FAILED_DMA_WRITE_INCOMPLETE|Failed to complete DMA write.|
|RAIL_ASSERT_CALCULATOR_NOT_SUPPORTED|RAIL does not support this Radio Calculator configuration.|
|RAIL_ASSERT_INVALID_SEQUENCER_IMAGE|Invalid binary image was loaded onto the sequencer.|
|RAIL_ASSERT_MISSING_SEQUENCER_IMAGE|No common or protocol image selected to be loaded onto the sequencer.|
|RAIL_ASSERT_INVALID_OR_MISSING_SOFTWARE_MODEM_IMAGE|Software modem image invalid or missing.|
|RAIL_ASSERT_SEQ_USER_SEQUENCER_GENERIC_ERROR|The sequencer user generated error.|
|RAIL_ASSERT_SEQUENCE_TIMEOUT|The sequence timed out.|

###### sl_rail_assert_error_codes_t

```
enum sl_rail_assert_error_codes_t {
    SL_RAIL_ASSERT_FAILED_APPENDED_INFO_MISSING = 0
    SL_RAIL_ASSERT_FAILED_RX_FIFO_BYTES = 1
    SL_RAIL_ASSERT_UNEXPECTED_REG_RESET_VALUE = 2
    SL_RAIL_ASSERT_FAILED_ILLEGAL_RXLEN_ENTRY_STATUS = 3
    SL_RAIL_ASSERT_FAILED_BAD_PACKET_LENGTH = 4
    SL_RAIL_ASSERT_FAILED_SYNTH_DIVCTRL_ENUM_CONVERSION_ERROR = 5
    SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO = 6
    SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RXLEN_FIFO = 7
    SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO = 8
    SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TXACK_FIFO = 9
    SL_RAIL_ASSERT_INVALID_MEMORY_ACCESS = 10
    SL_RAIL_ASSERT_FAILED_UNSUPPORTED_RX_DATA_SOURCE = 11
    SL_RAIL_ASSERT_UNUSED_12 = 12
    SL_RAIL_ASSERT_FAILED_RTCC_POST_WAKEUP = 13
    SL_RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY = 14
    SL_RAIL_ASSERT_FAILED_RAC_STATE = 15
    SL_RAIL_ASSERT_FAILED_SYNTH_INVALID_VCOCTRL = 16
    SL_RAIL_ASSERT_FAILED_NESTED_SEQUENCER_LOCK = 17
    SL_RAIL_ASSERT_FAILED_RSSI_AVERAGE_DONE = 18
    SL_RAIL_ASSERT_UNUSED_19 = 19
    SL_RAIL_ASSERT_FAILED_PROTIMER_RANDOM_SEED = 20
    SL_RAIL_ASSERT_UNUSED_21 = 21
    SL_RAIL_ASSERT_FAILED_PROTIMER_CHANNEL = 22
    SL_RAIL_ASSERT_UNUSED_23 = 23
    SL_RAIL_ASSERT_FAILED_BASECNTTOP = 24
    SL_RAIL_ASSERT_UNUSED_25 = 25
    SL_RAIL_ASSERT_FAILED_RTCC_SYNC_MISSED = 26
    SL_RAIL_ASSERT_FAILED_CLOCK_SOURCE_NOT_READY = 27
    SL_RAIL_ASSERT_UNUSED_28 = 28
    SL_RAIL_ASSERT_NULL_HANDLE = 29
    SL_RAIL_ASSERT_UNUSED_30 = 30
    SL_RAIL_ASSERT_FAILED_NO_ACTIVE_CONFIG = 31
    SL_RAIL_ASSERT_UNUSED_32 = 32
    SL_RAIL_ASSERT_UNUSED_33 = 33
    SL_RAIL_ASSERT_UNUSED_34 = 34
    SL_RAIL_ASSERT_UNUSED_35 = 35
    SL_RAIL_ASSERT_UNUSED_36 = 36
    SL_RAIL_ASSERT_SEQ_USER_SEQUENCER_PROTOCOL_TAKE_TOO_LONG = 37
    SL_RAIL_ASSERT_FAILED_TX_SYNTH_ENABLE = 38
    SL_RAIL_ASSERT_DEPRECATED_FUNCTION = 39
    SL_RAIL_ASSERT_MULTIPROTOCOL_NO_EVENT = 40
    SL_RAIL_ASSERT_FAILED_INVALID_INTERRUPT_ENABLED = 41
    SL_RAIL_ASSERT_UNUSED_42 = 42
    SL_RAIL_ASSERT_DIVISION_BY_ZERO = 43
    SL_RAIL_ASSERT_CANT_USE_HARDWARE = 44
    SL_RAIL_ASSERT_NULL_PARAMETER = 45
    SL_RAIL_ASSERT_SECURE_ELEMENT_FAULT = 46
    SL_RAIL_ASSERT_SMALL_SYNTH_RADIO_CONFIG_BUFFER = 47
    SL_RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT = 48
    SL_RAIL_ASSERT_INVALID_MODULE_ACTION = 49
    SL_RAIL_ASSERT_CHANNEL_HOPPING_INVALID_RADIO_CONFIG = 50
    SL_RAIL_ASSERT_CHANNEL_CHANGE_FAILED = 51
    SL_RAIL_ASSERT_INVALID_REGISTER = 52
    SL_RAIL_ASSERT_CP_DMA_INTERNAL_GENERIC_ERROR = 53
    SL_RAIL_ASSERT_CACHE_CONFIG_FAILED = 54
    SL_RAIL_ASSERT_NULL_TRANSITIONS = 55
    SL_RAIL_ASSERT_BAD_LDMA_TRANSFER = 56
    SL_RAIL_ASSERT_INVALID_RTCC_SYNC_VALUES = 57
    SL_RAIL_ASSERT_SEQUENCER_FAULT = 58
    SL_RAIL_ASSERT_BUS_ERROR = 59
    SL_RAIL_ASSERT_INVALID_FILTERING_CONFIG = 60
    SL_RAIL_ASSERT_RETIMING_CONFIG = 61
    SL_RAIL_ASSERT_FAILED_TX_CRC_CONFIG = 62
    SL_RAIL_ASSERT_INVALID_PA_OPERATION = 63
    SL_RAIL_ASSERT_SEQ_INVALID_PA_SELECTED = 64
    SL_RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG = 65
    SL_RAIL_ASSERT_INVALID_XTAL_FREQUENCY = 66
    SL_RAIL_ASSERT_INTERNAL_GENERIC_ERROR = 67
    SL_RAIL_ASSERT_UNSUPPORTED_SOFTWARE_MODEM_MODULATION = 68
    SL_RAIL_ASSERT_FAILED_RTCC_SYNC_STOP = 69
    SL_RAIL_ASSERT_FAILED_MULTITIMER_CORRUPT = 70
    SL_RAIL_ASSERT_FAILED_TEMPCAL_ERROR = 71
    SL_RAIL_ASSERT_INVALID_VDET_CONFIGURATION = 72
    SL_RAIL_ASSERT_INVALID_RFFPLL_CONFIGURATION = 73
    SL_RAIL_ASSERT_SECURE_ACCESS_FAULT = 74
    SL_RAIL_ASSERT_FAILED_SYSRTC0_NOT_RUNNING = 75
    SL_RAIL_ASSERT_RADIO_CONFIG_NOT_UP_TO_DATE = 76
    SL_RAIL_ASSERT_FAILED_RSSI_THRESHOLD = 77
    SL_RAIL_ASSERT_INCORRECT_ZWAVE_REGION = 78
    SL_RAIL_ASSERT_FAILED_RTCC_SYNC_STALE_DATA = 79
    SL_RAIL_ASSERT_INVALID_LOG2X4_CLEAR_CONDITION = 80
    SL_RAIL_ASSERT_FAILED_DMA_WRITE_INCOMPLETE = 81
    SL_RAIL_ASSERT_CALCULATOR_NOT_SUPPORTED = 82
    SL_RAIL_ASSERT_INVALID_SEQUENCER_IMAGE = 83
    SL_RAIL_ASSERT_MISSING_SEQUENCER_IMAGE = 84
    SL_RAIL_ASSERT_INVALID_OR_MISSING_SOFTWARE_MODEM_IMAGE = 85
    SL_RAIL_ASSERT_SEQ_USER_SEQUENCER_GENERIC_ERROR = 86
    SL_RAIL_ASSERT_SEQUENCE_TIMEOUT = 87
    SL_RAIL_ASSERT_SEQ_POWER_MANAGER_INVALID_REQUEST = 88
    SL_RAIL_ASSERT_SEQ_POWER_MANAGER_TOO_MANY_REQUESTS = 89
}
```

**Description:**

Enumeration of all possible error codes from SL_RAIL_ASSERT.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ASSERT_FAILED_APPENDED_INFO_MISSING|Appended info missing from RX packet.|
|SL_RAIL_ASSERT_FAILED_RX_FIFO_BYTES|Receive FIFO too small for IR calibration.|
|SL_RAIL_ASSERT_UNEXPECTED_REG_RESET_VALUE|Unexpected register reset value.|
|SL_RAIL_ASSERT_FAILED_ILLEGAL_RXLEN_ENTRY_STATUS|Receive FIFO entry has invalid status.|
|SL_RAIL_ASSERT_FAILED_BAD_PACKET_LENGTH|Receive FIFO entry bad packet length.|
|SL_RAIL_ASSERT_FAILED_SYNTH_DIVCTRL_ENUM_CONVERSION_ERROR|Unable to configure radio for IR calibration.|
|SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO|Reached unexpected state while handling RX FIFO events.|
|SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RXLEN_FIFO|Reached unexpected state while handling RXLEN FIFO events.|
|SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO|Reached unexpected state while handling TX FIFO events.|
|SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TXACK_FIFO|Reached unexpected state while handling TX ACK FIFO events.|
|SL_RAIL_ASSERT_INVALID_MEMORY_ACCESS|Invalid memory region accessed.|
|SL_RAIL_ASSERT_FAILED_UNSUPPORTED_RX_DATA_SOURCE|Unsupported RX Data Source.|
|SL_RAIL_ASSERT_UNUSED_12|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_RTCC_POST_WAKEUP|Error synchronizing the RAIL timebase after sleep.|
|SL_RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY|VCO frequency outside supported range.|
|SL_RAIL_ASSERT_FAILED_RAC_STATE|Radio active while changing channels.|
|SL_RAIL_ASSERT_FAILED_SYNTH_INVALID_VCOCTRL|Invalid Synth VCOCTRL field calculation.|
|SL_RAIL_ASSERT_FAILED_NESTED_SEQUENCER_LOCK|Nested attempt to lock the sequencer.|
|SL_RAIL_ASSERT_FAILED_RSSI_AVERAGE_DONE|RSSI averaging enabled without a valid callback.|
|SL_RAIL_ASSERT_UNUSED_19|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_PROTIMER_RANDOM_SEED|Unable to seed radio pseudo random number generator.|
|SL_RAIL_ASSERT_UNUSED_21|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_PROTIMER_CHANNEL|Invalid timer channel specified.|
|SL_RAIL_ASSERT_UNUSED_23|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_BASECNTTOP|LBT config exceeds register size.|
|SL_RAIL_ASSERT_UNUSED_25|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_RTCC_SYNC_MISSED|Could not synchronize RAIL timebase with the RTC.|
|SL_RAIL_ASSERT_FAILED_CLOCK_SOURCE_NOT_READY|Clock source not ready.|
|SL_RAIL_ASSERT_UNUSED_28|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_NULL_HANDLE|NULL was supplied as a sl_rail_handle_t argument.|
|SL_RAIL_ASSERT_UNUSED_30|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_FAILED_NO_ACTIVE_CONFIG|API improperly called while protocol inactive.|
|SL_RAIL_ASSERT_UNUSED_32|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_UNUSED_33|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_UNUSED_34|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_UNUSED_35|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_UNUSED_36|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_SEQ_USER_SEQUENCER_PROTOCOL_TAKE_TOO_LONG|Sequencer protocol stack running too long.|
|SL_RAIL_ASSERT_FAILED_TX_SYNTH_ENABLE|Failed to enable synth for transmit.|
|SL_RAIL_ASSERT_DEPRECATED_FUNCTION|This function is deprecated and must not be called.|
|SL_RAIL_ASSERT_MULTIPROTOCOL_NO_EVENT|Multiprotocol task started with no event to run.|
|SL_RAIL_ASSERT_FAILED_INVALID_INTERRUPT_ENABLED|Invalid interrupt enabled.|
|SL_RAIL_ASSERT_UNUSED_42|Invalid assert, no longer used.|
|SL_RAIL_ASSERT_DIVISION_BY_ZERO|Division by zero.|
|SL_RAIL_ASSERT_CANT_USE_HARDWARE|Function cannot be called without access to the hardware.|
|SL_RAIL_ASSERT_NULL_PARAMETER|Pointer parameter was passed as NULL.|
|SL_RAIL_ASSERT_SECURE_ELEMENT_FAULT|Secure Element fault.|
|SL_RAIL_ASSERT_SMALL_SYNTH_RADIO_CONFIG_BUFFER|Synth radio config buffer for channel hopping too small.|
|SL_RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT|Buffer provided for RX Channel Hopping is too small.|
|SL_RAIL_ASSERT_INVALID_MODULE_ACTION|Invalid action was attempted on a module.|
|SL_RAIL_ASSERT_CHANNEL_HOPPING_INVALID_RADIO_CONFIG|The radio config for this channel is not compatible with channel hopping.|
|SL_RAIL_ASSERT_CHANNEL_CHANGE_FAILED|Channel change failed.|
|SL_RAIL_ASSERT_INVALID_REGISTER|Attempted to read invalid register.|
|SL_RAIL_ASSERT_CP_DMA_INTERNAL_GENERIC_ERROR|CP/DMA Invalid error.|
|SL_RAIL_ASSERT_CACHE_CONFIG_FAILED|DMP radio config caching failed.|
|SL_RAIL_ASSERT_NULL_TRANSITIONS|NULL was supplied as a [sl_rail_state_transitions_t](sl-rail-state-transitions-t) argument.|
|SL_RAIL_ASSERT_BAD_LDMA_TRANSFER|LDMA transfer failed.|
|SL_RAIL_ASSERT_INVALID_RTCC_SYNC_VALUES|Attempted to wake up with invalid RTCC sync data.|
|SL_RAIL_ASSERT_SEQUENCER_FAULT|Radio sequencer hit a fault condition.|
|SL_RAIL_ASSERT_BUS_ERROR|Bus fault.|
|SL_RAIL_ASSERT_INVALID_FILTERING_CONFIG|The current radio config cannot be used with packet filtering.|
|SL_RAIL_ASSERT_RETIMING_CONFIG|Retiming configuration error.|
|SL_RAIL_ASSERT_FAILED_TX_CRC_CONFIG|TX CRC configuration is corrupt.|
|SL_RAIL_ASSERT_INVALID_PA_OPERATION|The current PA config does not allow for this operation.|
|SL_RAIL_ASSERT_SEQ_INVALID_PA_SELECTED|The sequencer selected an invalid PA.|
|SL_RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG|Invalid/unsupported channel config.|
|SL_RAIL_ASSERT_INVALID_XTAL_FREQUENCY|Radio Calculator configuration HFXO frequency mismatch with chip.|
|SL_RAIL_ASSERT_INTERNAL_GENERIC_ERROR|Internal error.|
|SL_RAIL_ASSERT_UNSUPPORTED_SOFTWARE_MODEM_MODULATION|Software modem image does not support requested modulation <br />|
|SL_RAIL_ASSERT_FAILED_RTCC_SYNC_STOP|Failed to disable RTCC synchronization.|
|SL_RAIL_ASSERT_FAILED_MULTITIMER_CORRUPT|Multitimer linked list corrupted.|
|SL_RAIL_ASSERT_FAILED_TEMPCAL_ERROR|Unable to configure radio for temperature calibration.|
|SL_RAIL_ASSERT_INVALID_VDET_CONFIGURATION|Invalid VDET configuration.|
|SL_RAIL_ASSERT_INVALID_RFFPLL_CONFIGURATION|Invalid RFFPLL configuration.|
|SL_RAIL_ASSERT_SECURE_ACCESS_FAULT|Secure access fault.|
|SL_RAIL_ASSERT_FAILED_SYSRTC0_NOT_RUNNING|SYSRTC0 not running.|
|SL_RAIL_ASSERT_RADIO_CONFIG_NOT_UP_TO_DATE|Radio Configurator not updated.|
|SL_RAIL_ASSERT_FAILED_RSSI_THRESHOLD|Failed to set the event for configurable RSSI threshold.|
|SL_RAIL_ASSERT_INCORRECT_ZWAVE_REGION|Intended and actual Z-Wave region configuration mismatch.|
|SL_RAIL_ASSERT_FAILED_RTCC_SYNC_STALE_DATA|Attempted to sleep with stale RTCC synchronization data.|
|SL_RAIL_ASSERT_INVALID_LOG2X4_CLEAR_CONDITION|Attempted to clear LOG2X4 with a DEC1 value not equal to 0.|
|SL_RAIL_ASSERT_FAILED_DMA_WRITE_INCOMPLETE|Failed to complete DMA write.|
|SL_RAIL_ASSERT_CALCULATOR_NOT_SUPPORTED|RAIL does not support this Radio Calculator configuration.|
|SL_RAIL_ASSERT_INVALID_SEQUENCER_IMAGE|Invalid binary image was loaded onto the sequencer.|
|SL_RAIL_ASSERT_MISSING_SEQUENCER_IMAGE|No common or protocol image selected to be loaded onto the sequencer.|
|SL_RAIL_ASSERT_INVALID_OR_MISSING_SOFTWARE_MODEM_IMAGE|Software modem image invalid or missing.|
|SL_RAIL_ASSERT_SEQ_USER_SEQUENCER_GENERIC_ERROR|The sequencer user generated error.|
|SL_RAIL_ASSERT_SEQUENCE_TIMEOUT|The sequence timed out.|
|SL_RAIL_ASSERT_SEQ_POWER_MANAGER_INVALID_REQUEST|Sequencer power manager received invalid request.|
|SL_RAIL_ASSERT_SEQ_POWER_MANAGER_TOO_MANY_REQUESTS|Sequencer power manager received too many requests.|

##### Functions

###### RAILCb_AssertFailed

`void RAILCb_AssertFailed(RAIL_Handle_t railHandle, RAIL_AssertErrorCodes_t errorCode)`

**Description:** Callback called upon failed assertion.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_AssertErrorCodes_t](assertions#rail-assert-error-codes-t)|[in]|errorCode|Value passed in by the calling assertion API indicating the RAIL assertion that failed.|

**Deprecated**This RAIL 2.x callback has been replaced in RAIL 3 by [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed) with an additional parameter. 

###### sl_railcb_assert_failed

`void sl_railcb_assert_failed(sl_rail_handle_t rail_handle, sl_rail_assert_error_codes_t error_code, int line)`

**Description:** Callback called upon failed assertion.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_assert_error_codes_t](assertions#sl-rail-assert-error-codes-t)|[in]|error_code|Value passed in by the calling assertion API indicating the RAIL assertion that failed.|
|int|[in]|line|An auxiliary value helping pinpoint which of several places the error_code assertion might have failed.|

##### Macros

`#define RAIL_ASSERT_ERROR_MESSAGES `

**Description**: Use this define to create an array of error messages that map to the codes in [RAIL_AssertErrorCodes_t](assertions#rail-assert-error-codes-t).

`#define SL_RAIL_ASSERT_ERROR_MESSAGES `

**Description**: Use this define to create an array of error messages that map to the codes in [sl_rail_assert_error_codes_t](assertions#sl-rail-assert-error-codes-t).

#### Events

APIs related to events. 

##### Enumerations

###### RAIL_Events_t

```
enum RAIL_Events_t {
    RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT = 0
    RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT = 1
    RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT = 2
    RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT = 3
    RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT = 4
    RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT = 5
    RAIL_EVENT_RX_SYNC1_DETECT_SHIFT = 6
    RAIL_EVENT_RX_SYNC2_DETECT_SHIFT = 7
    RAIL_EVENT_RX_FRAME_ERROR_SHIFT = 8
    RAIL_EVENT_RX_FIFO_FULL_SHIFT = 9
    RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT = 10
    RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT = 11
    RAIL_EVENT_RX_TIMEOUT_SHIFT = 12
    RAIL_EVENT_SCHEDULED_RX_STARTED_SHIFT = 13
    RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT = 14
    RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT = 15
    RAIL_EVENT_RX_PACKET_ABORTED_SHIFT = 16
    RAIL_EVENT_RX_FILTER_PASSED_SHIFT = 17
    RAIL_EVENT_RX_TIMING_LOST_SHIFT = 18
    RAIL_EVENT_RX_TIMING_DETECT_SHIFT = 19
    RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT = 20
    RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT = RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT
    RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT = 21
    RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT = RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT
    RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT = RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT
    RAIL_EVENT_ZWAVE_BEAM_SHIFT = 22
    RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT = 23
    RAIL_EVENT_TX_PACKET_SENT_SHIFT = 24
    RAIL_EVENT_TXACK_PACKET_SENT_SHIFT = 25
    RAIL_EVENT_TX_ABORTED_SHIFT = 26
    RAIL_EVENT_TXACK_ABORTED_SHIFT = 27
    RAIL_EVENT_TX_BLOCKED_SHIFT = 28
    RAIL_EVENT_TXACK_BLOCKED_SHIFT = 29
    RAIL_EVENT_TX_UNDERFLOW_SHIFT = 30
    RAIL_EVENT_TXACK_UNDERFLOW_SHIFT = 31
    RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT = 32
    RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT = 33
    RAIL_EVENT_TX_CCA_RETRY_SHIFT = 34
    RAIL_EVENT_TX_START_CCA_SHIFT = 35
    RAIL_EVENT_TX_STARTED_SHIFT = 36
    RAIL_EVENT_SCHEDULED_TX_STARTED_SHIFT = RAIL_EVENT_SCHEDULED_RX_STARTED_SHIFT
    RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT = 37
    RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT = 38
    RAIL_EVENT_CONFIG_SCHEDULED_SHIFT = 39
    RAIL_EVENT_SCHEDULER_STATUS_SHIFT = 40
    RAIL_EVENT_CAL_NEEDED_SHIFT = 41
    RAIL_EVENT_RF_SENSED_SHIFT = 42
    RAIL_EVENT_PA_PROTECTION_SHIFT = 43
    RAIL_EVENT_SIGNAL_DETECTED_SHIFT = 44
    RAIL_EVENT_IEEE802154_MODESWITCH_START_SHIFT = 45
    RAIL_EVENT_IEEE802154_MODESWITCH_END_SHIFT = 46
    RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT = 47
    RAIL_EVENT_THERMISTOR_DONE_SHIFT = 48
    RAIL_EVENT_TX_BLOCKED_TOO_HOT_SHIFT = 49
    RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT = 50
    RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT = 51
    RAIL_EVENT_USER_MBOX_SHIFT = 52
    RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT = 53
}
```

**Description:**

RAIL events passed to the event callback.

**Details:**

More than one event may be indicated due to interrupt latency.

**Deprecated**RAIL 2.x synonym of [sl_rail_events_t](events#sl-rail-events-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT|Shift position of [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done) bit.|
|RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT|Shift position of [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) bit.|
|RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT|Shift position of [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) bit.|
|RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT|Shift position of [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) bit.|
|RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT|Shift position of [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost) bit.|
|RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT|Shift position of [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect) bit.|
|RAIL_EVENT_RX_SYNC1_DETECT_SHIFT|Shift position of [RAIL_EVENT_RX_SYNC1_DETECT](events#rail-event-rx-sync1-detect) bit.|
|RAIL_EVENT_RX_SYNC2_DETECT_SHIFT|Shift position of [RAIL_EVENT_RX_SYNC2_DETECT](events#rail-event-rx-sync2-detect) bit.|
|RAIL_EVENT_RX_FRAME_ERROR_SHIFT|Shift position of [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error) bit.|
|RAIL_EVENT_RX_FIFO_FULL_SHIFT|Shift position of [RAIL_EVENT_RX_FIFO_FULL](events#rail-event-rx-fifo-full) bit.|
|RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT|Shift position of [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) bit.|
|RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT|Shift position of [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered) bit.|
|RAIL_EVENT_RX_TIMEOUT_SHIFT|Shift position of [RAIL_EVENT_RX_TIMEOUT](events#rail-event-rx-timeout) bit.|
|RAIL_EVENT_SCHEDULED_RX_STARTED_SHIFT|Shift position of [RAIL_EVENT_SCHEDULED_RX_STARTED](events#rail-event-scheduled-rx-started) bit.|
|RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT|Shift position of [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) bit.|
|RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT|Shift position of [RAIL_EVENT_RX_SCHEDULED_RX_MISSED](events#rail-event-rx-scheduled-rx-missed) bit.|
|RAIL_EVENT_RX_PACKET_ABORTED_SHIFT|Shift position of [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted) bit.|
|RAIL_EVENT_RX_FILTER_PASSED_SHIFT|Shift position of [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed) bit.|
|RAIL_EVENT_RX_TIMING_LOST_SHIFT|Shift position of [RAIL_EVENT_RX_TIMING_LOST](events#rail-event-rx-timing-lost) bit.|
|RAIL_EVENT_RX_TIMING_DETECT_SHIFT|Shift position of [RAIL_EVENT_RX_TIMING_DETECT](events#rail-event-rx-timing-detect) bit.|
|RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT|Shift position of [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete) bit.|
|RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT|Shift position of [RAIL_EVENT_RX_DUTY_CYCLE_RX_END](events#rail-event-rx-duty-cycle-rx-end) bit.|
|RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT|Shift position of [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) bit.|
|RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT|Shift position of [RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT](events#rail-event-zwave-lr-ack-request-command-shift) bit.|
|RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT|Shift position of [RAIL_EVENT_MFM_TX_BUFFER_DONE](events#rail-event-mfm-tx-buffer-done) bit.|
|RAIL_EVENT_ZWAVE_BEAM_SHIFT|Shift position of [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) bit.|
|RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT|Shift position of [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) bit.|
|RAIL_EVENT_TX_PACKET_SENT_SHIFT|Shift position of [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) bit.|
|RAIL_EVENT_TXACK_PACKET_SENT_SHIFT|Shift position of [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent) bit.|
|RAIL_EVENT_TX_ABORTED_SHIFT|Shift position of [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) bit.|
|RAIL_EVENT_TXACK_ABORTED_SHIFT|Shift position of [RAIL_EVENT_TXACK_ABORTED](events#rail-event-txack-aborted) bit.|
|RAIL_EVENT_TX_BLOCKED_SHIFT|Shift position of [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) bit.|
|RAIL_EVENT_TXACK_BLOCKED_SHIFT|Shift position of [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked) bit.|
|RAIL_EVENT_TX_UNDERFLOW_SHIFT|Shift position of [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) bit.|
|RAIL_EVENT_TXACK_UNDERFLOW_SHIFT|Shift position of [RAIL_EVENT_TXACK_UNDERFLOW](events#rail-event-txack-underflow) bit.|
|RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT|Shift position of [RAIL_EVENT_TX_CHANNEL_CLEAR](events#rail-event-tx-channel-clear) bit.|
|RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT|Shift position of [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy) bit.|
|RAIL_EVENT_TX_CCA_RETRY_SHIFT|Shift position of [RAIL_EVENT_TX_CCA_RETRY](events#rail-event-tx-cca-retry) bit.|
|RAIL_EVENT_TX_START_CCA_SHIFT|Shift position of [RAIL_EVENT_TX_START_CCA](events#rail-event-tx-start-cca) bit.|
|RAIL_EVENT_TX_STARTED_SHIFT|Shift position of [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) bit.|
|RAIL_EVENT_SCHEDULED_TX_STARTED_SHIFT|Shift position of [RAIL_EVENT_SCHEDULED_TX_STARTED](events#rail-event-scheduled-tx-started) bit.|
|RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT|Shift position of [RAIL_EVENT_TX_SCHEDULED_TX_MISSED](events#rail-event-tx-scheduled-tx-missed) bit.|
|RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT|Shift position of [RAIL_EVENT_CONFIG_UNSCHEDULED](events#rail-event-config-unscheduled) bit.|
|RAIL_EVENT_CONFIG_SCHEDULED_SHIFT|Shift position of [RAIL_EVENT_CONFIG_SCHEDULED](events#rail-event-config-scheduled) bit.|
|RAIL_EVENT_SCHEDULER_STATUS_SHIFT|Shift position of [RAIL_EVENT_SCHEDULER_STATUS](events#rail-event-scheduler-status) bit.|
|RAIL_EVENT_CAL_NEEDED_SHIFT|Shift position of [RAIL_EVENT_CAL_NEEDED](events#rail-event-cal-needed) bit.|
|RAIL_EVENT_RF_SENSED_SHIFT|Shift position of [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed) bit.|
|RAIL_EVENT_PA_PROTECTION_SHIFT|Shift position of [RAIL_EVENT_PA_PROTECTION](events#rail-event-pa-protection) bit.|
|RAIL_EVENT_SIGNAL_DETECTED_SHIFT|Shift position of [RAIL_EVENT_SIGNAL_DETECTED](events#rail-event-signal-detected) bit.|
|RAIL_EVENT_IEEE802154_MODESWITCH_START_SHIFT|Shift position of [RAIL_EVENT_IEEE802154_MODESWITCH_START](events#rail-event-ieee802154-modeswitch-start) bit.|
|RAIL_EVENT_IEEE802154_MODESWITCH_END_SHIFT|Shift position of [RAIL_EVENT_IEEE802154_MODESWITCH_END](events#rail-event-ieee802154-modeswitch-end) bit.|
|RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT|Shift position of [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) bit.|
|RAIL_EVENT_THERMISTOR_DONE_SHIFT|Shift position of [RAIL_EVENT_THERMISTOR_DONE](events#rail-event-thermistor-done) bit.|
|RAIL_EVENT_TX_BLOCKED_TOO_HOT_SHIFT|Shift position of [RAIL_EVENT_TX_BLOCKED_TOO_HOT](events#rail-event-tx-blocked-too-hot) bit.|
|RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT|Shift position of [RAIL_EVENT_TEMPERATURE_TOO_HOT](events#rail-event-temperature-too-hot) bit.|
|RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT|Shift position of [RAIL_EVENT_TEMPERATURE_COOL_DOWN](events#rail-event-temperature-cool-down) bit.|
|RAIL_EVENT_USER_MBOX_SHIFT|Shift position of [RAIL_EVENT_USER_MBOX](events#rail-event-user-mbox) bit.|
|RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT|Shift position of [RAIL_EVENT_TX_CCA_ACTIVATED](events#rail-event-tx-cca-activated) bit.|

###### sl_rail_events_t

```
enum sl_rail_events_t {
    SL_RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT = 0
    SL_RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT = 1
    SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT = 2
    SL_RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT = 3
    SL_RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT = 4
    SL_RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT = 5
    SL_RAIL_EVENT_RX_SYNC_0_DETECT_SHIFT = 6
    SL_RAIL_EVENT_RX_SYNC_1_DETECT_SHIFT = 7
    SL_RAIL_EVENT_RX_FRAME_ERROR_SHIFT = 8
    SL_RAIL_EVENT_RX_FIFO_FULL_SHIFT = 9
    SL_RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT = 10
    SL_RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT = 11
    SL_RAIL_EVENT_RX_TIMEOUT_SHIFT = 12
    SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED_SHIFT = 13
    SL_RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT = 14
    SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT = 15
    SL_RAIL_EVENT_RX_PACKET_ABORTED_SHIFT = 16
    SL_RAIL_EVENT_RX_FILTER_PASSED_SHIFT = 17
    SL_RAIL_EVENT_RX_TIMING_LOST_SHIFT = 18
    SL_RAIL_EVENT_RX_TIMING_DETECT_SHIFT = 19
    SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT = 20
    SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT = SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT
    SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT = 21
    SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT = SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT
    SL_RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT = SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT
    SL_RAIL_EVENT_ZWAVE_BEAM_SHIFT = 22
    SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT = 23
    SL_RAIL_EVENT_TX_PACKET_SENT_SHIFT = 24
    SL_RAIL_EVENT_TXACK_PACKET_SENT_SHIFT = 25
    SL_RAIL_EVENT_TX_ABORTED_SHIFT = 26
    SL_RAIL_EVENT_TXACK_ABORTED_SHIFT = 27
    SL_RAIL_EVENT_TX_BLOCKED_SHIFT = 28
    SL_RAIL_EVENT_TXACK_BLOCKED_SHIFT = 29
    SL_RAIL_EVENT_TX_UNDERFLOW_SHIFT = 30
    SL_RAIL_EVENT_TXACK_UNDERFLOW_SHIFT = 31
    SL_RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT = 32
    SL_RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT = 33
    SL_RAIL_EVENT_TX_CCA_RETRY_SHIFT = 34
    SL_RAIL_EVENT_TX_START_CCA_SHIFT = 35
    SL_RAIL_EVENT_TX_STARTED_SHIFT = 36
    SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED_SHIFT = SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED_SHIFT
    SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT = 37
    SL_RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT = 38
    SL_RAIL_EVENT_CONFIG_SCHEDULED_SHIFT = 39
    SL_RAIL_EVENT_SCHEDULER_STATUS_SHIFT = 40
    SL_RAIL_EVENT_CAL_NEEDED_SHIFT = 41
    SL_RAIL_EVENT_RF_SENSED_SHIFT = 42
    SL_RAIL_EVENT_PA_PROTECTION_SHIFT = 43
    SL_RAIL_EVENT_SIGNAL_DETECTED_SHIFT = 44
    SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START_SHIFT = 45
    SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END_SHIFT = 46
    SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT = 47
    SL_RAIL_EVENT_THERMISTOR_DONE_SHIFT = 48
    SL_RAIL_EVENT_RESERVED_49_SHIFT = 49
    SL_RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT = 50
    SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT = 51
    SL_RAIL_EVENT_USER_MBOX_SHIFT = 52
    SL_RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT = 53
    SL_RAIL_EVENT_RX_BLOCKED_SHIFT = 54
}
```

**Description:**

RAIL events passed to the event callback.

**Details:**

More than one event may be indicated due to interrupt latency.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT|Shift position of [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done) bit.|
|SL_RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout) bit.|
|SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT|Shift position of [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) bit.|
|SL_RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) bit.|
|SL_RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT|Shift position of [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost) bit.|
|SL_RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_PREAMBLE_DETECT](events#sl-rail-event-rx-preamble-detect) bit.|
|SL_RAIL_EVENT_RX_SYNC_0_DETECT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_SYNC_0_DETECT](events#sl-rail-event-rx-sync-0-detect) bit.|
|SL_RAIL_EVENT_RX_SYNC_1_DETECT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_SYNC_1_DETECT](events#sl-rail-event-rx-sync-1-detect) bit.|
|SL_RAIL_EVENT_RX_FRAME_ERROR_SHIFT|Shift position of [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error) bit.|
|SL_RAIL_EVENT_RX_FIFO_FULL_SHIFT|Shift position of [SL_RAIL_EVENT_RX_FIFO_FULL](events#sl-rail-event-rx-fifo-full) bit.|
|SL_RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT|Shift position of [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) bit.|
|SL_RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered) bit.|
|SL_RAIL_EVENT_RX_TIMEOUT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_TIMEOUT](events#sl-rail-event-rx-timeout) bit.|
|SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED](events#sl-rail-event-rx-scheduled-rx-started) bit.|
|SL_RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT|Shift position of [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) bit.|
|SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED](events#sl-rail-event-rx-scheduled-rx-missed) bit.|
|SL_RAIL_EVENT_RX_PACKET_ABORTED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted) bit.|
|SL_RAIL_EVENT_RX_FILTER_PASSED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed) bit.|
|SL_RAIL_EVENT_RX_TIMING_LOST_SHIFT|Shift position of [SL_RAIL_EVENT_RX_TIMING_LOST](events#sl-rail-event-rx-timing-lost) bit.|
|SL_RAIL_EVENT_RX_TIMING_DETECT_SHIFT|Shift position of [SL_RAIL_EVENT_RX_TIMING_DETECT](events#sl-rail-event-rx-timing-detect) bit.|
|SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT|Shift position of [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#sl-rail-event-rx-channel-hopping-complete) bit.|
|SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT|Shift position of [SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END](events#sl-rail-event-rx-duty-cycle-rx-end) bit.|
|SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT|Shift position of [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) bit.|
|SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT|Shift position of [SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT](events#sl-rail-event-zwave-lr-ack-request-command-shift) bit.|
|SL_RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT|Shift position of [SL_RAIL_EVENT_MFM_TX_BUFFER_DONE](events#sl-rail-event-mfm-tx-buffer-done) bit.|
|SL_RAIL_EVENT_ZWAVE_BEAM_SHIFT|Shift position of [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam) bit.|
|SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT|Shift position of [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) bit.|
|SL_RAIL_EVENT_TX_PACKET_SENT_SHIFT|Shift position of [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) bit.|
|SL_RAIL_EVENT_TXACK_PACKET_SENT_SHIFT|Shift position of [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent) bit.|
|SL_RAIL_EVENT_TX_ABORTED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted) bit.|
|SL_RAIL_EVENT_TXACK_ABORTED_SHIFT|Shift position of [SL_RAIL_EVENT_TXACK_ABORTED](events#sl-rail-event-txack-aborted) bit.|
|SL_RAIL_EVENT_TX_BLOCKED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked) bit.|
|SL_RAIL_EVENT_TXACK_BLOCKED_SHIFT|Shift position of [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked) bit.|
|SL_RAIL_EVENT_TX_UNDERFLOW_SHIFT|Shift position of [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) bit.|
|SL_RAIL_EVENT_TXACK_UNDERFLOW_SHIFT|Shift position of [SL_RAIL_EVENT_TXACK_UNDERFLOW](events#sl-rail-event-txack-underflow) bit.|
|SL_RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT|Shift position of [SL_RAIL_EVENT_TX_CHANNEL_CLEAR](events#sl-rail-event-tx-channel-clear) bit.|
|SL_RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT|Shift position of [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy) bit.|
|SL_RAIL_EVENT_TX_CCA_RETRY_SHIFT|Shift position of [SL_RAIL_EVENT_TX_CCA_RETRY](events#sl-rail-event-tx-cca-retry) bit.|
|SL_RAIL_EVENT_TX_START_CCA_SHIFT|Shift position of [SL_RAIL_EVENT_TX_START_CCA](events#sl-rail-event-tx-start-cca) bit.|
|SL_RAIL_EVENT_TX_STARTED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started) bit.|
|SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED](events#sl-rail-event-tx-scheduled-tx-started) bit.|
|SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED](events#sl-rail-event-tx-scheduled-tx-missed) bit.|
|SL_RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT|Shift position of [SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled) bit.|
|SL_RAIL_EVENT_CONFIG_SCHEDULED_SHIFT|Shift position of [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled) bit.|
|SL_RAIL_EVENT_SCHEDULER_STATUS_SHIFT|Shift position of [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) bit.|
|SL_RAIL_EVENT_CAL_NEEDED_SHIFT|Shift position of [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) bit.|
|SL_RAIL_EVENT_RF_SENSED_SHIFT|Shift position of [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed) bit.|
|SL_RAIL_EVENT_PA_PROTECTION_SHIFT|Shift position of [SL_RAIL_EVENT_PA_PROTECTION](events#sl-rail-event-pa-protection) bit.|
|SL_RAIL_EVENT_SIGNAL_DETECTED_SHIFT|Shift position of [SL_RAIL_EVENT_SIGNAL_DETECTED](events#sl-rail-event-signal-detected) bit.|
|SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START_SHIFT|Shift position of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START](events#sl-rail-event-ieee802154-mode-switch-start) bit.|
|SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END_SHIFT|Shift position of [SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END](events#sl-rail-event-ieee802154-mode-switch-end) bit.|
|SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT|Shift position of [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) bit.|
|SL_RAIL_EVENT_THERMISTOR_DONE_SHIFT|Shift position of [SL_RAIL_EVENT_THERMISTOR_DONE](events#sl-rail-event-thermistor-done) bit.|
|SL_RAIL_EVENT_RESERVED_49_SHIFT|Shift position of [SL_RAIL_EVENT_RESERVED_49](events#sl-rail-event-reserved-49) bit.|
|SL_RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT|Shift position of [SL_RAIL_EVENT_TEMPERATURE_TOO_HOT](events#sl-rail-event-temperature-too-hot) bit.|
|SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT|Shift position of [SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN](events#sl-rail-event-temperature-cool-down) bit.|
|SL_RAIL_EVENT_USER_MBOX_SHIFT|Shift position of [SL_RAIL_EVENT_USER_MBOX](events#sl-rail-event-user-mbox) bit.|
|SL_RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT|Shift position of [SL_RAIL_EVENT_TX_CCA_ACTIVATED](events#sl-rail-event-tx-cca-activated) bit.|
|SL_RAIL_EVENT_RX_BLOCKED_SHIFT|Shift position of [SL_RAIL_EVENT_RX_BLOCKED](events#sl-rail-event-rx-blocked) bit.|

##### Functions

###### RAIL_ConfigEvents

`RAIL_Status_t RAIL_ConfigEvents(RAIL_Handle_t railHandle, RAIL_Events_t mask, RAIL_Events_t events)`

**Description:** Configure radio events.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_Events_t](events#rail-events-t)|[in]|mask|A bitmask of events to configure.|
|[RAIL_Events_t](events#rail-events-t)|[in]|events|A bitmask of events to trigger [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback).|

**Returns**

- Status code indicating success of the function call.

Sets up which radio interrupts generate a RAIL event. The full list of events is in [RAIL_Events_t](events#rail-events-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_events()](events#sl-rail-config-events). 

###### sl_rail_config_events

`sl_rail_status_t sl_rail_config_events(sl_rail_handle_t rail_handle, sl_rail_events_t mask, sl_rail_events_t events)`

**Description:** Configure radio events.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_events_t](events#sl-rail-events-t)|[in]|mask|A bitmask of events to configure.|
|[sl_rail_events_t](events#sl-rail-events-t)|[in]|events|A bitmask of events to trigger [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback).|

**Returns**

- Status code indicating success of the function call.

Sets up which radio interrupts generate a RAIL event. The full list of events is in [sl_rail_events_t](events#sl-rail-events-t). 

###### sl_rail_get_events_config

`sl_rail_events_t sl_rail_get_events_config(sl_rail_handle_t rail_handle)`

**Description:** Get configured events.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- A [sl_rail_events_t](events#sl-rail-events-t) with bits set for enabled events and clear for disabled events.

##### Macros

`#define RAIL_EVENTS_NONE 0ULL`

**Description**: A value representing no events.

`#define RAIL_EVENT_RSSI_AVERAGE_DONE (1ULL << RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT)`

**Description**: Occurs when the hardware-averaged RSSI is done in response to [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) to indicate that the hardware has completed averaging.

`#define RAIL_EVENT_RX_ACK_TIMEOUT (1ULL << RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT)`

**Description**: Occurs when the Ack timeout expires while waiting to receive the sync word of an expected Ack.

`#define RAIL_EVENT_RX_FIFO_ALMOST_FULL (1ULL << RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT)`

**Description**: Keeps occurring as long as the number of bytes in the receive FIFO exceeds the configured threshold value.

`#define RAIL_EVENT_RX_PACKET_RECEIVED (1ULL << RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT)`

**Description**: Occurs whenever a packet is received with [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success) or [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error).

`#define RAIL_EVENT_RX_PREAMBLE_LOST (1ULL << RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT)`

**Description**: Occurs when the radio has lost a preamble.

`#define RAIL_EVENT_RX_PREAMBLE_DETECT (1ULL << RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT)`

**Description**: Occurs when the radio has detected a preamble.

`#define RAIL_EVENT_RX_SYNC1_DETECT (1ULL << RAIL_EVENT_RX_SYNC1_DETECT_SHIFT)`

**Description**: Occurs when the first sync word is detected.

`#define RAIL_EVENT_RX_SYNC2_DETECT (1ULL << RAIL_EVENT_RX_SYNC2_DETECT_SHIFT)`

**Description**: Occurs when the second sync word is detected.

`#define RAIL_EVENT_RX_FRAME_ERROR (1ULL << RAIL_EVENT_RX_FRAME_ERROR_SHIFT)`

**Description**: Occurs when a receive is aborted with [RAIL_RX_PACKET_ABORT_CRC_ERROR](receive#rail-rx-packet-abort-crc-error) which only happens after any filtering has passed.

`#define RAIL_EVENT_RX_FIFO_FULL (1ULL << RAIL_EVENT_RX_FIFO_FULL_SHIFT)`

**Description**: When using [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data) this event occurs coincident to a receive packet completion event in which the receive FIFO or any supplemental packet metadata FIFO (see [Data Management](data-management)) are full and further packet reception is jeopardized.

`#define RAIL_EVENT_RX_FIFO_OVERFLOW (1ULL << RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT)`

**Description**: When using [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data) this event occurs when a receive is aborted with [RAIL_RX_PACKET_ABORT_OVERFLOW](receive#rail-rx-packet-abort-overflow) due to overflowing the receive FIFO or any supplemental packet metadata FIFO (see [Data Management](data-management)).

`#define RAIL_EVENT_RX_ADDRESS_FILTERED (1ULL << RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT)`

**Description**: Occurs when a receive is aborted with [RAIL_RX_PACKET_ABORT_FILTERED](receive#rail-rx-packet-abort-filtered) because its address does not match the filtering settings.

`#define RAIL_EVENT_RX_TIMEOUT (1ULL << RAIL_EVENT_RX_TIMEOUT_SHIFT)`

**Description**: Occurs when an RX event times out.

`#define RAIL_EVENT_SCHEDULED_RX_STARTED (1ULL << RAIL_EVENT_SCHEDULED_RX_STARTED_SHIFT)`

**Description**: Occurs when a scheduled RX begins turning on the receiver.

`#define RAIL_EVENT_RX_SCHEDULED_RX_END (1ULL << RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT)`

**Description**: Occurs when the scheduled RX window ends.

`#define RAIL_EVENT_RX_SCHEDULED_RX_MISSED (1ULL << RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT)`

**Description**: Occurs when start of a scheduled receive is missed.

`#define RAIL_EVENT_RX_PACKET_ABORTED (1ULL << RAIL_EVENT_RX_PACKET_ABORTED_SHIFT)`

**Description**: Occurs when a receive is aborted during filtering with [RAIL_RX_PACKET_ABORT_FORMAT](receive#rail-rx-packet-abort-format) or after filtering with [RAIL_RX_PACKET_ABORT_ABORTED](receive#rail-rx-packet-abort-aborted) for reasons other than address filtering mismatch (which triggers [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered) instead).

`#define RAIL_EVENT_RX_FILTER_PASSED (1ULL << RAIL_EVENT_RX_FILTER_PASSED_SHIFT)`

**Description**: Occurs when the packet has passed any configured address and frame filtering options.

`#define RAIL_EVENT_RX_TIMING_LOST (1ULL << RAIL_EVENT_RX_TIMING_LOST_SHIFT)`

**Description**: Occurs when the modem timing is lost.

`#define RAIL_EVENT_RX_TIMING_DETECT (1ULL << RAIL_EVENT_RX_TIMING_DETECT_SHIFT)`

**Description**: Occurs when the modem timing is detected.

`#define RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE (1ULL << RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT)`

**Description**: Occurs when RX Channel Hopping is enabled and channel hopping finishes receiving on the last channel in its sequence.

`#define RAIL_EVENT_RX_DUTY_CYCLE_RX_END (1ULL << RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT)`

**Description**: Occurs during RX duty cycle mode when the radio finishes its time in receive mode.

`#define RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND (1ULL << RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT)`

**Description**: Indicate a Data Request is received when using IEEE 802.15.4 functionality.

`#define RAIL_EVENT_ZWAVE_BEAM (1ULL << RAIL_EVENT_ZWAVE_BEAM_SHIFT)`

**Description**: Indicate a Z-Wave Beam Request relevant to the node was received.

`#define RAIL_EVENT_MFM_TX_BUFFER_DONE (1ULL << RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT)`

**Description**: Indicate a MFM buffer has completely transmitted.

`#define RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND (1ULL << RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT)`

**Description**: Indicate a request for populating Z-Wave LR Ack packet.

`#define RAIL_EVENTS_RX_COMPLETION `

**Description**: The mask representing all events that determine the end of a received packet.

`#define RAIL_EVENT_TX_FIFO_ALMOST_EMPTY (1ULL << RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT)`

**Description**: Occurs when the number of bytes in the transmit FIFO falls below the configured threshold value.

`#define RAIL_EVENT_TX_PACKET_SENT (1ULL << RAIL_EVENT_TX_PACKET_SENT_SHIFT)`

**Description**: Occurs after a packet has been transmitted.

`#define RAIL_EVENT_TXACK_PACKET_SENT (1ULL << RAIL_EVENT_TXACK_PACKET_SENT_SHIFT)`

**Description**: Occurs after an Ack packet has been transmitted.

`#define RAIL_EVENT_TX_ABORTED (1ULL << RAIL_EVENT_TX_ABORTED_SHIFT)`

**Description**: Occurs when a transmit is aborted by the user.

`#define RAIL_EVENT_TXACK_ABORTED (1ULL << RAIL_EVENT_TXACK_ABORTED_SHIFT)`

**Description**: Occurs when an Ack transmit is aborted by the user.

`#define RAIL_EVENT_TX_BLOCKED (1ULL << RAIL_EVENT_TX_BLOCKED_SHIFT)`

**Description**: Occurs when a transmit is blocked from occurring because [RAIL_EnableTxHoldOff()](transmit#rail-enable-tx-hold-off) was called.

`#define RAIL_EVENT_TXACK_BLOCKED (1ULL << RAIL_EVENT_TXACK_BLOCKED_SHIFT)`

**Description**: Occurs when an Ack transmit is blocked from occurring because [RAIL_EnableTxHoldOff()](transmit#rail-enable-tx-hold-off) was called.

`#define RAIL_EVENT_TX_UNDERFLOW (1ULL << RAIL_EVENT_TX_UNDERFLOW_SHIFT)`

**Description**: Occurs when the transmit buffer underflows.

`#define RAIL_EVENT_TXACK_UNDERFLOW (1ULL << RAIL_EVENT_TXACK_UNDERFLOW_SHIFT)`

**Description**: Occurs when the Ack transmit buffer underflows.

`#define RAIL_EVENT_TX_CHANNEL_CLEAR (1ULL << RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT)`

**Description**: Occurs when Carrier Sense Multiple Access (CSMA) or Listen Before Talk (LBT) succeeds.

`#define RAIL_EVENT_TX_CHANNEL_BUSY (1ULL << RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT)`

**Description**: Occurs when Carrier Sense Multiple Access (CSMA) or Listen Before Talk (LBT) fails.

`#define RAIL_EVENT_TX_CCA_RETRY (1ULL << RAIL_EVENT_TX_CCA_RETRY_SHIFT)`

**Description**: Occurs during CSMA or LBT when an individual Clear Channel Assessment (CCA) check fails, but there are more tries needed before the overall operation completes.

`#define RAIL_EVENT_TX_START_CCA (1ULL << RAIL_EVENT_TX_START_CCA_SHIFT)`

**Description**: Occurs when the receiver is enabled to perform a Clear Channel Assessment (CCA) check.

`#define RAIL_EVENT_TX_CCA_ACTIVATED (1ULL << RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT)`

**Description**: Occurs when the a Clear Channel Assessment (CCA) check is activated.

`#define RAIL_EVENT_TX_STARTED (1ULL << RAIL_EVENT_TX_STARTED_SHIFT)`

**Description**: Occurs when the radio starts transmitting a normal packet on the air.

`#define RAIL_TX_STARTED_BYTES 0U`

**Description**: A value to pass as [RAIL_GetTxTimePreambleStart()](transmit#rail-get-tx-time-preamble-start) totalPacketBytes parameter to retrieve the [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) time stamp.

`#define RAIL_EVENT_SCHEDULED_TX_STARTED (1ULL << RAIL_EVENT_SCHEDULED_TX_STARTED_SHIFT)`

**Description**: Occurs when a scheduled TX begins turning on the transmitter.

`#define RAIL_EVENT_TX_SCHEDULED_TX_MISSED (1ULL << RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT)`

**Description**: Occurs when the start of a scheduled transmit is missed.

`#define RAIL_EVENTS_TX_COMPLETION `

**Description**: A mask representing all events that determine the end of a transmitted packet.

`#define RAIL_EVENTS_TXACK_COMPLETION `

**Description**: A mask representing all events that determine the end of a transmitted Ack packet.

`#define RAIL_EVENT_CONFIG_UNSCHEDULED (1ULL << RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT)`

**Description**: Occurs when the scheduler switches away from this configuration.

`#define RAIL_EVENT_CONFIG_SCHEDULED (1ULL << RAIL_EVENT_CONFIG_SCHEDULED_SHIFT)`

**Description**: Occurs when the scheduler switches to this configuration.

`#define RAIL_EVENT_SCHEDULER_STATUS (1ULL << RAIL_EVENT_SCHEDULER_STATUS_SHIFT)`

**Description**: Occurs when the scheduler has a status to report.

`#define RAIL_EVENT_CAL_NEEDED (1ULL << RAIL_EVENT_CAL_NEEDED_SHIFT)`

**Description**: Occurs when the application needs to run a calibration, as determined by the RAIL library.

`#define RAIL_EVENT_RF_SENSED (1ULL << RAIL_EVENT_RF_SENSED_SHIFT)`

**Description**: Occurs when RF energy is sensed from the radio.

`#define RAIL_EVENT_PA_PROTECTION (1ULL << RAIL_EVENT_PA_PROTECTION_SHIFT)`

**Description**: Occurs when PA protection circuit kicks in.

`#define RAIL_EVENT_SIGNAL_DETECTED (1ULL << RAIL_EVENT_SIGNAL_DETECTED_SHIFT)`

**Description**: Occurs after enabling the signal detection using [RAIL_BLE_EnableSignalDetection()](ble#rail-ble-enable-signal-detection) or [RAIL_IEEE802154_EnableSignalDetection()](ieee802-15-4#rail-ieee802154-enable-signal-detection) when a signal is detected.

`#define RAIL_EVENT_IEEE802154_MODESWITCH_START (1ULL << RAIL_EVENT_IEEE802154_MODESWITCH_START_SHIFT)`

**Description**: Occurs when a Wi-SUN mode switch packet has been received, after switching to the new PHY.

`#define RAIL_EVENT_IEEE802154_MODESWITCH_END (1ULL << RAIL_EVENT_IEEE802154_MODESWITCH_END_SHIFT)`

**Description**: Occurs when switching back to the original base PHY in effect prior to the Wi-SUN mode switch reception.

`#define RAIL_EVENT_DETECT_RSSI_THRESHOLD (1ULL << RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT)`

**Description**: Occurs when the sampled RSSI is above the threshold set by [RAIL_SetRssiDetectThreshold()](receive#rail-set-rssi-detect-threshold).

`#define RAIL_EVENT_THERMISTOR_DONE (1ULL << RAIL_EVENT_THERMISTOR_DONE_SHIFT)`

**Description**: Occurs when the thermistor has finished its measurement in response to [RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement).

`#define RAIL_EVENT_TX_BLOCKED_TOO_HOT (1ULL << RAIL_EVENT_TX_BLOCKED_TOO_HOT_SHIFT)`

**Description**: Occurs when a Tx has been blocked because of temperature exceeding the safety threshold.

`#define RAIL_EVENT_TEMPERATURE_TOO_HOT (1ULL << RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT)`

**Description**: Occurs when die internal temperature exceeds the temperature threshold subtracted by the cool down parameter from [RAIL_ChipTempConfig_t](rail-chip-temp-config-t).

`#define RAIL_EVENT_TEMPERATURE_COOL_DOWN (1ULL << RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT)`

**Description**: Occurs when die internal temperature falls below the temperature threshold subtracted by the cool down parameter from [RAIL_ChipTempConfig_t](rail-chip-temp-config-t).

`#define RAIL_EVENT_USER_MBOX (1ULL << RAIL_EVENT_USER_MBOX_SHIFT)`

**Description**: Occurs when the user received a mailbox message.

`#define RAIL_EVENTS_ALL 0xFFFFFFFFFFFFFFFFULL`

**Description**: A value representing all possible events.

`#define SL_RAIL_EVENTS_NONE 0ULL`

**Description**: A value representing no events.

`#define SL_RAIL_EVENT_RSSI_AVERAGE_DONE (1ULL << SL_RAIL_EVENT_RSSI_AVERAGE_DONE_SHIFT)`

**Description**: Occurs when the hardware-averaged RSSI is done in response to [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi) to indicate that the hardware has completed averaging.

`#define SL_RAIL_EVENT_RX_ACK_TIMEOUT (1ULL << SL_RAIL_EVENT_RX_ACK_TIMEOUT_SHIFT)`

**Description**: Occurs when the Ack timeout expires while waiting to receive the sync word of an expected Ack.

`#define SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL (1ULL << SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL_SHIFT)`

**Description**: Keeps occurring as long as the number of bytes in the receive FIFO exceeds the configured threshold value.

`#define SL_RAIL_EVENT_RX_PACKET_RECEIVED (1ULL << SL_RAIL_EVENT_RX_PACKET_RECEIVED_SHIFT)`

**Description**: Occurs whenever a packet is received with [SL_RAIL_RX_PACKET_READY_SUCCESS](receive#sl-rail-rx-packet-ready-success) or [SL_RAIL_RX_PACKET_READY_CRC_ERROR](receive#sl-rail-rx-packet-ready-crc-error).

`#define SL_RAIL_EVENT_RX_PREAMBLE_LOST (1ULL << SL_RAIL_EVENT_RX_PREAMBLE_LOST_SHIFT)`

**Description**: Occurs when the radio has lost a preamble.

`#define SL_RAIL_EVENT_RX_PREAMBLE_DETECT (1ULL << SL_RAIL_EVENT_RX_PREAMBLE_DETECT_SHIFT)`

**Description**: Occurs when the radio has detected a preamble.

`#define SL_RAIL_EVENT_RX_SYNC_0_DETECT (1ULL << SL_RAIL_EVENT_RX_SYNC_0_DETECT_SHIFT)`

**Description**: Occurs when the primary sync word is detected.

`#define SL_RAIL_EVENT_RX_SYNC_1_DETECT (1ULL << SL_RAIL_EVENT_RX_SYNC_1_DETECT_SHIFT)`

**Description**: Occurs when the alternate sync word is detected.

`#define SL_RAIL_EVENT_RX_FRAME_ERROR (1ULL << SL_RAIL_EVENT_RX_FRAME_ERROR_SHIFT)`

**Description**: Occurs when a receive is aborted with [SL_RAIL_RX_PACKET_ABORT_CRC_ERROR](receive#sl-rail-rx-packet-abort-crc-error) which only happens after any filtering has passed.

`#define SL_RAIL_EVENT_RX_FIFO_FULL (1ULL << SL_RAIL_EVENT_RX_FIFO_FULL_SHIFT)`

**Description**: When using [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) this event occurs coincident to a receive packet completion event in which the receive FIFO or the supplemental receive Packet Queue (see [Data Management](data-management)) are full and further packet reception is jeopardized.

`#define SL_RAIL_EVENT_RX_FIFO_OVERFLOW (1ULL << SL_RAIL_EVENT_RX_FIFO_OVERFLOW_SHIFT)`

**Description**: When using [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) this event occurs when a receive is aborted with [SL_RAIL_RX_PACKET_ABORT_OVERFLOW](receive#sl-rail-rx-packet-abort-overflow) due to overflowing the receive FIFO or the supplemental receive Packet Queue (see [Data Management](data-management)).

`#define SL_RAIL_EVENT_RX_ADDRESS_FILTERED (1ULL << SL_RAIL_EVENT_RX_ADDRESS_FILTERED_SHIFT)`

**Description**: Occurs when a receive is aborted with [SL_RAIL_RX_PACKET_ABORT_FILTERED](receive#sl-rail-rx-packet-abort-filtered) because its address does not match the filtering settings.

`#define SL_RAIL_EVENT_RX_TIMEOUT (1ULL << SL_RAIL_EVENT_RX_TIMEOUT_SHIFT)`

**Description**: Occurs when an RX event times out.

`#define SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED (1ULL << SL_RAIL_EVENT_RX_SCHEDULED_RX_STARTED_SHIFT)`

**Description**: Occurs when a scheduled RX begins turning on the receiver.

`#define SL_RAIL_EVENT_RX_BLOCKED (1ULL << SL_RAIL_EVENT_RX_BLOCKED_SHIFT)`

**Description**: Occurs when the receiver has been blocked due to radio arbitration.

`#define SL_RAIL_EVENT_RX_SCHEDULED_RX_END (1ULL << SL_RAIL_EVENT_RX_SCHEDULED_RX_END_SHIFT)`

**Description**: Occurs when the scheduled RX window ends.

`#define SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED (1ULL << SL_RAIL_EVENT_RX_SCHEDULED_RX_MISSED_SHIFT)`

**Description**: Occurs when start of a scheduled receive is missed.

`#define SL_RAIL_EVENT_RX_PACKET_ABORTED (1ULL << SL_RAIL_EVENT_RX_PACKET_ABORTED_SHIFT)`

**Description**: Occurs when a receive is aborted during filtering with [SL_RAIL_RX_PACKET_ABORT_FORMAT](receive#sl-rail-rx-packet-abort-format) or after filtering with [SL_RAIL_RX_PACKET_ABORT_ABORTED](receive#sl-rail-rx-packet-abort-aborted) for reasons other than address filtering mismatch (which triggers [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered) instead).

`#define SL_RAIL_EVENT_RX_FILTER_PASSED (1ULL << SL_RAIL_EVENT_RX_FILTER_PASSED_SHIFT)`

**Description**: Occurs when the packet has passed any configured address and frame filtering options.

`#define SL_RAIL_EVENT_RX_TIMING_LOST (1ULL << SL_RAIL_EVENT_RX_TIMING_LOST_SHIFT)`

**Description**: Occurs when the modem timing is lost.

`#define SL_RAIL_EVENT_RX_TIMING_DETECT (1ULL << SL_RAIL_EVENT_RX_TIMING_DETECT_SHIFT)`

**Description**: Occurs when the modem timing is detected.

`#define SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE (1ULL << SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE_SHIFT)`

**Description**: Occurs when RX Channel Hopping is enabled and channel hopping finishes receiving on the last channel in its sequence.

`#define SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END (1ULL << SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END_SHIFT)`

**Description**: Occurs during RX duty cycle mode when the radio finishes its time in receive mode.

`#define SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND (1ULL << SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND_SHIFT)`

**Description**: Indicate a Data Request is received when using IEEE 802.15.4 functionality.

`#define SL_RAIL_EVENT_ZWAVE_BEAM (1ULL << SL_RAIL_EVENT_ZWAVE_BEAM_SHIFT)`

**Description**: Indicate a Z-Wave Beam Request relevant to the node was received.

`#define SL_RAIL_EVENT_MFM_TX_BUFFER_DONE (1ULL << SL_RAIL_EVENT_MFM_TX_BUFFER_DONE_SHIFT)`

**Description**: Indicate a MFM buffer has completely transmitted.

`#define SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND (1ULL << SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND_SHIFT)`

**Description**: Indicate a request for populating Z-Wave LR Ack packet.

`#define SL_RAIL_EVENTS_RX_COMPLETION `

**Description**: The mask representing all events that determine the end of a received packet.

`#define SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY (1ULL << SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY_SHIFT)`

**Description**: Occurs when the number of bytes in the transmit FIFO falls below the configured threshold value.

`#define SL_RAIL_EVENT_TX_PACKET_SENT (1ULL << SL_RAIL_EVENT_TX_PACKET_SENT_SHIFT)`

**Description**: Occurs after a packet has been transmitted.

`#define SL_RAIL_EVENT_TXACK_PACKET_SENT (1ULL << SL_RAIL_EVENT_TXACK_PACKET_SENT_SHIFT)`

**Description**: Occurs after an Ack packet has been transmitted.

`#define SL_RAIL_EVENT_TX_ABORTED (1ULL << SL_RAIL_EVENT_TX_ABORTED_SHIFT)`

**Description**: Occurs when a transmit is aborted by the user.

`#define SL_RAIL_EVENT_TXACK_ABORTED (1ULL << SL_RAIL_EVENT_TXACK_ABORTED_SHIFT)`

**Description**: Occurs when an Ack transmit is aborted by the user.

`#define SL_RAIL_EVENT_TX_BLOCKED (1ULL << SL_RAIL_EVENT_TX_BLOCKED_SHIFT)`

**Description**: Occurs when a transmit is blocked from occurring because [sl_rail_enable_tx_hold_off()](transmit#sl-rail-enable-tx-hold-off) was called.

`#define SL_RAIL_EVENT_TXACK_BLOCKED (1ULL << SL_RAIL_EVENT_TXACK_BLOCKED_SHIFT)`

**Description**: Occurs when an Ack transmit is blocked from occurring because [sl_rail_enable_tx_hold_off()](transmit#sl-rail-enable-tx-hold-off) was called.

`#define SL_RAIL_EVENT_TX_UNDERFLOW (1ULL << SL_RAIL_EVENT_TX_UNDERFLOW_SHIFT)`

**Description**: Occurs when the transmit buffer underflows.

`#define SL_RAIL_EVENT_TXACK_UNDERFLOW (1ULL << SL_RAIL_EVENT_TXACK_UNDERFLOW_SHIFT)`

**Description**: Occurs when the Ack transmit buffer underflows.

`#define SL_RAIL_EVENT_TX_CHANNEL_CLEAR (1ULL << SL_RAIL_EVENT_TX_CHANNEL_CLEAR_SHIFT)`

**Description**: Occurs when Carrier Sense Multiple Access (CSMA) or Listen Before Talk (LBT) succeeds.

`#define SL_RAIL_EVENT_TX_CHANNEL_BUSY (1ULL << SL_RAIL_EVENT_TX_CHANNEL_BUSY_SHIFT)`

**Description**: Occurs when Carrier Sense Multiple Access (CSMA) or Listen Before Talk (LBT) fails.

`#define SL_RAIL_EVENT_TX_CCA_RETRY (1ULL << SL_RAIL_EVENT_TX_CCA_RETRY_SHIFT)`

**Description**: Occurs during CSMA or LBT when an individual Clear Channel Assessment (CCA) check fails, but there are more tries needed before the overall operation completes.

`#define SL_RAIL_EVENT_TX_START_CCA (1ULL << SL_RAIL_EVENT_TX_START_CCA_SHIFT)`

**Description**: Occurs when the receiver is enabled to perform a Clear Channel Assessment (CCA) check.

`#define SL_RAIL_EVENT_TX_CCA_ACTIVATED (1ULL << SL_RAIL_EVENT_TX_CCA_ACTIVATED_SHIFT)`

**Description**: Occurs when the a Clear Channel Assessment (CCA) check is activated.

`#define SL_RAIL_EVENT_TX_STARTED (1ULL << SL_RAIL_EVENT_TX_STARTED_SHIFT)`

**Description**: Occurs when the radio starts transmitting a normal packet on the air.

`#define SL_RAIL_TX_STARTED_BYTES 0U`

**Description**: A value to pass as [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start) total_packet_bytes parameter to retrieve the [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started) time stamp.

`#define SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED (1ULL << SL_RAIL_EVENT_TX_SCHEDULED_TX_STARTED_SHIFT)`

**Description**: Occurs when a scheduled TX begins turning on the transmitter.

`#define SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED (1ULL << SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED_SHIFT)`

**Description**: Occurs when the start of a scheduled transmit is missed.

`#define SL_RAIL_EVENTS_TX_COMPLETION `

**Description**: A mask representing all events that determine the end of a transmitted packet.

`#define SL_RAIL_EVENTS_TXACK_COMPLETION `

**Description**: A mask representing all events that determine the end of a transmitted Ack packet.

`#define SL_RAIL_EVENT_CONFIG_UNSCHEDULED (1ULL << SL_RAIL_EVENT_CONFIG_UNSCHEDULED_SHIFT)`

**Description**: Occurs when the scheduler switches away from this configuration.

`#define SL_RAIL_EVENT_CONFIG_SCHEDULED (1ULL << SL_RAIL_EVENT_CONFIG_SCHEDULED_SHIFT)`

**Description**: Occurs when the scheduler switches to this configuration.

`#define SL_RAIL_EVENT_SCHEDULER_STATUS (1ULL << SL_RAIL_EVENT_SCHEDULER_STATUS_SHIFT)`

**Description**: Occurs when the scheduler has a status to report.

`#define SL_RAIL_EVENT_CAL_NEEDED (1ULL << SL_RAIL_EVENT_CAL_NEEDED_SHIFT)`

**Description**: Occurs when the application needs to run a calibration, as determined by the RAIL library.

`#define SL_RAIL_EVENT_RF_SENSED (1ULL << SL_RAIL_EVENT_RF_SENSED_SHIFT)`

**Description**: Occurs when RF energy is sensed from the radio.

`#define SL_RAIL_EVENT_PA_PROTECTION (1ULL << SL_RAIL_EVENT_PA_PROTECTION_SHIFT)`

**Description**: Occurs when PA protection circuit kicks in.

`#define SL_RAIL_EVENT_SIGNAL_DETECTED (1ULL << SL_RAIL_EVENT_SIGNAL_DETECTED_SHIFT)`

**Description**: Occurs after enabling the signal detection using [sl_rail_ble_enable_signal_detection()](ble#sl-rail-ble-enable-signal-detection) or [sl_rail_ieee802154_enable_signal_detection()](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection) when a signal is detected.

`#define SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START (1ULL << SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_START_SHIFT)`

**Description**: Occurs when a Wi-SUN mode switch packet has been received, after switching to the new PHY.

`#define SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END (1ULL << SL_RAIL_EVENT_IEEE802154_MODE_SWITCH_END_SHIFT)`

**Description**: Occurs when switching back to the original base PHY in effect prior to the Wi-SUN mode switch reception.

`#define SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD (1ULL << SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD_SHIFT)`

**Description**: Occurs when the sampled RSSI is above the threshold set by [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold).

`#define SL_RAIL_EVENT_THERMISTOR_DONE (1ULL << SL_RAIL_EVENT_THERMISTOR_DONE_SHIFT)`

**Description**: Occurs when the thermistor has finished its measurement in response to [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement).

`#define SL_RAIL_EVENT_RESERVED_49 (1ULL << SL_RAIL_EVENT_RESERVED_49_SHIFT)`

**Description**: Reserved for possible future use.

`#define SL_RAIL_EVENT_TEMPERATURE_TOO_HOT (1ULL << SL_RAIL_EVENT_TEMPERATURE_TOO_HOT_SHIFT)`

**Description**: Occurs when die internal temperature exceeds the temperature threshold subtracted by the cool down parameter from [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t).

`#define SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN (1ULL << SL_RAIL_EVENT_TEMPERATURE_COOL_DOWN_SHIFT)`

**Description**: Occurs when die internal temperature falls below the temperature threshold subtracted by the cool down parameter from [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t).

`#define SL_RAIL_EVENT_USER_MBOX (1ULL << SL_RAIL_EVENT_USER_MBOX_SHIFT)`

**Description**: Occurs when the user received a mailbox message.

`#define SL_RAIL_EVENTS_ALL 0xFFFFFFFFFFFFFFFFULL`

**Description**: A value representing all possible events.

#### Features

Overview of support for various features across hardware platforms. 

These defines can be used at compile time to determine which features are available on your platform. However, keep in mind that these defines hold true for chip families. Your specific part may have further restrictions (band limitations, power amplifier restrictions, and so on) on top of those listed below, for which runtime RAIL_*Supports*() APIs can be used to check availability on a particular chip (after [RAIL_Init()](general#rail-init) has been called). In general, an attempt to call an API that is not supported on your chip family as listed below will result in a [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

These defines can be used at compile time to determine which features are available on your platform. However, keep in mind that these defines hold true for chip families. Your specific part may have further restrictions (band limitations, power amplifier restrictions, and so on) on top of those listed below, for which runtime sl_rail_*supports*() APIs can be used to check availability on a particular chip (after [sl_rail_init()](general#sl-rail-init) has been called). In general, an attempt to call an API that is not supported on your chip family as listed below will result in a [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call). 

##### Functions

###### RAIL_Supports2p4GHzBand

`bool RAIL_Supports2p4GHzBand(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports 2.4 GHz band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 2.4 GHz band is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_2P4GHZ_BAND](features#rail-supports-2-p4-ghz-band).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_2p4_ghz_band()](features#sl-rail-supports-2p4-ghz-band). 

###### RAIL_SupportsSubGHzBand

`bool RAIL_SupportsSubGHzBand(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports SubGHz band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the SubGHz band is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_SUBGHZ_BAND](features#rail-supports-subghz-band).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_sub_ghz_band()](features#sl-rail-supports-sub-ghz-band). 

###### RAIL_SupportsDualBand

`bool RAIL_SupportsDualBand(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports dual 2.4 GHz and SubGHz band operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the dual band is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_DUAL_BAND](features#rail-supports-dual-band-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_dual_band()](features#sl-rail-supports-dual-band). 

###### RAIL_SupportsAddrFilterAddressBitMask

`bool RAIL_SupportsAddrFilterAddressBitMask(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports bit masked address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if bit masked address filtering is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#rail-supports-addr-filter-address-bit-mask-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_addr_filter_address_bit_mask()](features#sl-rail-supports-addr-filter-address-bit-mask). 

###### RAIL_SupportsAddrFilterMask

`bool RAIL_SupportsAddrFilterMask(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports address filter mask information for incoming packets in [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) and [RAIL_IEEE802154_Address_t::filterMask](rail-ieee802154-address-t#filter-mask).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if address filter information is supported; false otherwise (in which case [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) value is undefined).

Runtime refinement of compile-time [RAIL_SUPPORTS_ADDR_FILTER_MASK](features#rail-supports-addr-filter-mask-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_addr_filter_mask()](features#sl-rail-supports-addr-filter-mask). 

###### RAIL_SupportsAlternateTxPower

`bool RAIL_SupportsAlternateTxPower(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports alternate TX power settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if alternate TX power settings are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#rail-supports-alternate-tx-power-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_alternate_tx_power()](features#sl-rail-supports-alternate-tx-power). 

###### RAIL_SupportsAntennaDiversity

`bool RAIL_SupportsAntennaDiversity(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports antenna diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if antenna diversity is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_antenna_diversity()](features#sl-rail-supports-antenna-diversity). 

###### RAIL_SupportsPathDiversity

`bool RAIL_SupportsPathDiversity(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports internal RF path diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF path diversity is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PATH_DIVERSITY](features#rail-supports-path-diversity-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_path_diversity()](features#sl-rail-supports-path-diversity). 

###### RAIL_SupportsAuxAdc

`bool RAIL_SupportsAuxAdc(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports AUXADC measurements on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if AUXADC measurements are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_AUXADC](features#rail-supports-auxadc).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_aux_adc()](features#sl-rail-supports-aux-adc). 

###### RAIL_SupportsChannelHopping

`bool RAIL_SupportsChannelHopping(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports channel hopping on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if channel hopping is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping). 

###### RAIL_SupportsDirectMode

`bool RAIL_SupportsDirectMode(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports direct mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_DIRECT_MODE](features#rail-supports-direct-mode-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_direct_mode()](features#sl-rail-supports-direct-mode). 

###### RAIL_SupportsDualSyncWords

`bool RAIL_SupportsDualSyncWords(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports dual sync words.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if dual sync words are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_DUAL_SYNC_WORDS](features#rail-supports-dual-sync-words-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_dual_sync_words()](features#sl-rail-supports-dual-sync-words). 

###### RAIL_SupportsTxRepeatStartToStart

`bool RAIL_SupportsTxRepeatStartToStart(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports start to start TX repeats.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if start to start TX repeats are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_TX_REPEAT_START_TO_START](features#rail-supports-tx-repeat-start-to-start-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_tx_repeat_start_to_start()](features#sl-rail-supports-tx-repeat-start-to-start). 

###### RAIL_SupportsVdet

`bool RAIL_SupportsVdet(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports VDET.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if VDET is supported; false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_vdet()](features#sl-rail-supports-vdet). 

###### RAIL_SupportsExternalThermistor

`bool RAIL_SupportsExternalThermistor(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports thermistor measurements on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if thermistor measurements are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#rail-supports-external-thermistor-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_external_thermistor()](features#sl-rail-supports-external-thermistor). 

###### RAIL_SupportsHFXOCompensation

`bool RAIL_SupportsHFXOCompensation(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports HFXO compensation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if HFXO compensation is supported and [RAIL_ConfigHFXOThermistor()](external-thermistor#rail-config-hfxo-thermistor) has been successfully called; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_hfxo_compensation()](features#sl-rail-supports-hfxo-compensation). 

###### RAIL_SupportsMfm

`bool RAIL_SupportsMfm(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports MFM protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if MFM protocol is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_MFM](features#rail-supports-mfm-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_mfm()](features#sl-rail-supports-mfm). 

###### RAIL_SupportsOFDMPA

`bool RAIL_SupportsOFDMPA(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports OFDM band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if OFDM operation is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_OFDM_PA](features#rail-supports-ofdm-pa).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_ofdm_pa()](features#sl-rail-supports-ofdm-pa). 

###### RAIL_SupportsPrecisionLFRCO

`bool RAIL_SupportsPrecisionLFRCO(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports a high-precision LFRCO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if high-precision LFRCO is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PRECISION_LFRCO](features#rail-supports-precision-lfrco-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_precision_lfrco()](features#sl-rail-supports-precision-lfrco). 

###### RAIL_SupportsRadioEntropy

`bool RAIL_SupportsRadioEntropy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports radio entropy.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if radio entropy is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RADIO_ENTROPY](features#rail-supports-radio-entropy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_radio_entropy()](features#sl-rail-supports-radio-entropy). 

###### RAIL_SupportsRfSenseEnergyDetection

`bool RAIL_SupportsRfSenseEnergyDetection(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports RF Sense Energy Detection Mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF Sense Energy Detection Mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RFSENSE_ENERGY_DETECTION](features#rail-supports-rfsense-energy-detection).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_rf_sense_energy_detection()](features#sl-rail-supports-rf-sense-energy-detection). 

###### RAIL_SupportsRfSenseSelectiveOok

`bool RAIL_SupportsRfSenseSelectiveOok(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports RF Sense Selective(OOK) Mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF Sense Selective(OOK) Mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RFSENSE_SELECTIVE_OOK](features#rail-supports-rfsense-selective-ook).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_rf_sense_selective_ook()](features#sl-rail-supports-rf-sense-selective-ook). 

###### RAIL_SupportsRssiDetectThreshold

`bool RAIL_SupportsRssiDetectThreshold(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports configurable RSSI threshold set by [RAIL_SetRssiDetectThreshold()](receive#rail-set-rssi-detect-threshold).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if setting configurable RSSI is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD](features#rail-supports-rssi-detect-threshold-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_rssi_detect_threshold()](features#sl-rail-supports-rssi-detect-threshold). 

###### RAIL_SupportsRxDirectModeDataToFifo

`bool RAIL_SupportsRxDirectModeDataToFifo(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports RX direct mode data to FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode data to FIFO is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO](features#rail-supports-rx-direct-mode-data-to-fifo-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_rx_direct_mode_data_to_fifo()](features#sl-rail-supports-rx-direct-mode-data-to-fifo). 

###### RAIL_SupportsRxRawData

`bool RAIL_SupportsRxRawData(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports raw RX data sources other than [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_RX_RAW_DATA](features#rail-supports-rx-raw-data-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_rx_raw_data()](features#sl-rail-supports-rx-raw-data). 

###### RAIL_SupportsSQPhy

`bool RAIL_SupportsSQPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports SQ-based PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the SQ-based PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_SQ_PHY](features#rail-supports-sq-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_sq_phy()](features#sl-rail-supports-sq-phy). 

###### RAIL_SupportsTxPowerMode

`bool RAIL_SupportsTxPowerMode(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t powerMode, RAIL_TxPowerLevel_t *pMaxPowerLevel)`

**Description:** Indicate whether this chip supports a particular power mode (PA).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|powerMode|The power mode to check if supported.|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) *|[out]|pMaxPowerLevel|A pointer to a [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) that if non-NULL will be filled in with the power mode's highest power level allowed if this function returns true.|

**Returns**

- true if the powerMode is supported; false otherwise.

This function has no compile-time equivalent.

**Note**

- Consider using [RAIL_SupportsTxPowerModeAlt](features#rail-supports-tx-power-mode-alt) to also get the power mode's lowest allowed power level.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily replaced with sli_rail_supports_tx_power_mode() with its additional parameter. 

###### RAIL_SupportsTxPowerModeAlt

`bool RAIL_SupportsTxPowerModeAlt(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t *powerMode, RAIL_TxPowerLevel_t *maxPowerLevel, RAIL_TxPowerLevel_t *minPowerLevel)`

**Description:** Indicate whether this chip supports a particular power mode (PA) and provides the maximum and minimum power level for that power mode if supported by the chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) *|[inout]|powerMode|A pointer to PA power mode to check if supported. If [RAIL_TX_POWER_MODE_2P4GIG_HIGHEST](pa#rail-tx-power-mode-2-p4-gig-highest) or [RAIL_TX_POWER_MODE_SUBGIG_HIGHEST](pa#rail-tx-power-mode-subgig-highest) is passed in, it will be updated to the highest corresponding PA available on the chip.|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) *|[out]|maxPowerLevel|A pointer to a [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) that if non-NULL will be filled in with the power mode's highest power level allowed if this function returns true.|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) *|[out]|minPowerLevel|A pointer to a [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) that if non-NULL will be filled in with the power mode's lowest power level allowed if this function returns true.|

**Returns**

- true if powerMode is supported; false otherwise.

This function has no compile-time equivalent.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_supports_tx_power_mode(). 

###### RAIL_SupportsTxToTx

`bool RAIL_SupportsTxToTx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports automatic TX to TX transitions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if TX to TX transitions are supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_TX_TO_TX](features#rail-supports-tx-to-tx-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_tx_to_tx()](features#sl-rail-supports-tx-to-tx). 

###### RAIL_SupportsProtocolBLE

`bool RAIL_SupportsProtocolBLE(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports the BLE protocol on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PROTOCOL_BLE](features#rail-supports-protocol-ble-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_protocol_ble()](features#sl-rail-supports-protocol-ble). 

###### RAIL_BLE_Supports1MbpsNonViterbi

`bool RAIL_BLE_Supports1MbpsNonViterbi(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 1 Mbps Non-Viterbi PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 1 Mbps Non-Viterbi is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_1MBPS_NON_VITERBI](features#rail-ble-supports-1-mbps-non-viterbi).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps). 

###### RAIL_BLE_Supports1MbpsViterbi

`bool RAIL_BLE_Supports1MbpsViterbi(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 1 Mbps Viterbi PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 1 Mbps Viterbi is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_1MBPS_VITERBI](features#rail-ble-supports-1-mbps-viterbi).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps). 

###### RAIL_BLE_Supports1Mbps

`bool RAIL_BLE_Supports1Mbps(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 1 Mbps operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 1 Mbps operation is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_1MBPS](features#rail-ble-supports-1-mbps).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_1_mbps()](features#sl-rail-ble-supports-1-mbps). 

###### RAIL_BLE_Supports2MbpsNonViterbi

`bool RAIL_BLE_Supports2MbpsNonViterbi(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 2 Mbps Non-Viterbi PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 2 Mbps Non-Viterbi is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_2MBPS_NON_VITERBI](features#rail-ble-supports-2-mbps-non-viterbi).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps). 

###### RAIL_BLE_Supports2MbpsViterbi

`bool RAIL_BLE_Supports2MbpsViterbi(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 2 Mbps Viterbi PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 2 Mbps Viterbi is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_2MBPS_VITERBI](features#rail-ble-supports-2-mbps-viterbi).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps). 

###### RAIL_BLE_Supports2Mbps

`bool RAIL_BLE_Supports2Mbps(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE 2 Mbps operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 2 Mbps operation is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_2MBPS](features#rail-ble-supports-2-mbps).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_2_mbps()](features#sl-rail-ble-supports-2-mbps). 

###### RAIL_BLE_SupportsAntennaSwitching

`bool RAIL_BLE_SupportsAntennaSwitching(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE Antenna Switching needed for Angle-of-Arrival receives or Angle-of-Departure transmits.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Antenna Switching is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#rail-ble-supports-antenna-switching-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_antenna_switching()](features#sl-rail-ble-supports-antenna-switching). 

###### RAIL_BLE_SupportsCodedPhy

`bool RAIL_BLE_SupportsCodedPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE Coded PHY used for Long-Range.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Coded PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_CODED_PHY](features#rail-ble-supports-coded-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_coded_phy()](features#sl-rail-ble-supports-coded-phy). 

###### RAIL_BLE_SupportsCte

`bool RAIL_BLE_SupportsCte(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE CTE (Constant Tone Extension) needed for Angle-of-Arrival/Departure transmits.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE CTE is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_CTE](features#rail-ble-supports-cte-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_cte()](features#sl-rail-ble-supports-cte). 

###### RAIL_BLE_SupportsIQSampling

`bool RAIL_BLE_SupportsIQSampling(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE IQ Sampling needed for Angle-of-Arrival/Departure receives.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE IQ Sampling is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_IQ_SAMPLING](features#rail-ble-supports-iq-sampling-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_iq_sampling()](features#sl-rail-ble-supports-iq-sampling). 

###### RAIL_BLE_SupportsPhySwitchToRx

`bool RAIL_BLE_SupportsPhySwitchToRx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE PHY switch to RX functionality, which is used to switch BLE PHYs at a specific time to receive auxiliary packets.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE PHY switch to RX is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#rail-ble-supports-phy-switch-to-rx-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_phy_switch_to_rx()](features#sl-rail-ble-supports-phy-switch-to-rx). 

###### RAIL_BLE_SupportsQuuppa

`bool RAIL_BLE_SupportsQuuppa(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the Quuppa PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Quuppa is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_QUUPPA](features#rail-ble-supports-quuppa-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_quuppa()](features#sl-rail-ble-supports-quuppa). 

###### RAIL_BLE_SupportsSignalIdentifier

`bool RAIL_BLE_SupportsSignalIdentifier(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE signal identifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if signal identifier is supported; false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_signal_identifier()](features#sl-rail-ble-supports-signal-identifier). 

###### RAIL_BLE_SupportsSimulscanPhy

`bool RAIL_BLE_SupportsSimulscanPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports BLE Simulscan PHY used for simultaneous BLE 1 Mbps and Coded PHY reception.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Simulscan PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#rail-ble-supports-simulscan-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_supports_simulscan_phy()](features#sl-rail-ble-supports-simulscan-phy). 

###### RAIL_SupportsProtocolIEEE802154

`bool RAIL_SupportsProtocolIEEE802154(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 802.15.4 protocol is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#rail-supports-protocol-ieee802154-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_protocol_ieee802154()](features#sl-rail-supports-protocol-ieee802154). 

###### RAIL_IEEE802154_SupportsCoexPhy

`bool RAIL_IEEE802154_SupportsCoexPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 Wi-Fi Coexistence PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 802.15.4 COEX PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_coex_phy()](features#sl-rail-ieee802154-supports-coex-phy). 

###### RAIL_SupportsIEEE802154Band2P4

`bool RAIL_SupportsIEEE802154Band2P4(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 2.4 GHz band variant.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if IEEE 802.15.4 2.4 GHz band variant is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_IEEE802154_BAND_2P4](features#rail-supports-ieee802154-band-2-p4).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_2p4_ghz_band()](features#sl-rail-ieee802154-supports-2p4-ghz-band). 

###### RAIL_SupportsThermalProtection

`bool RAIL_SupportsThermalProtection(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the thermal protection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if thermal protection is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_THERMAL_PROTECTION](features#rail-supports-thermal-protection-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_thermal_protection()](features#sl-rail-supports-thermal-protection). 

###### RAIL_IEEE802154_SupportsRxChannelSwitching

`bool RAIL_IEEE802154_SupportsRxChannelSwitching(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 2.4 RX channel switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if IEEE 802.15.4 2.4 GHz RX channel switching is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_rx_channel_switching()](features#sl-rail-ieee802154-supports-rx-channel-switching). 

###### RAIL_IEEE802154_SupportsCustom1Phy

`bool RAIL_IEEE802154_SupportsCustom1Phy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 PHY with custom settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 802.15.4 PHY with custom settings is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_CUSTOM1_PHY](features#rail-ieee802154-supports-custom1-phy-1).

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported. 

###### RAIL_IEEE802154_SupportsFemPhy

`bool RAIL_IEEE802154_SupportsFemPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 front end module optimized PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if a front end module is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_fem_phy()](features#sl-rail-ieee802154-supports-fem-phy). 

###### RAIL_IEEE802154_SupportsCancelFramePendingLookup

`bool RAIL_IEEE802154_SupportsCancelFramePendingLookup(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports canceling the frame-pending lookup event [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) when the radio transitions to a state that renders the the reporting of this event moot (i.e., too late for the stack to influence the outgoing Ack).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if canceling the lookup event is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-cancel-frame-pending-lookup-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_cancel_frame_pending_lookup()](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup). 

###### RAIL_IEEE802154_SupportsEarlyFramePendingLookup

`bool RAIL_IEEE802154_SupportsEarlyFramePendingLookup(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports early triggering of the frame-pending lookup event [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) just after MAC address fields have been received.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if early triggering is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-early-frame-pending-lookup-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_early_frame_pending_lookup()](features#sl-rail-ieee802154-supports-early-frame-pending-lookup). 

###### RAIL_IEEE802154_SupportsDualPaConfig

`bool RAIL_IEEE802154_SupportsDualPaConfig(RAIL_Handle_t railHandle)`

**Description:** Indicate whether RAIL supports dual PA mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the dual PA mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG](features#rail-ieee802154-supports-dual-pa-config-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_dual_pa_config()](features#sl-rail-ieee802154-supports-dual-pa-config). 

###### RAIL_IEEE802154_SupportsEEnhancedAck

`bool RAIL_IEEE802154_SupportsEEnhancedAck(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4E-2012 Enhanced Acking.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4E Enhanced Acking is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#rail-ieee802154-supports-e-enhanced-ack-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_enhanced_ack()](features#sl-rail-ieee802154-supports-e-enhanced-ack). 

###### RAIL_IEEE802154_SupportsEMultipurposeFrames

`bool RAIL_IEEE802154_SupportsEMultipurposeFrames(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4E-2012 Multipurpose frame reception.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Multipurpose frame reception is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#rail-ieee802154-supports-e-multipurpose-frames-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_multipurpose_frames()](features#sl-rail-ieee802154-supports-e-multipurpose-frames). 

###### RAIL_IEEE802154_SupportsESubsetGB868

`bool RAIL_IEEE802154_SupportsESubsetGB868(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4E-2012 feature subset needed for Zigbee R22 GB868.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4E GB868 subset is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#rail-ieee802154-supports-e-subset-gb868-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_e_subset_gb868()](features#sl-rail-ieee802154-supports-e-subset-gb868). 

###### RAIL_IEEE802154_SupportsG4ByteCrc

`bool RAIL_IEEE802154_SupportsG4ByteCrc(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 reception and transmission of frames with 4-byte CRC.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G 4-byte CRC is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_4BYTE_CRC](features#rail-ieee802154-supports-g-4-byte-crc).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_4_byte_crc()](features#sl-rail-ieee802154-supports-g-4-byte-crc). 

###### RAIL_IEEE802154_SupportsGDynFec

`bool RAIL_IEEE802154_SupportsGDynFec(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G dynamic FEC.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if dynamic FEC is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_DYNFEC](features#rail-ieee802154-supports-g-dynfec).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_dyn_fec()](features#sl-rail-ieee802154-supports-g-dyn-fec). 

###### RAIL_SupportsProtocolWiSUN

`bool RAIL_SupportsProtocolWiSUN(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports Wi-SUN.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Wi-SUN is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PROTOCOL_WI_SUN](features#rail-supports-protocol-wi-sun-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_protocol_wi_sun()](features#sl-rail-supports-protocol-wi-sun). 

###### RAIL_IEEE802154_SupportsGModeSwitch

`bool RAIL_IEEE802154_SupportsGModeSwitch(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports Wi-SUN mode switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Wi-SUN mode switching is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_MODESWITCH](features#rail-ieee802154-supports-g-modeswitch).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_mode_switch()](features#sl-rail-ieee802154-supports-g-mode-switch). 

###### RAIL_IEEE802154_SupportsGSubsetGB868

`bool RAIL_IEEE802154_SupportsGSubsetGB868(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 feature subset needed for Zigbee R22 GB868.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G GB868 subset is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#rail-ieee802154-supports-g-subset-gb868-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_subset_gb868()](features#sl-rail-ieee802154-supports-g-subset-gb868). 

###### RAIL_IEEE802154_SupportsGUnwhitenedRx

`bool RAIL_IEEE802154_SupportsGUnwhitenedRx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 reception of unwhitened frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G unwhitened frame reception is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#rail-ieee802154-supports-g-unwhitened-rx-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_unwhitened_rx()](features#sl-rail-ieee802154-supports-g-unwhitened-rx). 

###### RAIL_IEEE802154_SupportsGUnwhitenedTx

`bool RAIL_IEEE802154_SupportsGUnwhitenedTx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 transmission of unwhitened frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G unwhitened frame transmit is supported; false otherwise.

Runtime refinement of compile-time [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#rail-ieee802154-supports-g-unwhitened-tx-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_g_unwhitened_tx()](features#sl-rail-ieee802154-supports-g-unwhitened-tx). 

###### RAIL_WMBUS_SupportsSimultaneousTCRx

`bool RAIL_WMBUS_SupportsSimultaneousTCRx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports WMBUS simultaneous M2O RX of T and C modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the WMBUS simultaneous M2O RX of T and C modes is supported; false otherwise.

Runtime refinement of compile-time [RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#rail-wmbus-supports-simultaneous-t-c-rx).

**Deprecated**RAIL 2.x synonym of [sl_rail_wmbus_supports_simultaneous_t_c_rx()](features#sl-rail-wmbus-supports-simultaneous-t-c-rx). 

###### RAIL_SupportsProtocolZWave

`bool RAIL_SupportsProtocolZWave(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the Z-Wave protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Z-Wave protocol is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#rail-supports-protocol-zwave).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_protocol_zwave()](features#sl-rail-supports-protocol-zwave). 

###### RAIL_ZWAVE_SupportsConcPhy

`bool RAIL_ZWAVE_SupportsConcPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the Z-Wave concurrent PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Z-Wave concurrent PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_ZWAVE_SUPPORTS_CONC_PHY](features#rail-zwave-supports-conc-phy-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_supports_conc_phy()](features#sl-rail-zwave-supports-conc-phy). 

###### RAIL_ZWAVE_SupportsEnergyDetectPhy

`bool RAIL_ZWAVE_SupportsEnergyDetectPhy(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports the Z-Wave energy detect PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Z-Wave energy detect PHY is supported; false otherwise.

Runtime refinement of compile-time [RAIL_ZWAVE_SUPPORTS_ED_PHY](features#rail-zwave-supports-ed-phy).

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported. 

###### RAIL_ZWAVE_SupportsRegionPti

`bool RAIL_ZWAVE_SupportsRegionPti(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports Z-Wave Region in PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if ZWAVE Region in PTI is supported; false otherwise.

Runtime refinement of compile-time [RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#rail-zwave-supports-region-pti-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_supports_region_pti()](features#sl-rail-zwave-supports-region-pti). 

###### RAIL_IEEE802154_SupportsSignalIdentifier

`bool RAIL_IEEE802154_SupportsSignalIdentifier(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4 signal identifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if signal identifier is supported; false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_supports_signal_identifier()](features#sl-rail-ieee802154-supports-signal-identifier). 

###### RAIL_SupportsFastRx2Rx

`bool RAIL_SupportsFastRx2Rx(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports fast RX-to-RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if fast RX-to-RX is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_FAST_RX2RX](features#rail-supports-fast-rx2-rx-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_fast_rx_to_rx()](features#sl-rail-supports-fast-rx-to-rx). 

###### RAIL_SupportsCollisionDetection

`bool RAIL_SupportsCollisionDetection(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports collision detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if collision detection is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_COLLISION_DETECTION](features#rail-supports-collision-detection-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_collision_detection()](features#sl-rail-supports-collision-detection). 

###### RAIL_SupportsProtocolSidewalk

`bool RAIL_SupportsProtocolSidewalk(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports Sidewalk protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Sidewalk protocol is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#rail-supports-protocol-sidewalk-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_protocol_sidewalk()](features#sl-rail-supports-protocol-sidewalk). 

###### RAIL_SupportsTrustZoneSecurePeripherals

`bool RAIL_SupportsTrustZoneSecurePeripherals(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports TrustZone secure configuration of peripherals used by RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if secure mode is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#rail-supports-trustzone-secure-peripherals).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_trustzone_secure_peripherals()](features#sl-rail-supports-trustzone-secure-peripherals). 

###### RAIL_SupportsPrsLnaBypass

`bool RAIL_SupportsPrsLnaBypass(RAIL_Handle_t railHandle)`

**Description:** Indicate whether this chip supports automatic PRS LNA bypass for external FEM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if automatic PRS LNA bypass is supported; false otherwise.

Runtime refinement of compile-time [RAIL_SUPPORTS_PRS_LNA_BYPASS](features#rail-supports-prs-lna-bypass-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_supports_prs_lna_bypass()](features#sl-rail-supports-prs-lna-bypass). 

###### sl_rail_supports_2p4_ghz_band

`bool sl_rail_supports_2p4_ghz_band(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports 2.4 GHz band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 2.4 GHz band is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-supports-2-p4-ghz-band). 

###### sl_rail_supports_sub_ghz_band

`bool sl_rail_supports_sub_ghz_band(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports Sub-GHz band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Sub-GHz band is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_SUB_GHZ_BAND](features#sl-rail-supports-sub-ghz-band-1). 

###### sl_rail_supports_dual_band

`bool sl_rail_supports_dual_band(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports dual 2.4 GHz and Sub-GHz band operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the dual band is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_DUAL_BAND](features#sl-rail-supports-dual-band-1). 

###### sl_rail_supports_addr_filter_address_bit_mask

`bool sl_rail_supports_addr_filter_address_bit_mask(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports bit masked address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if bit masked address filtering is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#sl-rail-supports-addr-filter-address-bit-mask-1). 

###### sl_rail_supports_addr_filter_mask

`bool sl_rail_supports_addr_filter_mask(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports address filter mask information for incoming packets in [sl_rail_rx_packet_info_t::filter_mask](sl-rail-rx-packet-info-t#filter-mask) and [sl_rail_ieee802154_address_t::filter_mask](sl-rail-ieee802154-address-t#filter-mask).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if address filter information is supported; false otherwise (in which case [sl_rail_rx_packet_info_t::filter_mask](sl-rail-rx-packet-info-t#filter-mask) value is undefined).

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_ADDR_FILTER_MASK](features#sl-rail-supports-addr-filter-mask-1). 

###### sl_rail_supports_alternate_tx_power

`bool sl_rail_supports_alternate_tx_power(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports alternate TX power settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if alternate TX power settings are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#sl-rail-supports-alternate-tx-power-1). 

###### sl_rail_supports_antenna_diversity

`bool sl_rail_supports_antenna_diversity(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports antenna diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if antenna diversity is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

###### sl_rail_supports_path_diversity

`bool sl_rail_supports_path_diversity(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports internal RF path diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF path diversity is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PATH_DIVERSITY](features#sl-rail-supports-path-diversity-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

###### sl_rail_supports_aux_adc

`bool sl_rail_supports_aux_adc(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports AUXADC measurements on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if AUXADC measurements are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_AUXADC](features#sl-rail-supports-auxadc). 

###### sl_rail_supports_channel_hopping

`bool sl_rail_supports_channel_hopping(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports channel hopping on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if channel hopping is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1). 

###### sl_rail_supports_direct_mode

`bool sl_rail_supports_direct_mode(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports direct mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_DIRECT_MODE](features#sl-rail-supports-direct-mode-1). 

###### sl_rail_supports_dual_sync_words

`bool sl_rail_supports_dual_sync_words(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports dual sync words.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if dual sync words are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_DUAL_SYNC_WORDS](features#sl-rail-supports-dual-sync-words-1).

**Note**

- Certain radio configurations may not support this feature even if the chip in general claims to support it.

###### sl_rail_supports_tx_repeat_start_to_start

`bool sl_rail_supports_tx_repeat_start_to_start(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports start to start TX repeats.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if start to start TX repeats are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_TX_REPEAT_START_TO_START](features#sl-rail-supports-tx-repeat-start-to-start-1). 

###### sl_rail_supports_vdet

`bool sl_rail_supports_vdet(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports VDET.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if VDET is supported; false otherwise.

###### sl_rail_supports_external_thermistor

`bool sl_rail_supports_external_thermistor(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports thermistor measurements on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if thermistor measurements are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1). 

###### sl_rail_supports_hfxo_compensation

`bool sl_rail_supports_hfxo_compensation(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports HFXO compensation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if HFXO compensation is supported and [sl_rail_config_hfxo_thermistor()](external-thermistor#sl-rail-config-hfxo-thermistor) has been successfully called; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1). 

###### sl_rail_supports_mfm

`bool sl_rail_supports_mfm(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports MFM protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if MFM protocol is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_MFM](features#sl-rail-supports-mfm-1). 

###### sl_rail_supports_ofdm_pa

`bool sl_rail_supports_ofdm_pa(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports OFDM band operation on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if OFDM operation is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_OFDM_PA](features#sl-rail-supports-ofdm-pa-1). 

###### sl_rail_supports_precision_lfrco

`bool sl_rail_supports_precision_lfrco(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports a high-precision LFRCO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if high-precision LFRCO is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PRECISION_LFRCO](features#sl-rail-supports-precision-lfrco-1). 

###### sl_rail_supports_radio_entropy

`bool sl_rail_supports_radio_entropy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports radio entropy.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if radio entropy is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RADIO_ENTROPY](features#sl-rail-supports-radio-entropy-1). 

###### sl_rail_supports_rf_sense_energy_detection

`bool sl_rail_supports_rf_sense_energy_detection(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports RF Sense Energy Detection Mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF Sense Energy Detection Mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RF_SENSE_ENERGY_DETECTION](features#sl-rail-supports-rf-sense-energy-detection-1). 

###### sl_rail_supports_rf_sense_selective_ook

`bool sl_rail_supports_rf_sense_selective_ook(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports RF Sense Selective(OOK) Mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF Sense Selective(OOK) Mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RF_SENSE_SELECTIVE_OOK](features#sl-rail-supports-rf-sense-selective-ook-1). 

###### sl_rail_supports_rssi_detect_threshold

`bool sl_rail_supports_rssi_detect_threshold(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports configurable RSSI threshold set by [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if setting configurable RSSI is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD](features#sl-rail-supports-rssi-detect-threshold-1). 

###### sl_rail_supports_rx_direct_mode_data_to_fifo

`bool sl_rail_supports_rx_direct_mode_data_to_fifo(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports RX direct mode data to FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode data to FIFO is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO](features#sl-rail-supports-rx-direct-mode-data-to-fifo-1). 

###### sl_rail_supports_rx_raw_data

`bool sl_rail_supports_rx_raw_data(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports raw RX data sources other than [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if direct mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RX_RAW_DATA](features#sl-rail-supports-rx-raw-data-1). 

###### sl_rail_supports_sq_phy

`bool sl_rail_supports_sq_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports SQ-based PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the SQ-based PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_SQ_PHY](features#sl-rail-supports-sq-phy-1). 

###### sl_rail_supports_tx_to_tx

`bool sl_rail_supports_tx_to_tx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports automatic TX to TX transitions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if TX to TX transitions are supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_TX_TO_TX](features#sl-rail-supports-tx-to-tx-1). 

###### sl_rail_supports_protocol_ble

`bool sl_rail_supports_protocol_ble(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports the BLE protocol on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PROTOCOL_BLE](features#sl-rail-supports-protocol-ble-1). 

###### sl_rail_ble_supports_1_mbps

`bool sl_rail_ble_supports_1_mbps(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE 1 Mbps operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 1 Mbps operation is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_1_MBPS](features#sl-rail-ble-supports-1-mbps-1). 

###### sl_rail_ble_supports_2_mbps

`bool sl_rail_ble_supports_2_mbps(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE 2 Mbps operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE 2 Mbps operation is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1). 

###### sl_rail_ble_supports_antenna_switching

`bool sl_rail_ble_supports_antenna_switching(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE Antenna Switching needed for Angle-of-Arrival receives or Angle-of-Departure transmits.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Antenna Switching is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#sl-rail-ble-supports-antenna-switching-1). 

###### sl_rail_ble_supports_coded_phy

`bool sl_rail_ble_supports_coded_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE Coded PHY used for Long-Range.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Coded PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_CODED_PHY](features#sl-rail-ble-supports-coded-phy-1). 

###### sl_rail_ble_supports_cte

`bool sl_rail_ble_supports_cte(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE CTE (Constant Tone Extension) needed for Angle-of-Arrival/Departure transmits.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE CTE is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_CTE](features#sl-rail-ble-supports-cte-1). 

###### sl_rail_ble_supports_iq_sampling

`bool sl_rail_ble_supports_iq_sampling(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE IQ Sampling needed for Angle-of-Arrival/Departure receives.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE IQ Sampling is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_IQ_SAMPLING](features#sl-rail-ble-supports-iq-sampling-1). 

###### sl_rail_ble_supports_phy_switch_to_rx

`bool sl_rail_ble_supports_phy_switch_to_rx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE PHY switch to RX functionality, which is used to switch BLE PHYs at a specific time to receive auxiliary packets.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE PHY switch to RX is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#sl-rail-ble-supports-phy-switch-to-rx-1). 

###### sl_rail_ble_supports_quuppa

`bool sl_rail_ble_supports_quuppa(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the Quuppa PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Quuppa is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_QUUPPA](features#sl-rail-ble-supports-quuppa-1). 

###### sl_rail_ble_supports_signal_identifier

`bool sl_rail_ble_supports_signal_identifier(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE signal identifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if signal identifier is supported; false otherwise.

###### sl_rail_ble_supports_simulscan_phy

`bool sl_rail_ble_supports_simulscan_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports BLE Simulscan PHY used for simultaneous BLE 1 Mbps and Coded PHY reception.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if BLE Simulscan PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#sl-rail-ble-supports-simulscan-phy-1). 

###### sl_rail_supports_protocol_ieee802154

`bool sl_rail_supports_protocol_ieee802154(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 802.15.4 protocol is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#sl-rail-supports-protocol-ieee802154-1). 

###### sl_rail_ieee802154_supports_coex_phy

`bool sl_rail_ieee802154_supports_coex_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 Wi-Fi Coexistence PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the 802.15.4 COEX PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1). 

###### sl_rail_ieee802154_supports_2p4_ghz_band

`bool sl_rail_ieee802154_supports_2p4_ghz_band(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 2.4 GHz band variant.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if IEEE 802.15.4 2.4 GHz band variant is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-ieee802154-supports-2-p4-ghz-band). 

###### sl_rail_supports_thermal_protection

`bool sl_rail_supports_thermal_protection(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the thermal protection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if thermal protection is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_THERMAL_PROTECTION](features#sl-rail-supports-thermal-protection-1). 

###### sl_rail_ieee802154_supports_rx_channel_switching

`bool sl_rail_ieee802154_supports_rx_channel_switching(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 2.4 RX channel switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if IEEE 802.15.4 2.4 GHz RX channel switching is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1). 

###### sl_rail_ieee802154_supports_fem_phy

`bool sl_rail_ieee802154_supports_fem_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4 front end module optimized PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if a front end module is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1). 

###### sl_rail_ieee802154_supports_cancel_frame_pending_lookup

`bool sl_rail_ieee802154_supports_cancel_frame_pending_lookup(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports canceling the frame-pending lookup event [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) when the radio transitions to a state that renders the the reporting of this event moot (i.e., too late for the stack to influence the outgoing Ack).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if canceling the lookup event is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup-1). 

###### sl_rail_ieee802154_supports_early_frame_pending_lookup

`bool sl_rail_ieee802154_supports_early_frame_pending_lookup(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports early triggering of the frame-pending lookup event [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) just after MAC address fields have been received.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if early triggering is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#sl-rail-ieee802154-supports-early-frame-pending-lookup-1). 

###### sl_rail_ieee802154_supports_dual_pa_config

`bool sl_rail_ieee802154_supports_dual_pa_config(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether RAIL supports dual PA mode on this chip.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the dual PA mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG](features#sl-rail-ieee802154-supports-dual-pa-config-1). 

###### sl_rail_ieee802154_supports_e_enhanced_ack

`bool sl_rail_ieee802154_supports_e_enhanced_ack(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4E-2012 Enhanced Acking.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4E Enhanced Acking is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#sl-rail-ieee802154-supports-e-enhanced-ack-1). 

###### sl_rail_ieee802154_supports_e_multipurpose_frames

`bool sl_rail_ieee802154_supports_e_multipurpose_frames(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4E-2012 Multipurpose frame reception.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Multipurpose frame reception is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#sl-rail-ieee802154-supports-e-multipurpose-frames-1). 

###### sl_rail_ieee802154_supports_e_subset_gb868

`bool sl_rail_ieee802154_supports_e_subset_gb868(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the IEEE 802.15.4E-2012 feature subset needed for Zigbee R22 GB868.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4E GB868 subset is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#sl-rail-ieee802154-supports-e-subset-gb868-1). 

###### sl_rail_ieee802154_supports_g_4_byte_crc

`bool sl_rail_ieee802154_supports_g_4_byte_crc(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 reception and transmission of frames with 4-byte CRC.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G 4-byte CRC is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_4_BYTE_CRC](features#sl-rail-ieee802154-supports-g-4-byte-crc-1). 

###### sl_rail_ieee802154_supports_g_dyn_fec

`bool sl_rail_ieee802154_supports_g_dyn_fec(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G dynamic FEC.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if dynamic FEC is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_DYN_FEC](features#sl-rail-ieee802154-supports-g-dyn-fec-1). 

###### sl_rail_supports_protocol_wi_sun

`bool sl_rail_supports_protocol_wi_sun(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports Wi-SUN.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Wi-SUN is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PROTOCOL_WI_SUN](features#sl-rail-supports-protocol-wi-sun-1). 

###### sl_rail_ieee802154_supports_g_mode_switch

`bool sl_rail_ieee802154_supports_g_mode_switch(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports Wi-SUN mode switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Wi-SUN mode switching is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_MODE_SWITCH](features#sl-rail-ieee802154-supports-g-mode-switch-1). 

###### sl_rail_ieee802154_supports_g_subset_gb868

`bool sl_rail_ieee802154_supports_g_subset_gb868(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 feature subset needed for Zigbee R22 GB868.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G GB868 subset is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#sl-rail-ieee802154-supports-g-subset-gb868-1). 

###### sl_rail_ieee802154_supports_g_unwhitened_rx

`bool sl_rail_ieee802154_supports_g_unwhitened_rx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 reception of unwhitened frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G unwhitened frame reception is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#sl-rail-ieee802154-supports-g-unwhitened-rx-1). 

###### sl_rail_ieee802154_supports_g_unwhitened_tx

`bool sl_rail_ieee802154_supports_g_unwhitened_tx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4G-2012 transmission of unwhitened frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if 802.15.4G unwhitened frame transmit is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#sl-rail-ieee802154-supports-g-unwhitened-tx-1). 

###### sl_rail_wmbus_supports_simultaneous_t_c_rx

`bool sl_rail_wmbus_supports_simultaneous_t_c_rx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports WMBUS simultaneous M2O RX of T and C modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the WMBUS simultaneous M2O RX of T and C modes is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#sl-rail-wmbus-supports-simultaneous-t-c-rx-1). 

###### sl_rail_supports_protocol_zwave

`bool sl_rail_supports_protocol_zwave(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the Z-Wave protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Z-Wave protocol is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#sl-rail-supports-protocol-zwave-1). 

###### sl_rail_zwave_supports_conc_phy

`bool sl_rail_zwave_supports_conc_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports the Z-Wave concurrent PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the Z-Wave concurrent PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_ZWAVE_SUPPORTS_CONC_PHY](features#sl-rail-zwave-supports-conc-phy-1). 

###### sl_rail_zwave_supports_region_pti

`bool sl_rail_zwave_supports_region_pti(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports Z-Wave Region in PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if ZWAVE Region in PTI is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#sl-rail-zwave-supports-region-pti-1). 

###### sl_rail_ieee802154_supports_signal_identifier

`bool sl_rail_ieee802154_supports_signal_identifier(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports IEEE 802.15.4 signal identifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if signal identifier is supported; false otherwise.

###### sl_rail_supports_fast_rx_to_rx

`bool sl_rail_supports_fast_rx_to_rx(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports fast RX-to-RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if fast RX-to-RX is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_FAST_RX_TO_RX](features#sl-rail-supports-fast-rx-to-rx-1). 

###### sl_rail_supports_collision_detection

`bool sl_rail_supports_collision_detection(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports collision detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if collision detection is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_COLLISION_DETECTION](features#sl-rail-supports-collision-detection-1). 

###### sl_rail_supports_protocol_sidewalk

`bool sl_rail_supports_protocol_sidewalk(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports Sidewalk protocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if Sidewalk protocol is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#sl-rail-supports-protocol-sidewalk-1). 

###### sl_rail_supports_trustzone_secure_peripherals

`bool sl_rail_supports_trustzone_secure_peripherals(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports TrustZone secure configuration of peripherals used by RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if secure mode is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#sl-rail-supports-trustzone-secure-peripherals-1). 

###### sl_rail_supports_prs_lna_bypass

`bool sl_rail_supports_prs_lna_bypass(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports automatic PRS LNA bypass for external FEM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if automatic PRS LNA bypass is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_PRS_LNA_BYPASS](features#sl-rail-supports-prs-lna-bypass-1). 

###### sl_rail_supports_rx_duty_cycling

`bool sl_rail_supports_rx_duty_cycling(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports RX duty cycling.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RX duty cycling is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RX_DUTY_CYCLING](features#sl-rail-supports-rx-duty-cycling-1). 

###### sl_rail_supports_rf_sense_ook_phy

`bool sl_rail_supports_rf_sense_ook_phy(sl_rail_handle_t rail_handle)`

**Description:** Indicate whether this chip supports RFSENSE OOK PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RFSENSE OOK PHY is supported; false otherwise.

Runtime refinement of compile-time [SL_RAIL_SUPPORTS_RF_SENSE_OOK_PHY](features#sl-rail-supports-rf-sense-ook-phy-1). 

##### Macros

`#define RAIL_SUPPORTS_DUAL_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports both Sub-GHz and 2.4 GHz bands.

`#define RAIL_FEAT_DUAL_BAND_RADIO RAIL_SUPPORTS_DUAL_BAND`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_DUAL_BAND](features#rail-supports-dual-band-1).

`#define RAIL_SUPPORTS_2P4GHZ_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports the 2.4 GHz band.

`#define RAIL_FEAT_2G4_RADIO RAIL_SUPPORTS_2P4GHZ_BAND`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_2P4GHZ_BAND](features#rail-supports-2-p4-ghz-band).

`#define RAIL_SUPPORTS_SUBGHZ_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports Sub-GHz bands.

`#define RAIL_FEAT_SUBGIG_RADIO RAIL_SUPPORTS_SUBGHZ_BAND`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_SUBGHZ_BAND](features#rail-supports-subghz-band).

`#define RAIL_SUPPORTS_OFDM_PA 0`

**Description**: Boolean to indicate whether the selected chip supports OFDM PA.

`#define RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK 0`

**Description**: Boolean to indicate whether the selected chip supports bit masked address filtering.

`#define RAIL_SUPPORTS_ADDR_FILTER_MASK 1`

**Description**: Boolean to indicate whether the selected chip supports address filter mask information for incoming packets in [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) and [RAIL_IEEE802154_Address_t::filterMask](rail-ieee802154-address-t#filter-mask).

`#define RAIL_SUPPORTS_ALTERNATE_TX_POWER 0`

**Description**: Boolean to indicate whether the selected chip supports alternate power settings for the Power Amplifier.

`#define RAIL_FEAT_ALTERNATE_POWER_TX_SUPPORTED RAIL_SUPPORTS_ALTERNATE_TX_POWER`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_ALTERNATE_TX_POWER](features#rail-supports-alternate-tx-power-1).

`#define RAIL_SUPPORTS_ANTENNA_DIVERSITY 0`

**Description**: Boolean to indicate whether the selected chip supports antenna diversity.

`#define RAIL_FEAT_ANTENNA_DIVERSITY RAIL_SUPPORTS_ANTENNA_DIVERSITY`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1).

`#define RAIL_SUPPORTS_PATH_DIVERSITY 0`

**Description**: Boolean to indicate whether the selected chip supports internal RF path diversity.

`#define RAIL_SUPPORTS_CHANNEL_HOPPING 0`

**Description**: Boolean to indicate whether the selected chip supports channel hopping.

`#define RAIL_FEAT_CHANNEL_HOPPING RAIL_SUPPORTS_CHANNEL_HOPPING`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1).

`#define RAIL_SUPPORTS_DUAL_SYNC_WORDS 1`

**Description**: Boolean to indicate whether the selected chip supports dual sync words.

`#define RAIL_SUPPORTS_TX_TO_TX 1`

**Description**: Boolean to indicate whether the selected chip supports automatic transitions from TX to TX.

`#define RAIL_SUPPORTS_TX_REPEAT_START_TO_START 0`

**Description**: Boolean to indicate whether the selected chip supports [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start).

`#define RAIL_SUPPORTS_EXTERNAL_THERMISTOR 0`

**Description**: Boolean to indicate whether the selected chip supports thermistor measurements.

`#define RAIL_FEAT_EXTERNAL_THERMISTOR RAIL_SUPPORTS_EXTERNAL_THERMISTOR`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#rail-supports-external-thermistor-1).

`#define RAIL_SUPPORTS_HFXO_COMPENSATION 0`

**Description**: Boolean to indicate whether the selected chip supports HFXO compensation.

`#define RAIL_SUPPORTS_AUXADC 0`

**Description**: Boolean to indicate whether the selected chip supports AUXADC measurements.

`#define RAIL_SUPPORTS_PRECISION_LFRCO 0`

**Description**: Boolean to indicate whether the selected chip supports a high-precision LFRCO.

`#define RAIL_SUPPORTS_RADIO_ENTROPY 1`

**Description**: Boolean to indicate whether the selected chip supports radio entropy.

`#define RAIL_SUPPORTS_RFSENSE_ENERGY_DETECTION 0`

**Description**: Boolean to indicate whether the selected chip supports RF Sense Energy Detection Mode.

`#define RAIL_SUPPORTS_RFSENSE_SELECTIVE_OOK 0`

**Description**: Boolean to indicate whether the selected chip supports RF Sense Selective(OOK) Mode.

`#define RAIL_FEAT_RFSENSE_SELECTIVE_OOK_MODE_SUPPORTED RAIL_SUPPORTS_RFSENSE_SELECTIVE_OOK`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_RFSENSE_SELECTIVE_OOK](features#rail-supports-rfsense-selective-ook).

`#define RAIL_SUPPORTS_VDET 0`

**Description**: Boolean to indicate whether the selected chip supports the VDET voltage measurement feature.

`#define RAIL_SUPPORTS_PROTOCOL_BLE RAIL_SUPPORTS_2P4GHZ_BAND`

**Description**: Boolean to indicate whether the selected chip supports BLE.

`#define RAIL_BLE_SUPPORTS_1MBPS_NON_VITERBI 0`

**Description**: Boolean to indicate whether the selected chip supports BLE 1 Mbps Non-Viterbi PHY.

`#define RAIL_BLE_SUPPORTS_1MBPS_VITERBI RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE 1 Mbps Viterbi PHY.

`#define RAIL_BLE_SUPPORTS_1MBPS   (RAIL_BLE_SUPPORTS_1MBPS_NON_VITERBI || RAIL_BLE_SUPPORTS_1MBPS_VITERBI)`

**Description**: Boolean to indicate whether the selected chip supports BLE 1 Mbps operation.

`#define RAIL_BLE_SUPPORTS_2MBPS_NON_VITERBI 0`

**Description**: Boolean to indicate whether the selected chip supports BLE 2 Mbps Non-Viterbi PHY.

`#define RAIL_BLE_SUPPORTS_2MBPS_VITERBI RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE 2 Mbps Viterbi PHY.

`#define RAIL_BLE_SUPPORTS_2MBPS   (RAIL_BLE_SUPPORTS_2MBPS_NON_VITERBI || RAIL_BLE_SUPPORTS_2MBPS_VITERBI)`

**Description**: Boolean to indicate whether the selected chip supports BLE 2 Mbps operation.

`#define RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING 0`

**Description**: Boolean to indicate whether the selected chip supports BLE Antenna Switching needed for Angle-of-Arrival receives or Angle-of-Departure transmits.

`#define RAIL_BLE_SUPPORTS_CODED_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the BLE Coded PHY used for Long-Range.

`#define RAIL_FEAT_BLE_CODED RAIL_BLE_SUPPORTS_CODED_PHY`

**Description**: Backwards-compatible synonym of [RAIL_BLE_SUPPORTS_CODED_PHY](features#rail-ble-supports-coded-phy-1).

`#define RAIL_BLE_SUPPORTS_SIMULSCAN_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the BLE Simulscan PHY used for simultaneous BLE 1 Mbps and Coded PHY reception.

`#define RAIL_BLE_SUPPORTS_CTE 0`

**Description**: Boolean to indicate whether the selected chip supports BLE CTE (Constant Tone Extension) needed for Angle-of-Arrival/Departure transmits.

`#define RAIL_BLE_SUPPORTS_QUUPPA 0`

**Description**: Boolean to indicate whether the selected chip supports the Quuppa PHY.

`#define RAIL_BLE_SUPPORTS_IQ_SAMPLING 0`

**Description**: Boolean to indicate whether the selected chip supports BLE IQ Sampling needed for Angle-of-Arrival/Departure receives.

`#define RAIL_BLE_SUPPORTS_AOX `

**Description**: Boolean to indicate whether the selected chip supports some BLE AOX features.

`#define RAIL_FEAT_BLE_AOX_SUPPORTED RAIL_BLE_SUPPORTS_AOX`

**Description**: Backwards-compatible synonym of [RAIL_BLE_SUPPORTS_AOX](features#rail-ble-supports-aox).

`#define RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE PHY switch to RX functionality, which is used to switch BLE PHYs at a specific time to receive auxiliary packets.

`#define RAIL_FEAT_BLE_PHY_SWITCH_TO_RX RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX`

**Description**: Backwards-compatible synonym of [RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX](features#rail-ble-supports-phy-switch-to-rx-1).

`#define RAIL_SUPPORTS_PROTOCOL_IEEE802154 1`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4.

`#define RAIL_IEEE802154_SUPPORTS_COEX_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the 802.15.4 Wi-Fi Coexistence PHY.

`#define RAIL_FEAT_802154_COEX_PHY RAIL_IEEE802154_SUPPORTS_COEX_PHY`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1).

`#define RAIL_SUPPORTS_IEEE802154_BAND_2P4 (RAIL_SUPPORTS_PROTOCOL_IEEE802154 && RAIL_SUPPORTS_2P4GHZ_BAND)`

**Description**: Boolean to indicate whether the selected chip supports the IEEE 802.15.4 2.4 GHz band variant.

`#define RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING 0`

**Description**: Boolean to indicate whether the selected chip supports the IEEE 802.15.4 2.4 RX channel switching.

`#define RAIL_IEEE802154_SUPPORTS_FEM_PHY (RAIL_SUPPORTS_IEEE802154_BAND_2P4)`

**Description**: Boolean to indicate whether the selected chip supports a front end module.

`#define RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868 RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4E-2012 feature subset needed for Zigbee R22 GB868.

`#define RAIL_FEAT_IEEE802154_E_GB868_SUPPORTED RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868](features#rail-ieee802154-supports-e-subset-gb868-1).

`#define RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4E-2012 Enhanced ACKing.

`#define RAIL_FEAT_IEEE802154_E_ENH_ACK_SUPPORTED RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#rail-ieee802154-supports-e-enhanced-ack-1).

`#define RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports receiving IEEE 802.15.4E-2012 Multipurpose frames.

`#define RAIL_FEAT_IEEE802154_MULTIPURPOSE_FRAME_SUPPORTED RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES](features#rail-ieee802154-supports-e-multipurpose-frames-1).

`#define RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868   ((RAIL_SUPPORTS_PROTOCOL_IEEE802154 != 0) && (RAIL_SUPPORTS_SUBGHZ_BAND != 0))`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 feature subset needed for Zigbee R22 GB868.

`#define RAIL_FEAT_IEEE802154_G_GB868_SUPPORTED RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#rail-ieee802154-supports-g-subset-gb868-1).

`#define RAIL_IEEE802154_SUPPORTS_G_DYNFEC 0`

**Description**: Boolean to indicate whether the selected chip supports dynamic FEC See also runtime refinement [RAIL_IEEE802154_SupportsGDynFec()](features#rail-ieee802154-supports-g-dyn-fec).

`#define RAIL_IEEE802154_SUPPORTS_G_MODESWITCH 0`

**Description**: Boolean to indicate whether the selected chip supports Wi-SUN mode switching See also runtime refinement [RAIL_IEEE802154_SupportsGModeSwitch()](features#rail-ieee802154-supports-g-mode-switch).

`#define RAIL_IEEE802154_SUPPORTS_G_4BYTE_CRC RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 reception and transmission of frames with 4-byte CRC.

`#define RAIL_FEAT_IEEE802154_G_4BYTE_CRC_SUPPORTED RAIL_IEEE802154_SUPPORTS_G_4BYTE_CRC`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_G_4BYTE_CRC](features#rail-ieee802154-supports-g-4-byte-crc).

`#define RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 reception of unwhitened frames.

`#define RAIL_FEAT_IEEE802154_G_UNWHITENED_RX_SUPPORTED RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX](features#rail-ieee802154-supports-g-unwhitened-rx-1).

`#define RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 transmission of unwhitened frames.

`#define RAIL_FEAT_IEEE802154_G_UNWHITENED_TX_SUPPORTED RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX](features#rail-ieee802154-supports-g-unwhitened-tx-1).

`#define RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports canceling the frame-pending lookup event [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) when the radio transitions to a state that renders the the reporting of this event moot (i.e., too late for the stack to influence the outgoing ACK).

`#define RAIL_FEAT_IEEE802154_CANCEL_FP_LOOKUP_SUPPORTED RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-cancel-frame-pending-lookup-1).

`#define RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports early triggering of the frame-pending lookup event [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) just after MAC address fields have been received.

`#define RAIL_FEAT_IEEE802154_EARLY_FP_LOOKUP_SUPPORTED RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP`

**Description**: Backwards-compatible synonym of [RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP](features#rail-ieee802154-supports-early-frame-pending-lookup-1).

`#define RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG 0`

**Description**: Boolean to indicate whether the selected chip supports dual PA configs for mode switch or concurrent mode.

`#define RAIL_SUPPORTS_DBM_POWERSETTING_MAPPING_TABLE 0`

**Description**: Boolean to indicate whether the selected chip supports the pa power setting table.

`#define RAIL_IEEE802154_SUPPORTS_CUSTOM1_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4 PHY with custom settings.

`#define RAIL_SUPPORTS_PROTOCOL_WI_SUN 0`

**Description**: Boolean to indicate whether the selected chip supports Wi-SUN See also runtime refinement [RAIL_SupportsProtocolWiSUN()](features#rail-supports-protocol-wi-sun).

`#define RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX 0`

**Description**: Boolean to indicate whether the selected chip supports WMBUS simultaneous M2O RX of T and C modes set by [RAIL_WMBUS_Config()](wmbus#rail-wmbus-config).

`#define RAIL_SUPPORTS_PROTOCOL_ZWAVE 0`

**Description**: Boolean to indicate whether the selected chip supports Z-Wave.

`#define RAIL_FEAT_ZWAVE_SUPPORTED RAIL_SUPPORTS_PROTOCOL_ZWAVE`

**Description**: Backwards-compatible synonym of [RAIL_SUPPORTS_PROTOCOL_ZWAVE](features#rail-supports-protocol-zwave).

`#define RAIL_ZWAVE_SUPPORTS_ED_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports energy detect PHY.

`#define RAIL_ZWAVE_SUPPORTS_CONC_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports concurrent PHY.

`#define RAIL_SUPPORTS_SQ_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports SQ-based PHY.

`#define RAIL_ZWAVE_SUPPORTS_REGION_PTI RAIL_SUPPORTS_PROTOCOL_ZWAVE`

**Description**: Boolean to indicate whether the code supports Z-Wave region information in PTI and newer [RAIL_ZWAVE_RegionConfig_t](rail-zwave-region-config-t) structure See also runtime refinement [RAIL_ZWAVE_SupportsRegionPti()](features#rail-zwave-supports-region-pti).

`#define RAIL_FEAT_ZWAVE_REGION_PTI RAIL_ZWAVE_SUPPORTS_REGION_PTI`

**Description**: Backwards-compatible synonym of [RAIL_ZWAVE_SUPPORTS_REGION_PTI](features#rail-zwave-supports-region-pti-1).

`#define RAIL_SUPPORTS_RX_RAW_DATA 1`

**Description**: Boolean to indicate whether the selected chip supports raw RX data sources other than [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data).

`#define RAIL_SUPPORTS_DIRECT_MODE 0`

**Description**: Boolean to indicate whether the selected chip supports direct mode.

`#define RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO 0`

**Description**: Boolean to indicate whether the selected chip supports RX direct mode data to FIFO.

`#define RAIL_SUPPORTS_MFM 0`

**Description**: Boolean to indicate whether the selected chip supports MFM protocol.

`#define RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER 0`

**Description**: Boolean to indicate whether the selected chip supports 802.15.4 signal detection.

`#define RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER 0`

**Description**: Boolean to indicate whether the selected chip supports BLE signal detection.

`#define RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD (0U)`

**Description**: Boolean to indicate whether the selected chip supports configurable RSSI threshold set by [RAIL_SetRssiDetectThreshold()](receive#rail-set-rssi-detect-threshold).

`#define RAIL_SUPPORTS_THERMAL_PROTECTION (0U)`

**Description**: Boolean to indicate whether the selected chip supports thermal protection set by [RAIL_ConfigThermalProtection()](thermal-protection#rail-config-thermal-protection).

`#define RAIL_SUPPORTS_FAST_RX2RX (0U)`

**Description**: Boolean to indicate whether the selected chip supports fast RX-to-RX enabled by [RAIL_RX_OPTION_FAST_RX2RX](receive#rail-rx-option-fast-rx2-rx).

`#define RAIL_SUPPORTS_COLLISION_DETECTION (0U)`

**Description**: Boolean to indicate whether the selected chip supports collision detection enabled by [RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#rail-rx-option-enable-collision-detection) See also runtime refinement [RAIL_SupportsCollisionDetection()](features#rail-supports-collision-detection).

`#define RAIL_SUPPORTS_PROTOCOL_SIDEWALK (0U)`

**Description**: Boolean to indicate whether the selected chip supports Sidewalk protocol.

`#define RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS (0U)`

**Description**: Boolean to indicate whether the selected chip supports TrustZone secure configuration of peripherals used by RAIL.

`#define RAIL_SUPPORTS_PRS_LNA_BYPASS (0U)`

**Description**: Boolean to indicate whether the selected chip supports automatic PRS LNA bypass for external FEM.

`#define SL_RAIL_SUPPORTS_DUAL_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports both Sub-GHz and 2.4 GHz bands.

`#define SL_RAIL_SUPPORTS_2P4_GHZ_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports the 2.4 GHz band.

`#define SL_RAIL_SUPPORTS_SUB_GHZ_BAND 1`

**Description**: Boolean to indicate whether the selected chip supports Sub-GHz bands.

`#define SL_RAIL_SUPPORTS_OFDM_PA 0`

**Description**: Boolean to indicate whether the selected chip supports OFDM PA.

`#define SL_RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK 0`

**Description**: Boolean to indicate whether the selected chip supports bit masked address filtering.

`#define SL_RAIL_SUPPORTS_ADDR_FILTER_MASK 1`

**Description**: Boolean to indicate whether the selected chip supports address filter mask information for incoming packets in [sl_rail_rx_packet_info_t::filter_mask](sl-rail-rx-packet-info-t#filter-mask) and [sl_rail_ieee802154_address_t::filter_mask](sl-rail-ieee802154-address-t#filter-mask).

`#define SL_RAIL_SUPPORTS_ALTERNATE_TX_POWER 0`

**Description**: Boolean to indicate whether the selected chip supports alternate power settings for the Power Amplifier.

`#define SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY 0`

**Description**: Boolean to indicate whether the selected chip supports antenna diversity.

`#define SL_RAIL_SUPPORTS_PATH_DIVERSITY 0`

**Description**: Boolean to indicate whether the selected chip supports internal RF path diversity.

`#define SL_RAIL_SUPPORTS_CHANNEL_HOPPING 0`

**Description**: Boolean to indicate whether the selected chip supports channel hopping.

`#define SL_RAIL_SUPPORTS_DUAL_SYNC_WORDS 1`

**Description**: Boolean to indicate whether the selected chip supports dual sync words.

`#define SL_RAIL_SUPPORTS_TX_TO_TX 1`

**Description**: Boolean to indicate whether the selected chip supports automatic transitions from TX to TX.

`#define SL_RAIL_SUPPORTS_TX_REPEAT_START_TO_START 0`

**Description**: Boolean to indicate whether the selected chip supports [SL_RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#sl-rail-tx-repeat-option-start-to-start).

`#define SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR 0`

**Description**: Boolean to indicate whether the selected chip supports thermistor measurements.

`#define SL_RAIL_SUPPORTS_HFXO_COMPENSATION 0`

**Description**: Boolean to indicate whether the selected chip supports HFXO compensation.

`#define SL_RAIL_SUPPORTS_AUXADC 0`

**Description**: Boolean to indicate whether the selected chip supports AUXADC measurements.

`#define SL_RAIL_SUPPORTS_PRECISION_LFRCO 0`

**Description**: Boolean to indicate whether the selected chip supports a high-precision LFRCO.

`#define SL_RAIL_SUPPORTS_RADIO_ENTROPY 1`

**Description**: Boolean to indicate whether the selected chip supports radio entropy.

`#define SL_RAIL_SUPPORTS_RF_SENSE_ENERGY_DETECTION 0`

**Description**: Boolean to indicate whether the selected chip supports RF Sense Energy Detection Mode.

`#define SL_RAIL_SUPPORTS_RF_SENSE_SELECTIVE_OOK 0`

**Description**: Boolean to indicate whether the selected chip supports RF Sense Selective(OOK) Mode.

`#define SL_RAIL_SUPPORTS_VDET 0`

**Description**: Boolean to indicate whether the selected chip supports the VDET voltage measurement feature.

`#define SL_RAIL_SUPPORTS_RX_DUTY_CYCLING (0U)`

**Description**: Boolean to indicate whether the selected chip supports RX duty cycling.

`#define SL_RAIL_SUPPORTS_PROTOCOL_BLE SL_RAIL_SUPPORTS_2P4_GHZ_BAND`

**Description**: Boolean to indicate whether the selected chip supports BLE.

`#define SL_RAIL_BLE_SUPPORTS_1_MBPS SL_RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE 1 Mbps PHY.

`#define SL_RAIL_BLE_SUPPORTS_2_MBPS SL_RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE 2 Mbps PHY.

`#define SL_RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING 0`

**Description**: Boolean to indicate whether the selected chip supports BLE Antenna Switching needed for Angle-of-Arrival receives or Angle-of-Departure transmits.

`#define SL_RAIL_BLE_SUPPORTS_CODED_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the BLE Coded PHY used for Long-Range.

`#define SL_RAIL_BLE_SUPPORTS_SIMULSCAN_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the BLE Simulscan PHY used for simultaneous BLE 1 Mbps and Coded PHY reception.

`#define SL_RAIL_BLE_SUPPORTS_CTE 0`

**Description**: Boolean to indicate whether the selected chip supports BLE CTE (Constant Tone Extension) needed for Angle-of-Arrival/Departure transmits.

`#define SL_RAIL_BLE_SUPPORTS_QUUPPA 0`

**Description**: Boolean to indicate whether the selected chip supports the Quuppa PHY.

`#define SL_RAIL_BLE_SUPPORTS_IQ_SAMPLING 0`

**Description**: Boolean to indicate whether the selected chip supports BLE IQ Sampling needed for Angle-of-Arrival/Departure receives.

`#define SL_RAIL_BLE_SUPPORTS_AOX `

**Description**: Boolean to indicate whether the selected chip supports some BLE AOX features.

`#define SL_RAIL_BLE_SUPPORTS_PHY_SWITCH_TO_RX SL_RAIL_SUPPORTS_PROTOCOL_BLE`

**Description**: Boolean to indicate whether the selected chip supports BLE PHY switch to RX functionality, which is used to switch BLE PHYs at a specific time to receive auxiliary packets.

`#define SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154 1`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4.

`#define SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports the 802.15.4 Wi-Fi Coexistence PHY.

`#define SL_RAIL_IEEE802154_SUPPORTS_2P4_GHZ_BAND (SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154 && SL_RAIL_SUPPORTS_2P4_GHZ_BAND)`

**Description**: Boolean to indicate whether the selected chip supports the IEEE 802.15.4 2.4 GHz band variant.

`#define SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING 0`

**Description**: Boolean to indicate whether the selected chip supports the IEEE 802.15.4 2.4 RX channel switching.

`#define SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY (SL_RAIL_IEEE802154_SUPPORTS_2P4_GHZ_BAND)`

**Description**: Boolean to indicate whether the selected chip supports a front end module.

`#define SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868 SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4E-2012 feature subset needed for Zigbee R22 GB868.

`#define SL_RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4E-2012 Enhanced ACKing.

`#define SL_RAIL_IEEE802154_SUPPORTS_E_MULTIPURPOSE_FRAMES SL_RAIL_IEEE802154_SUPPORTS_E_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports receiving IEEE 802.15.4E-2012 Multipurpose frames.

`#define SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868   ((SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154 != 0) && (SL_RAIL_SUPPORTS_SUB_GHZ_BAND != 0))`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 feature subset needed for Zigbee R22 GB868.

`#define SL_RAIL_IEEE802154_SUPPORTS_G_DYN_FEC 0`

**Description**: Boolean to indicate whether the selected chip supports dynamic FEC See also runtime refinement [sl_rail_ieee802154_supports_g_dyn_fec()](features#sl-rail-ieee802154-supports-g-dyn-fec).

`#define SL_RAIL_IEEE802154_SUPPORTS_G_MODE_SWITCH 0`

**Description**: Boolean to indicate whether the selected chip supports Wi-SUN mode switching See also runtime refinement [sl_rail_ieee802154_supports_g_mode_switch()](features#sl-rail-ieee802154-supports-g-mode-switch).

`#define SL_RAIL_IEEE802154_SUPPORTS_G_4_BYTE_CRC SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 reception and transmission of frames with 4-byte CRC.

`#define SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_RX SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 reception of unwhitened frames.

`#define SL_RAIL_IEEE802154_SUPPORTS_G_UNWHITENED_TX SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868`

**Description**: Boolean to indicate whether the selected chip supports IEEE 802.15.4G-2012 transmission of unwhitened frames.

`#define SL_RAIL_IEEE802154_SUPPORTS_CANCEL_FRAME_PENDING_LOOKUP SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports canceling the frame-pending lookup event [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) when the radio transitions to a state that renders the the reporting of this event moot (i.e., too late for the stack to influence the outgoing ACK).

`#define SL_RAIL_IEEE802154_SUPPORTS_EARLY_FRAME_PENDING_LOOKUP SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154`

**Description**: Boolean to indicate whether the selected chip supports early triggering of the frame-pending lookup event [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) just after MAC address fields have been received.

`#define SL_RAIL_IEEE802154_SUPPORTS_DUAL_PA_CONFIG 0`

**Description**: Boolean to indicate whether the selected chip supports dual PA configs for mode switch or concurrent mode.

`#define SL_RAIL_SUPPORTS_DBM_POWERSETTING_MAPPING_TABLE 1`

**Description**: Boolean to indicate whether the selected chip supports the pa power setting table.

`#define SL_RAIL_SUPPORTS_PROTOCOL_WI_SUN 0`

**Description**: Boolean to indicate whether the selected chip supports Wi-SUN See also runtime refinement [sl_rail_supports_protocol_wi_sun()](features#sl-rail-supports-protocol-wi-sun).

`#define SL_RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX 0`

**Description**: Boolean to indicate whether the selected chip supports WMBUS simultaneous M2O RX of T and C modes set by [sl_rail_wmbus_config()](wmbus#sl-rail-wmbus-config).

`#define SL_RAIL_SUPPORTS_PROTOCOL_ZWAVE 0`

**Description**: Boolean to indicate whether the selected chip supports Z-Wave.

`#define SL_RAIL_ZWAVE_SUPPORTS_CONC_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports concurrent PHY.

`#define SL_RAIL_SUPPORTS_SQ_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports SQ-based PHY.

`#define SL_RAIL_ZWAVE_SUPPORTS_REGION_PTI SL_RAIL_SUPPORTS_PROTOCOL_ZWAVE`

**Description**: Boolean to indicate whether the code supports Z-Wave region information in PTI and newer [sl_rail_zwave_region_config_t](sl-rail-zwave-region-config-t) structure See also runtime refinement [sl_rail_zwave_supports_region_pti()](features#sl-rail-zwave-supports-region-pti).

`#define SL_RAIL_SUPPORTS_RX_RAW_DATA 1`

**Description**: Boolean to indicate whether the selected chip supports raw RX data sources other than [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data).

`#define SL_RAIL_SUPPORTS_DIRECT_MODE 0`

**Description**: Boolean to indicate whether the selected chip supports direct mode.

`#define SL_RAIL_SUPPORTS_RX_DIRECT_MODE_DATA_TO_FIFO 0`

**Description**: Boolean to indicate whether the selected chip supports RX direct mode data to FIFO.

`#define SL_RAIL_SUPPORTS_MFM 0`

**Description**: Boolean to indicate whether the selected chip supports MFM protocol.

`#define SL_RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER 0`

**Description**: Boolean to indicate whether the selected chip supports 802.15.4 signal detection.

`#define SL_RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER 0`

**Description**: Boolean to indicate whether the selected chip supports BLE signal detection.

`#define SL_RAIL_SUPPORTS_RSSI_DETECT_THRESHOLD (0U)`

**Description**: Boolean to indicate whether the selected chip supports configurable RSSI threshold set by [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold).

`#define SL_RAIL_SUPPORTS_THERMAL_PROTECTION (0U)`

**Description**: Boolean to indicate whether the selected chip supports thermal protection set by [sl_rail_config_thermal_protection()](thermal-protection#sl-rail-config-thermal-protection).

`#define SL_RAIL_SUPPORTS_FAST_RX_TO_RX (0U)`

**Description**: Boolean to indicate whether the selected chip supports fast RX-to-RX enabled by [SL_RAIL_RX_OPTION_FAST_RX_TO_RX](receive#sl-rail-rx-option-fast-rx-to-rx).

`#define SL_RAIL_SUPPORTS_COLLISION_DETECTION (0U)`

**Description**: Boolean to indicate whether the selected chip supports collision detection enabled by [SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#sl-rail-rx-option-enable-collision-detection) See also runtime refinement [sl_rail_supports_collision_detection()](features#sl-rail-supports-collision-detection).

`#define SL_RAIL_SUPPORTS_PROTOCOL_SIDEWALK (0U)`

**Description**: Boolean to indicate whether the selected chip supports Sidewalk protocol.

`#define SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS (0U)`

**Description**: Boolean to indicate whether the selected chip supports TrustZone secure configuration of peripherals used by RAIL.

`#define SL_RAIL_SUPPORTS_PRS_LNA_BYPASS (0U)`

**Description**: Boolean to indicate whether the selected chip supports automatic prs LNA bypass for external FEM.

`#define SL_RAIL_SUPPORTS_RF_SENSE_OOK_PHY 0`

**Description**: Boolean to indicate whether the selected chip supports RFSENSE OOK PHY.

#### Retiming

EFR32-specific retiming capability. 

The EFR product families have many digital and analog modules that can run in parallel with a radio. These combinations can cause interference and degradation on the radio RX sensitivity. Retiming can modify the clocking of the digital modules to reduce the interference. 

##### Enumerations

###### RAIL_RetimeOptions_t

```
enum RAIL_RetimeOptions_t {
    RAIL_RETIME_OPTION_HFXO_SHIFT = 0
    RAIL_RETIME_OPTION_HFRCO_SHIFT = 1
    RAIL_RETIME_OPTION_DCDC_SHIFT = 2
    RAIL_RETIME_OPTION_LCD_SHIFT = 3
}
```

**Description:**

Retiming options bit shifts.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_retime_options_t](retiming#sl-rail-retime-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RETIME_OPTION_HFXO_SHIFT|Shift position of [RAIL_RETIME_OPTION_HFXO](retiming#rail-retime-option-hfxo) bit.|
|RAIL_RETIME_OPTION_HFRCO_SHIFT|Shift position of [RAIL_RETIME_OPTION_HFRCO](retiming#rail-retime-option-hfrco) bit.|
|RAIL_RETIME_OPTION_DCDC_SHIFT|Shift position of [RAIL_RETIME_OPTION_DCDC](retiming#rail-retime-option-dcdc) bit.|
|RAIL_RETIME_OPTION_LCD_SHIFT|Shift position of [RAIL_RETIME_OPTION_LCD](retiming#rail-retime-option-lcd) bit.|

###### sl_rail_retime_options_t

```
enum sl_rail_retime_options_t {
    SL_RAIL_RETIME_OPTION_HFXO_SHIFT = 0
    SL_RAIL_RETIME_OPTION_HFRCO_SHIFT = 1
    SL_RAIL_RETIME_OPTION_DCDC_SHIFT = 2
    SL_RAIL_RETIME_OPTION_LCD_SHIFT = 3
}
```

**Description:**

Retiming options bit shifts.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RETIME_OPTION_HFXO_SHIFT|Shift position of [SL_RAIL_RETIME_OPTION_HFXO](retiming#sl-rail-retime-option-hfxo) bit.|
|SL_RAIL_RETIME_OPTION_HFRCO_SHIFT|Shift position of [SL_RAIL_RETIME_OPTION_HFRCO](retiming#sl-rail-retime-option-hfrco) bit.|
|SL_RAIL_RETIME_OPTION_DCDC_SHIFT|Shift position of [SL_RAIL_RETIME_OPTION_DCDC](retiming#sl-rail-retime-option-dcdc) bit.|
|SL_RAIL_RETIME_OPTION_LCD_SHIFT|Shift position of [SL_RAIL_RETIME_OPTION_LCD](retiming#sl-rail-retime-option-lcd) bit.|

##### Functions

###### RAIL_ConfigRetimeOptions

`RAIL_Status_t RAIL_ConfigRetimeOptions(RAIL_Handle_t railHandle, RAIL_RetimeOptions_t mask, RAIL_RetimeOptions_t options)`

**Description:** Configure retiming options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle of RAIL instance.|
|[RAIL_RetimeOptions_t](retiming#rail-retime-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[RAIL_RetimeOptions_t](retiming#rail-retime-options-t)|[in]|options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [RAIL_RetimeOptions_t](retiming#rail-retime-options-t).|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_retime_options()](retiming#sl-rail-config-retime-options). 

###### RAIL_GetRetimeOptions

`RAIL_Status_t RAIL_GetRetimeOptions(RAIL_Handle_t railHandle, RAIL_RetimeOptions_t *pOptions)`

**Description:** Get the currently configured retiming option.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle of RAIL instance.|
|[RAIL_RetimeOptions_t](retiming#rail-retime-options-t) *|[out]|pOptions|A pointer to configured retiming options bitmask indicating which are enabled.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_retime_options()](retiming#sl-rail-get-retime-options). 

###### RAIL_ChangedDcdc

`RAIL_Status_t RAIL_ChangedDcdc(void)`

**Description:** Indicate that the DCDC peripheral bus clock enable has changed allowing RAIL to react accordingly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This should be called after DCDC has been enabled or disabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_changed_dcdc()](retiming#sl-rail-changed-dcdc). 

###### sl_rail_config_retime_options

`sl_rail_status_t sl_rail_config_retime_options(sl_rail_handle_t rail_handle, sl_rail_retime_options_t mask, sl_rail_retime_options_t options)`

**Description:** Configure retiming options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A handle of RAIL instance.|
|[sl_rail_retime_options_t](retiming#sl-rail-retime-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[sl_rail_retime_options_t](retiming#sl-rail-retime-options-t)|[in]|options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [sl_rail_retime_options_t](retiming#sl-rail-retime-options-t).|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_get_retime_options

`sl_rail_status_t sl_rail_get_retime_options(sl_rail_handle_t rail_handle, sl_rail_retime_options_t *p_options)`

**Description:** Get the currently configured retiming option.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A handle of RAIL instance.|
|[sl_rail_retime_options_t](retiming#sl-rail-retime-options-t) *|[out]|p_options|A pointer to configured retiming options bitmask indicating which are enabled.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_changed_dcdc

`sl_rail_status_t sl_rail_changed_dcdc(void)`

**Description:** Indicate that the DCDC peripheral bus clock enable has changed allowing RAIL to react accordingly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This should be called after DCDC has been enabled or disabled.

##### Macros

`#define RAIL_RETIME_OPTION_HFXO   (1U << RAIL_RETIME_OPTION_HFXO_SHIFT)`

**Description**: An option to configure HFXO retiming.

`#define RAIL_RETIME_OPTION_HFRCO   (1U << RAIL_RETIME_OPTION_HFRCO_SHIFT)`

**Description**: An option to configure HFRCO retiming.

`#define RAIL_RETIME_OPTION_DCDC   (1U << RAIL_RETIME_OPTION_DCDC_SHIFT)`

**Description**: An option to configure DCDC retiming.

`#define RAIL_RETIME_OPTION_LCD   (1U << RAIL_RETIME_OPTION_LCD_SHIFT)`

**Description**: An option to configure LCD retiming.

`#define RAIL_RETIME_OPTIONS_NONE 0x0U`

**Description**: A value representing no retiming options.

`#define RAIL_RETIME_OPTIONS_ALL 0xFFU`

**Description**: A value representing all retiming options.

`#define SL_RAIL_RETIME_OPTION_HFXO   (1U << SL_RAIL_RETIME_OPTION_HFXO_SHIFT)`

**Description**: An option to configure HFXO retiming.

`#define SL_RAIL_RETIME_OPTION_HFRCO   (1U << SL_RAIL_RETIME_OPTION_HFRCO_SHIFT)`

**Description**: An option to configure HFRCO retiming.

`#define SL_RAIL_RETIME_OPTION_DCDC   (1U << SL_RAIL_RETIME_OPTION_DCDC_SHIFT)`

**Description**: An option to configure DCDC retiming.

`#define SL_RAIL_RETIME_OPTION_LCD   (1U << SL_RAIL_RETIME_OPTION_LCD_SHIFT)`

**Description**: An option to configure LCD retiming.

`#define SL_RAIL_RETIME_OPTIONS_NONE 0x0U`

**Description**: A value representing no retiming options.

`#define SL_RAIL_RETIME_OPTIONS_ALL 0xFFU`

**Description**: A value representing all retiming options.

#### Series 3 Scheduler

APIs to use the new scheduler implementation in Series 3 devices. 

##### Functions

###### sl_rail_cancel_scheduled_trx

`sl_rail_status_t sl_rail_cancel_scheduled_trx(sl_rail_handle_t rail_handle)`

**Description:** Cancel previously scheduled transactions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

This function cancels the scheduled transaction so a new transaction can be scheduled, including "unscheduled" DMP transactions. Transactions already started will complete. This function is available for all series 3 devices.

**Returns**

- Status code indicating success of the function call.

#### Antenna Control

Basic APIs to control the antenna functionality. 

These enumerations and structures are used with RAIL Antenna Control API.

EFR32 supports up to two antennas with configurable pin locations. 

##### Modules

[RAIL_AntennaConfig_t](rail-antenna-config-t)

[sl_rail_antenna_config_t](sl-rail-antenna-config-t)

##### Enumerations

###### RAIL_AntennaSel_t

```
enum RAIL_AntennaSel_t {
    RAIL_ANTENNA_0 = 0
    RAIL_ANTENNA_1 = 1
    RAIL_ANTENNA_AUTO = 255
}
```

**Description:**

Antenna path Selection enumeration.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ANTENNA_0|Enum for antenna path 0.|
|RAIL_ANTENNA_1|Enum for antenna path 1.|
|RAIL_ANTENNA_AUTO|Enum for antenna path auto.|

###### sl_rail_antenna_sel_t

```
enum sl_rail_antenna_sel_t {
    SL_RAIL_ANTENNA_0 = 0u
    SL_RAIL_ANTENNA_1 = 1u
    SL_RAIL_ANTENNA_AUTO = 255u
}
```

**Description:**

Antenna path Selection enumeration.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ANTENNA_0|Enum for antenna path 0.|
|SL_RAIL_ANTENNA_1|Enum for antenna path 1.|
|SL_RAIL_ANTENNA_AUTO|Enum for antenna path auto.|

##### Functions

###### RAIL_ConfigAntenna

`RAIL_Status_t RAIL_ConfigAntenna(RAIL_Handle_t railHandle, const RAIL_AntennaConfig_t *config)`

**Description:** Configure antenna path and pin locations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|const [RAIL_AntennaConfig_t](rail-antenna-config-t) *|[in]|config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Warnings**

- This API must be called before any TX or RX occurs. Otherwise, the antenna configurations for those functions will not take effect.

**Returns**

- Status code indicating success of the function call.

This function informs RAIL how to select each antenna, but not when. Antenna selection for receive is controlled by the [RAIL_RX_OPTION_ANTENNA0](receive#rail-rx-option-antenna0) and [RAIL_RX_OPTION_ANTENNA1](receive#rail-rx-option-antenna1) options (and the [RAIL_RX_OPTION_ANTENNA_AUTO](receive#rail-rx-option-antenna-auto) combination). Antenna selection for transmit is controlled by the [RAIL_TX_OPTION_ANTENNA0](transmit#rail-tx-option-antenna0) and [RAIL_TX_OPTION_ANTENNA1](transmit#rail-tx-option-antenna1) options.

There is only one antenna configuration can be active on a radio, regardless of the number of protocols (unless the application updates the configuration upon a protocol switch – RAIL does not save this configuration in a protocol RAIL instance).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_antenna()](antenna-control#sl-rail-config-antenna). 

###### RAIL_GetRfPath

`RAIL_Status_t RAIL_GetRfPath(RAIL_Handle_t railHandle, RAIL_AntennaSel_t *rfPath)`

**Description:** Get the default RF path.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_AntennaSel_t](antenna-control#rail-antenna-sel-t) *|[out]|rfPath|A pointer to RF path updated by the function.|

**Returns**

- Status code indicating success of the function call.

If multiple protocols are used, this function returns [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called and the given railHandle is not active. In that case, the caller must attempt to re-call this function later, for example when [RAIL_EVENT_CONFIG_SCHEDULED](events#rail-event-config-scheduled) trigger.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rf_path()](antenna-control#sl-rail-get-rf-path). 

###### sl_rail_config_antenna

`sl_rail_status_t sl_rail_config_antenna(sl_rail_handle_t rail_handle, const sl_rail_antenna_config_t *p_config)`

**Description:** Configure antenna path and pin locations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|const [sl_rail_antenna_config_t](sl-rail-antenna-config-t) *|[in]|p_config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Warnings**

- This API must be called before any TX or RX occurs. Otherwise, the antenna configurations for those functions will not take effect.

**Returns**

- Status code indicating success of the function call.

This function informs RAIL how to select each antenna, but not when. Antenna selection for receive is controlled by the [SL_RAIL_RX_OPTION_ANTENNA_0](receive#sl-rail-rx-option-antenna-0) and [SL_RAIL_RX_OPTION_ANTENNA_1](receive#sl-rail-rx-option-antenna-1) options (and the [SL_RAIL_RX_OPTION_ANTENNA_AUTO](receive#sl-rail-rx-option-antenna-auto) combination). Antenna selection for transmit is controlled by the [SL_RAIL_TX_OPTION_ANTENNA_0](transmit#sl-rail-tx-option-antenna-0) and [SL_RAIL_TX_OPTION_ANTENNA_1](transmit#sl-rail-tx-option-antenna-1) options.

Only one antenna configuration can be active on a radio, regardless of the number of protocols (unless the application updates the configuration upon a protocol switch – RAIL does not save this configuration in a protocol RAIL instance). 

###### sl_rail_get_rf_path

`sl_rail_status_t sl_rail_get_rf_path(sl_rail_handle_t rail_handle, sl_rail_antenna_sel_t *p_rf_path)`

**Description:** Get the default RF path.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t) *|[out]|p_rf_path|A pointer to RF path updated by the function.|

**Returns**

- Status code indicating success of the function call.

If multiple protocols are used, this function returns [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is called and the given rail_handle is not active. In that case, the caller must attempt to re-call this function later, for example when [SL_RAIL_EVENT_CONFIG_SCHEDULED](events#sl-rail-event-config-scheduled) trigger. 

##### Macros

`#define ant0Loc defaultPath`

**Description**: **Deprecated**Backwards compatible name for [RAIL_AntennaConfig_t::defaultPath](rail-antenna-config-t#default-path) field.

A configuration for antenna selection. 

**Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t](sl-rail-antenna-config-t). 

###### Public Attributes

###### ant0PinEn (heading level 7)

```
bool RAIL_AntennaConfig_t::ant0PinEn
```

**Description:** Antenna 0 Pin Enable.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_pin_enable](sl-rail-antenna-config-t#antenna-0-pin-enable).

###### ant1PinEn (heading level 7)

```
bool RAIL_AntennaConfig_t::ant1PinEn
```

**Description:** Antenna 1 Pin Enable.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_pin_enable](sl-rail-antenna-config-t#antenna-1-pin-enable).

###### defaultPath (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::defaultPath
```

**Description:** A [RAIL_AntennaSel_t](antenna-control#rail-antenna-sel-t) value specifying the internal default RF path.

**Details:** It is ignored on EFR32 parts that have only one RF path bonded out and on EFR32xG28 dual-band OPNs where the appropriate RF path is automatically set by RAIL to 0 for 2.4 GHz band and 1 for Sub-GHz band PHYs. On EFR32xG23 and EFR32xG28 single-band OPNs where both RF paths are bonded out this can be set to [RAIL_ANTENNA_AUTO](antenna-control#rail-antenna-auto) to effect internal RF path diversity on PHYs supporting diversity. This avoids the need for an external RF switch and the associated GPIO(s) needed to control its antenna selection.

**Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::default_rf_path](sl-rail-antenna-config-t#default-rf-path).

###### ant0Port (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::ant0Port
```

**Description:** Antenna 0 output GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_port](sl-rail-antenna-config-t#antenna-0-port).

###### ant0Pin (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::ant0Pin
```

**Description:** Antenna 0 output GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_0_pin](sl-rail-antenna-config-t#antenna-0-pin).

###### ant1Loc (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::ant1Loc
```

**Details:** **Deprecated**No longer used (ignored).

###### ant1Port (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::ant1Port
```

**Description:** Antenna 1 output GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_port](sl-rail-antenna-config-t#antenna-1-port).

###### ant1Pin (heading level 7)

```
uint8_t RAIL_AntennaConfig_t::ant1Pin
```

**Description:** Antenna 1 output GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_antenna_config_t::antenna_1_pin](sl-rail-antenna-config-t#antenna-1-pin).

A configuration for antenna selection. 

###### Public Attributes

###### antenna_0_pin_enable (heading level 7)

```
bool sl_rail_antenna_config_t::antenna_0_pin_enable
```

**Description:** Antenna 0 Pin Enable.

###### antenna_1_pin_enable (heading level 7)

```
bool sl_rail_antenna_config_t::antenna_1_pin_enable
```

**Description:** Antenna 1 Pin Enable.

###### default_rf_path (heading level 7)

```
uint8_t sl_rail_antenna_config_t::default_rf_path
```

**Description:** A [sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t) value specifying the internal default RF path.

**Details:** It is ignored on EFR32 parts that have only one RF path bonded out and on EFR32xG28 dual-band OPNs where the appropriate RF path is automatically set by RAIL to 0 for 2.4 GHz band and 1 for Sub-GHz band PHYs. On EFR32xG23 and EFR32xG28 single-band OPNs where both RF paths are bonded out this can be set to [SL_RAIL_ANTENNA_AUTO](antenna-control#sl-rail-antenna-auto) to effect internal RF path diversity on PHYs supporting diversity. This avoids the need for an external RF switch and the associated GPIO(s) needed to control its antenna selection.

###### antenna_0_port (heading level 7)

```
sl_rail_antenna_sel_t sl_rail_antenna_config_t::antenna_0_port
```

**Description:** Antenna 0 output GPIO port.

###### antenna_0_pin (heading level 7)

```
uint8_t sl_rail_antenna_config_t::antenna_0_pin
```

**Description:** Antenna 0 output GPIO pin.

###### reserved (heading level 7)

```
uint8_t sl_rail_antenna_config_t::reserved
```

**Details:** **Deprecated**No longer used (ignored).

###### antenna_1_port (heading level 7)

```
uint8_t sl_rail_antenna_config_t::antenna_1_port
```

**Description:** Antenna 1 output GPIO port.

###### antenna_1_pin (heading level 7)

```
uint8_t sl_rail_antenna_config_t::antenna_1_pin
```

**Description:** Antenna 1 output GPIO pin.

#### Auto-Ack

APIs for configuring Auto-Ack functionality. 

These APIs configure the radio for automatic acknowledgment features. Auto-Ack inherently changes how the underlying state machine behaves so users should not modify [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions) and [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) while using Auto-Ack features. 

```c
// Go to RX after Ack operation.
RAIL_AutoAckConfig_t autoAckConfig = {
  .enable = true,
  .ackTimeout = 1000,
  .rxTransitions = {
     .success = RAIL_RF_STATE_RX,
     .error   = RAIL_RF_STATE_RX
  },
  .txTransitions = {
     .success = RAIL_RF_STATE_RX,
     .error   = RAIL_RF_STATE_RX,
  },
};

RAIL_Status_t status = RAIL_ConfigAutoAck(railHandle, &autoAckConfig);

uint8_t ackData[] = {0x05, 0x02, 0x10, 0x00};

RAIL_Status_t status = RAIL_WriteAutoAckFifo(railHandle,
                                             ackData,
                                             sizeof(ackData));

```

The acknowledgment transmits based on the frame format configured via the Radio Configurator. For example, if the frame format is using a variable length scheme, the Ack will be sent according to that scheme. If a 10-byte packet is loaded into the Ack, but the variable length field of the Ack payload specifies a length of 5, only 5 bytes will transmit for the Ack. The converse is also true, if the frame length is configured to be a fixed 10-byte packet but only 5 bytes are loaded into the Ack buffer, a TX underflow occurs during the Ack transmit.

Unlike in non-Auto-Ack mode, Auto-Ack mode will always return to a single state after all Ack sequences complete, regardless of whether the Ack was successfully received/sent or not. See the documentation of [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack) for configuration information. To suspend automatic acknowledgment of a series of packets after transmit or receive call [RAIL_PauseTxAutoAck()](auto-ack#rail-pause-tx-auto-ack) or [RAIL_PauseRxAutoAck()](auto-ack#rail-pause-rx-auto-ack) respectively with the pause parameter set to true. When Auto-Acking is paused, after receiving or transmitting a packet (regardless of success), the radio transitions to the same state it would use while Acking. To return to normal state transition logic outside of Acking, call [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack) with the [RAIL_AutoAckConfig_t::enable](rail-auto-ack-config-t#enable) field false and specify the desired transitions in the [RAIL_AutoAckConfig_t::rxTransitions](rail-auto-ack-config-t#rx-transitions) and [RAIL_AutoAckConfig_t::txTransitions](rail-auto-ack-config-t#tx-transitions) fields. To get out of a paused state and resume Auto-Acking, call [RAIL_PauseTxAutoAck()](auto-ack#rail-pause-tx-auto-ack) and/or [RAIL_PauseRxAutoAck()](auto-ack#rail-pause-rx-auto-ack) with the pause parameter set to false.

Applications can cancel the transmission of an Ack with [RAIL_CancelAutoAck()](auto-ack#rail-cancel-auto-ack). Conversely, applications can control if a transmit operation should wait for an Ack after transmitting by using the [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack) option.

When [Antenna Control](antenna-control) is used for multiple antennas, Acks are transmitted on the antenna that was selected to receive the packet being acknowledged. When receiving an Ack, the [RAIL_RxOptions_t](receive#rail-rx-options-t) antenna options are used just like for any other receive.

If the Ack payload is dynamic, the application must call [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo) with the appropriate Ack payload after the application processes the receive. RAIL can Auto-Ack from the normal transmit buffer if [RAIL_UseTxFifoForAutoAck()](auto-ack#rail-use-tx-fifo-for-auto-ack) is called before the radio transmits the Ack. Ensure the transmit buffer contains data loaded by [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo).

Standard-based protocols that contain Auto-Ack functionality are normally configured in the protocol-specific configuration function. For example, [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) provides Auto-Ack configuration parameters in [RAIL_IEEE802154_Config_t](rail-ieee802154-config-t) and should only be configured through that function. It is not advisable to call both [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) and [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack). However, Ack modification functions are still valid to use with protocol-specific Acks. To cancel an IEEE 802.15.4 Ack transmit, use [RAIL_CancelAutoAck()](auto-ack#rail-cancel-auto-ack).

These APIs configure the radio for automatic acknowledgment features. Auto-Ack inherently changes how the underlying state machine behaves so users should not modify [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions) and [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) while using Auto-Ack features. 

```c
// Go to RX after Ack operation.
sl_rail_auto_ack_config_t auto_ack_config = {
  .enable = true,
  .ack_timeout_us = 1000,
  // "error" param ignored
  .rx_transitions = {
     .success = SL_RAIL_RF_STATE_RX,
     .error   = SL_RAIL_RF_STATE_RX
  },
  // "error" param ignored
  .tx_transitions = {
     .success = SL_RAIL_RF_STATE_RX,
     .error   = SL_RAIL_RF_STATE_RX,
  },
};

sl_rail_status_t status = sl_rail_config_auto_ack(rail_handle, &auto_ack_config);

uint8_t ack_data[] = {0x05, 0x02, 0x10, 0x00};

sl_rail_status_t status = sl_rail_write_auto_ack_fifo(rail_handle,
                                                      ack_data,
                                                      sizeof(ack_data));

```

The acknowledgment transmits based on the frame format configured via the Radio Configurator. For example, if the frame format is using a variable length scheme, the Ack will be sent according to that scheme. If a 10-byte packet is loaded into the Ack, but the variable length field of the Ack payload specifies a length of 5, only 5 bytes will transmit for the Ack. The converse is also true, if the frame length is configured to be a fixed 10-byte packet but only 5 bytes are loaded into the Ack buffer, a TX underflow occurs during the Ack transmit.

Unlike in non-Auto-Ack mode, Auto-Ack mode will always return to a single state after all Ack sequences complete, regardless of whether the Ack was successfully received/sent or not. See the documentation of [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack) for configuration information. To suspend automatic acknowledgment of a series of packets after transmit or receive call [sl_rail_pause_tx_auto_ack()](auto-ack#sl-rail-pause-tx-auto-ack) or [sl_rail_pause_rx_auto_ack()](auto-ack#sl-rail-pause-rx-auto-ack) respectively with the pause parameter set to true. When Auto-Acking is paused, after receiving or transmitting a packet (regardless of success), the radio transitions to the same state it would use while Acking. To return to normal state transition logic outside of Acking, call [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack) with the [sl_rail_auto_ack_config_t::enable](sl-rail-auto-ack-config-t#enable) field false and specify the desired transitions in the [sl_rail_auto_ack_config_t::rx_transitions](sl-rail-auto-ack-config-t#rx-transitions) and [sl_rail_auto_ack_config_t::tx_transitions](sl-rail-auto-ack-config-t#tx-transitions) fields. To get out of a paused state and resume Auto-Acking, call [sl_rail_pause_tx_auto_ack()](auto-ack#sl-rail-pause-tx-auto-ack) and/or [sl_rail_pause_rx_auto_ack()](auto-ack#sl-rail-pause-rx-auto-ack) with the pause parameter set to false.

Applications can cancel the transmission of an Ack with [sl_rail_cancel_auto_ack()](auto-ack#sl-rail-cancel-auto-ack). Conversely, applications can control if a transmit operation should wait for an Ack after transmitting by using the [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack) option.

When [Antenna Control](antenna-control) is used for multiple antennas, Acks are transmitted on the antenna that was selected to receive the packet being acknowledged. When receiving an Ack, the [sl_rail_rx_options_t](receive#sl-rail-rx-options-t) antenna options are used just like for any other receive.

If the Ack payload is dynamic, the application must call [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo) with the appropriate Ack payload after the application processes the receive. RAIL can Auto-Ack from the normal transmit buffer if [sl_rail_use_tx_fifo_for_auto_ack()](auto-ack#sl-rail-use-tx-fifo-for-auto-ack) is called before the radio transmits the Ack. Ensure the transmit buffer contains data loaded by [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo).

Standard-based protocols that contain Auto-Ack functionality are normally configured in the protocol-specific configuration function. For example, [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init) provides Auto-Ack configuration parameters in [sl_rail_ieee802154_config_t](sl-rail-ieee802154-config-t) and should only be configured through that function. It is not advisable to call both [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init) and [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack). However, Ack modification functions are still valid to use with protocol-specific Acks. To cancel an IEEE 802.15.4 Ack transmit, use [sl_rail_cancel_auto_ack()](auto-ack#sl-rail-cancel-auto-ack). 

##### Modules

[RAIL_AutoAckConfig_t](rail-auto-ack-config-t)

[sl_rail_auto_ack_config_t](sl-rail-auto-ack-config-t)

##### Functions

###### RAIL_ConfigAutoAck

`RAIL_Status_t RAIL_ConfigAutoAck(RAIL_Handle_t railHandle, const RAIL_AutoAckConfig_t *config)`

**Description:** Configure and enable automatic acknowledgment.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_AutoAckConfig_t](rail-auto-ack-config-t) *|[in]|config|A pointer to an Auto-Ack configuration structure.|

**Returns**

- Status code indicating success of the function call.

Configures the RAIL state machine for hardware-accelerated automatic acknowledgment. Ack timing parameters are defined in the configuration structure.

While Auto-Acking is enabled, do not call the following RAIL functions:

- [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions)
- [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions)

When Auto-Acking is enabled, only one state transition can be defined (without notion of success or error). Thus if you are enabling Auto-Ack (i.e., config->enable field is true) the "error" states of config->rxTransitions and config->txTransitions are ignored. After all Ack sequences, (success or fail) the state machine will return the radio to the "success" state, which can be either [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx) or [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle) (returning to [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx) is not supported). Alternatively when Auto-Acking is disabled (i.e., config->enable field is false), transitions are reconfigured using all fields of config->rxTransitions and config->txTransitions. When disabling, the "ackTimeout" field isn't used.

If you need information about the actual success of the Ack sequence, use RAIL events such as [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent) to make sure an Ack was sent, or [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) to make sure that an Ack was received within the specified timeout.

To set a certain turnaround time (i.e., txToRx and rxToTx in [RAIL_StateTiming_t](rail-state-timing-t)), make txToRx lower than desired to ensure you get to RX in time to receive the Ack. Silicon Labs recommends setting 10 us lower than desired: 

```c
void setAutoAckStateTimings(void)
{
  RAIL_StateTiming_t timings;

  // User is already in Auto-Ack and wants a turnaround of 192 us.
  timings.rxToTx = 192;
  timings.txToRx = 192 - 10;

  // Set other fields of timings...
  timings.idleToRx = 100;
  timings.idleToTx = 100;
  timings.rxSearchTimeout = 0;
  timings.txToRxSearchTimeout = 0;

  RAIL_SetStateTiming(railHandle, &timings);
}

```

**Note**

- Auto-Acking may not be enabled while RX Channel Hopping is enabled, or when BLE is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack). 

###### RAIL_IsAutoAckEnabled

`bool RAIL_IsAutoAckEnabled(RAIL_Handle_t railHandle)`

**Description:** Return the enable status of the Auto-Ack feature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if Auto-Ack is enabled, false if disabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_auto_ack_enabled()](auto-ack#sl-rail-is-auto-ack-enabled). 

###### RAIL_WriteAutoAckFifo

`RAIL_Status_t RAIL_WriteAutoAckFifo(RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)`

**Description:** Load the Auto-Ack buffer with Ack data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const uint8_t *|[in]|ackData|A pointer to Ack data to transmit. This may be NULL, in which case it's assumed the data has already been emplaced into the Ack buffer and RAIL just needs to be told how many bytes are there. Use [RAIL_GetAutoAckFifo()](auto-ack#rail-get-auto-ack-fifo) to get the address of RAIL's Auto-Ack buffer in RAM and its size.|
|uint16_t|[in]|ackDataLen|The number of bytes in Ack data.|

**Returns**

- Status code indicating success of the function call.

If the Ack buffer is available for updates, load the Ack buffer with data. If it is not available, [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) is returned. If ackDataLen exceeds [RAIL_AUTOACK_MAX_LENGTH](auto-ack#rail-autoack-max-length) then [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) will be returned and nothing is written to the Ack buffer (unless ackData is NULL in which case this indicates the application has already likely corrupted RAM).

**Deprecated**RAIL 2.x synonym of [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo). 

###### RAIL_GetAutoAckFifo

`RAIL_Status_t RAIL_GetAutoAckFifo(RAIL_Handle_t railHandle, uint8_t **ackBuffer, uint16_t *ackBufferBytes)`

**Description:** Get the address and size of the Auto-Ack transmit buffer for direct access.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t **|[inout]|ackBuffer|A pointer to a uint8_t pointer that will be updated to the RAM base address of the Auto-Ack FIFO buffer.|
|uint16_t *|[inout]|ackBufferBytes|A pointer to a uint16_t that will be updated to the size of the Auto-Ack FIFO buffer, in bytes, currently [RAIL_AUTOACK_MAX_LENGTH](auto-ack#rail-autoack-max-length).|

**Returns**

- Status code indicating success of the function call.

Applications can use this to more flexibly write Auto-Ack data into the buffer directly and in pieces, passing NULL ackData parameter to [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo) or [RAIL_IEEE802154_WriteEnhAck()](ieee802-15-4#rail-ieee802154-write-enh-ack) to inform RAIL of its final length.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_auto_ack_fifo()](auto-ack#sl-rail-get-auto-ack-fifo). 

###### RAIL_PauseRxAutoAck

`RAIL_Status_t RAIL_PauseRxAutoAck(RAIL_Handle_t railHandle, bool pause)`

**Description:** Pause/resume RX Auto-Ack functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|pause|Pause or resume RX Auto-Acking.|

**Returns**

- Status code indicating success of the function call.

When RX Auto-Acking is paused, the radio transitions to [RAIL_AutoAckConfig_t::rxTransitions](rail-auto-ack-config-t#rx-transitions)'s [RAIL_StateTransitions_t::success](rail-state-transitions-t#success) state after receiving a packet and does not transmit an Ack. When RX Auto-Ack is resumed, the radio resumes automatically Acking every successfully received packet.

**Deprecated**RAIL 2.x synonym of [sl_rail_pause_rx_auto_ack()](auto-ack#sl-rail-pause-rx-auto-ack). 

###### RAIL_IsRxAutoAckPaused

`bool RAIL_IsRxAutoAckPaused(RAIL_Handle_t railHandle)`

**Description:** Return whether the RX Auto-Ack is paused.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if RX Auto-Ack is paused, false if not paused.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_rx_auto_ack_paused()](auto-ack#sl-rail-is-rx-auto-ack-paused). 

###### RAIL_PauseTxAutoAck

`RAIL_Status_t RAIL_PauseTxAutoAck(RAIL_Handle_t railHandle, bool pause)`

**Description:** Pause/resume TX Auto-Ack functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|pause|Pause or resume TX Auto-Acking.|

**Returns**

- Status code indicating success of the function call.

When TX Auto-Acking is paused, the radio transitions to [RAIL_AutoAckConfig_t::txTransitions](rail-auto-ack-config-t#tx-transitions)'s [RAIL_StateTransitions_t::success](rail-state-transitions-t#success) state after transmitting a packet and does not wait for an Ack. When TX Auto-Ack is resumed, the radio resumes automatically waiting for an Ack after a successful transmit.

**Deprecated**RAIL 2.x synonym of [sl_rail_pause_tx_auto_ack()](auto-ack#sl-rail-pause-tx-auto-ack). 

###### RAIL_IsTxAutoAckPaused

`bool RAIL_IsTxAutoAckPaused(RAIL_Handle_t railHandle)`

**Description:** Return whether the TX Auto-Ack is paused.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if TX Auto-Ack is paused, false if not paused.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_tx_auto_ack_paused()](auto-ack#sl-rail-is-tx-auto-ack-paused). 

###### RAIL_UseTxFifoForAutoAck

`RAIL_Status_t RAIL_UseTxFifoForAutoAck(RAIL_Handle_t railHandle)`

**Description:** Modify the upcoming Ack to use the transmit FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. The call will fail if it is too late to modify the outgoing Ack.

This function allows the application to use the normal transmit FIFO as the data source for the upcoming Ack. The Ack modification to use the transmit FIFO only applies to one Ack transmission.

This function only returns true if the following conditions are met:

- Radio has not already decided to use the Ack buffer AND
- Radio is either looking for sync, receiving the packet after sync, or in the [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx) turnaround before the Ack is sent.

**Note**

- Call before [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) (for example from [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed)) so Auto-Ack can use the transmit FIFO.
- The transmit FIFO must not be used for Auto-Ack when IEEE 802.15.4, Z-Wave, or BLE protocols are active.

**Deprecated**RAIL 2.x synonym of [sl_rail_use_tx_fifo_for_auto_ack()](auto-ack#sl-rail-use-tx-fifo-for-auto-ack). 

###### RAIL_CancelAutoAck

`RAIL_Status_t RAIL_CancelAutoAck(RAIL_Handle_t railHandle)`

**Description:** Cancel the upcoming Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. This call will fail if it is too late to modify the outgoing Ack.

This function allows the application to cancel the upcoming automatic acknowledgment.

This function only returns true if the following conditions are met:

- Radio has not already decided to transmit the Ack, and
- Radio is either looking for sync, receiving the packet after sync or in the [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx) turnaround before the Ack is sent.

**Note**

- Call before [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) (for example from [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed)) so Auto-Ack can cancel the upcoming Ack.

**Deprecated**RAIL 2.x synonym of [sl_rail_cancel_auto_ack()](auto-ack#sl-rail-cancel-auto-ack). 

###### RAIL_IsAutoAckWaitingForAck

`bool RAIL_IsAutoAckWaitingForAck(RAIL_Handle_t railHandle)`

**Description:** Return whether the radio is currently waiting for an Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if radio is waiting for Ack, false if radio is not waiting for an Ack.

This function allows the application to query whether the radio is currently waiting for an Ack after a transmit operation.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_auto_ack_waiting_for_ack()](auto-ack#sl-rail-is-auto-ack-waiting-for-ack). 

###### sl_rail_config_auto_ack

`sl_rail_status_t sl_rail_config_auto_ack(sl_rail_handle_t rail_handle, const sl_rail_auto_ack_config_t *p_auto_ack_config)`

**Description:** Configure and enable automatic acknowledgment.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_auto_ack_config_t](sl-rail-auto-ack-config-t) *|[in]|p_auto_ack_config|A pointer to an Auto-Ack configuration structure.|

**Returns**

- Status code indicating success of the function call.

Configures the RAIL state machine for hardware-accelerated automatic acknowledgment. Ack timing parameters are defined in the configuration structure.

While Auto-Acking is enabled, do not call the following RAIL functions:

- [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions)
- [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions)

When Auto-Acking is enabled, only one state transition can be defined (without notion of success or error). Thus if you are enabling Auto-Ack (i.e., p_config->enable field is true) the "error" states of p_config->rx_transitions and p_config->tx_transitions are ignored. After all Ack sequences, (success or fail) the state machine will return the radio to the "success" state, which can be either [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx) or [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle) (returning to [SL_RAIL_RF_STATE_TX](state-transitions#sl-rail-rf-state-tx) is not supported). Alternatively when Auto-Acking is disabled (i.e., p_config->enable field is false), transitions are reconfigured using all fields of p_config->rx_transitions and p_config->tx_transitions. When disabling, the "ack_timeout" field isn't used.

If you need information about the actual success of the Ack sequence, use RAIL events such as [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent) to make sure an Ack was sent, or [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout) to make sure that an Ack was received within the specified timeout.

To set a certain turnaround time (i.e., tx_to_rx and rx_to_tx in [sl_rail_state_timing_t](sl-rail-state-timing-t)), make tx_to_rx lower than desired to ensure you get to RX in time to receive the Ack. Silicon Labs recommends setting 10 us lower than desired: 

```c
void set_auto_ack_state_timings(void)
{
  sl_rail_state_timing_t timings;

  // User is already in Auto-Ack and wants a turnaround of 192 us.
  timings.rx_to_tx = 192;
  timings.tx_to_rx = 192 - 10;

  // Set other fields of timings...
  timings.idle_to_rx = 100;
  timings.idle_to_tx = 100;
  timings.rxsearch_timeout = 0;
  timings.tx_to_rxsearch_timeout = 0;

  sl_rail_set_state_timing(rail_handle, &timings);
}

```

**Note**

- Auto-Acking may not be enabled while RX Channel Hopping is enabled, or when BLE is enabled.

###### sl_rail_is_auto_ack_enabled

`bool sl_rail_is_auto_ack_enabled(sl_rail_handle_t rail_handle)`

**Description:** Return the enable status of the Auto-Ack feature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if Auto-Ack is enabled, false if disabled.

###### sl_rail_write_auto_ack_fifo

`sl_rail_status_t sl_rail_write_auto_ack_fifo(sl_rail_handle_t rail_handle, const uint8_t *p_ack_data, uint16_t ack_bytes)`

**Description:** Load the Auto-Ack buffer with Ack data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const uint8_t *|[in]|p_ack_data|A pointer to Ack data to transmit. This may be NULL, in which case it's assumed the data has already been emplaced into the Ack buffer and RAIL just needs to be told how many bytes are there. Use [sl_rail_get_auto_ack_fifo()](auto-ack#sl-rail-get-auto-ack-fifo) to get the address of RAIL's Auto-Ack buffer in RAM and its size.|
|uint16_t|[in]|ack_bytes|The number of bytes in Ack data.|

**Returns**

- Status code indicating success of the function call.

If the Ack buffer is available for updates, load the Ack buffer with data. If it is not available, [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) is returned. If ack_bytes exceeds the size of the Auto-Ack FIFO buffer then [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) will be returned and nothing is written to the Ack buffer (unless p_ack_data is NULL in which case this indicates the application has already likely corrupted RAM). 

###### sl_rail_get_auto_ack_fifo

`sl_rail_status_t sl_rail_get_auto_ack_fifo(sl_rail_handle_t rail_handle, uint8_t **pp_ack_buffer, uint16_t *p_ack_buffer_bytes)`

**Description:** Get the address and size of the Auto-Ack transmit buffer for direct access.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t **|[inout]|pp_ack_buffer|A pointer to a uint8_t pointer that will be updated to the RAM base address of the Auto-Ack FIFO buffer.|
|uint16_t *|[inout]|p_ack_buffer_bytes|A pointer to a uint16_t that will be updated to the size of the Auto-Ack FIFO buffer, in bytes.|

**Returns**

- Status code indicating success of the function call.

Applications can use this to more flexibly write Auto-Ack data into the buffer directly and in pieces, passing NULL p_ack_data parameter to [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo) or [sl_rail_ieee802154_write_enh_ack()](ieee802-15-4#sl-rail-ieee802154-write-enh-ack) to inform RAIL of its final length. 

###### sl_rail_set_auto_ack_fifo

`sl_rail_status_t sl_rail_set_auto_ack_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_ack_fifo, uint16_t size_bytes, uint16_t init_bytes)`

**Description:** Set the address and size of the Auto-Ack transmit buffer, possibly pre-populated with some Ack data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) *|[inout]|p_ack_fifo|An appropriately-aligned (see [sl_rail_set_tx_fifo](data-management#sl-rail-set-tx-fifo) description) pointer to a read-write memory location in RAM used as the transmit FIFO for acknowledgement packets. This memory must persist until the next call to this function. If NULL, will re-establish the built-in per-protocol FIFO of size [SL_RAIL_DEFAULT_AUTO_ACK_FIFO_BYTES](auto-ack#sl-rail-default-auto-ack-fifo-bytes) (offset must be 0 in this case).|
|uint16_t|[in]|size_bytes|The desired size of the buffer in bytes. Must be greater than SL_RAIL_DEFAULT_AUTO_ACK_FIFO_BYTES and less than or equal to SL_RAIL_MAXIMUM_FIFO_BYTES.|
|uint16_t|[in]|init_bytes|The number of valid bytes already populated in the buffer. Must be less than or equal to size_bytes.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_pause_rx_auto_ack

`sl_rail_status_t sl_rail_pause_rx_auto_ack(sl_rail_handle_t rail_handle, bool pause)`

**Description:** Pause/resume RX Auto-Ack functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|pause|Pause or resume RX Auto-Acking.|

**Returns**

- Status code indicating success of the function call.

When RX Auto-Acking is paused, the radio transitions to [sl_rail_auto_ack_config_t::rx_transitions](sl-rail-auto-ack-config-t#rx-transitions)'s [sl_rail_state_transitions_t::success](sl-rail-state-transitions-t#success) state after receiving a packet and does not transmit an Ack. When RX Auto-Ack is resumed, the radio resumes automatically Acking every successfully received packet. 

###### sl_rail_is_rx_auto_ack_paused

`bool sl_rail_is_rx_auto_ack_paused(sl_rail_handle_t rail_handle)`

**Description:** Return whether the RX Auto-Ack is paused.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if RX Auto-Ack is paused, false if not paused.

###### sl_rail_pause_tx_auto_ack

`sl_rail_status_t sl_rail_pause_tx_auto_ack(sl_rail_handle_t rail_handle, bool pause)`

**Description:** Pause/resume TX Auto-Ack functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|pause|Pause or resume TX Auto-Acking.|

**Returns**

- Status code indicating success of the function call.

When TX Auto-Acking is paused, the radio transitions to [sl_rail_auto_ack_config_t::tx_transitions](sl-rail-auto-ack-config-t#tx-transitions)'s [sl_rail_state_transitions_t::success](sl-rail-state-transitions-t#success) state after transmitting a packet and does not wait for an Ack. When TX Auto-Ack is resumed, the radio resumes automatically waiting for an Ack after a successful transmit. 

###### sl_rail_is_tx_auto_ack_paused

`bool sl_rail_is_tx_auto_ack_paused(sl_rail_handle_t rail_handle)`

**Description:** Return whether the TX Auto-Ack is paused.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if TX Auto-Ack is paused, false if not paused.

###### sl_rail_use_tx_fifo_for_auto_ack

`sl_rail_status_t sl_rail_use_tx_fifo_for_auto_ack(sl_rail_handle_t rail_handle)`

**Description:** Modify the upcoming Ack to use the transmit FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. The call will fail if it is too late to modify the outgoing Ack.

This function allows the application to use the normal transmit FIFO as the data source for the upcoming Ack. The Ack modification to use the transmit FIFO only applies to one Ack transmission.

This function only returns true if the following conditions are met:

- Radio has not already decided to use the Ack buffer AND
- Radio is either looking for sync, receiving the packet after sync, or in the [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx) turnaround before the Ack is sent.

**Note**

- Call before [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) (for example from [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed)) so Auto-Ack can use the transmit FIFO.
- The transmit FIFO must not be used for Auto-Ack when IEEE 802.15.4, Z-Wave, or BLE protocols are active.

###### sl_rail_cancel_auto_ack

`sl_rail_status_t sl_rail_cancel_auto_ack(sl_rail_handle_t rail_handle)`

**Description:** Cancel the upcoming Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. This call will fail if it is too late to modify the outgoing Ack.

This function allows the application to cancel the upcoming automatic acknowledgment.

This function only returns true if the following conditions are met:

- Radio has not already decided to transmit the Ack, and
- Radio is either looking for sync, receiving the packet after sync, or in the [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx) turnaround before the Ack is sent.

**Note**

- Call before [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) (for example from [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed)) so Auto-Ack can cancel the upcoming Ack.

###### sl_rail_is_auto_ack_waiting_for_ack

`bool sl_rail_is_auto_ack_waiting_for_ack(sl_rail_handle_t rail_handle)`

**Description:** Return whether the radio is currently waiting for an Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if radio is waiting for Ack, false if radio is not waiting for an Ack.

This function allows the application to query whether the radio is currently waiting for an Ack after a transmit operation. 

##### Macros

`#define RAIL_AUTOACK_MAX_LENGTH (64U)`

**Description**: Acknowledgment packets cannot be longer than 64 bytes.

`#define SL_RAIL_DEFAULT_AUTO_ACK_FIFO_BYTES SL_RAIL_MINIMUM_FIFO_BYTES`

**Description**: The default size in bytes of the built-in per-protocol Auto-Ack FIFO.

Enable/disable the Auto-Ack algorithm, based on "enable". 

The structure provides a default state (the "success" of TX/RX transitions when Acking is enabled) for the radio to return to after an Ack operation occurs (transmitting or attempting to receive an Ack), or normal state transitions to return to in the case Acking is disabled. Regardless whether the Ack operation was successful, the radio returns to the specified success state.

ackTimeout specifies how long to stay in receive and wait for an Ack to start (sync detected) before issuing a [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) event and return to the default state.

**Deprecated**RAIL 2.x synonym of [sl_rail_auto_ack_config_t](sl-rail-auto-ack-config-t). 

###### Public Attributes

###### enable (heading level 7)

```
bool RAIL_AutoAckConfig_t::enable
```

**Description:** Indicate whether Auto-Acking should be enabled or disabled.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_auto_ack_config_t::enable](sl-rail-auto-ack-config-t#enable).

###### ackTimeout (heading level 7)

```
uint16_t RAIL_AutoAckConfig_t::ackTimeout
```

**Description:** Define the RX Ack timeout duration in microseconds up to 65535 microseconds maximum.

**Details:** Only applied when Auto-Acking is enabled. The Ack timeout timer starts at the completion of a [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack) transmit and expires only while waiting for a packet (prior to SYNC detect), triggering [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout). During packet reception that event is held off until packet completion and suppressed entirely if the received packet is the expected Ack.

**Deprecated**RAIL 2.x synonym of [sl_rail_auto_ack_config_t::ack_timeout_us](sl-rail-auto-ack-config-t#ack-timeout-us).

###### rxTransitions (heading level 7)

```
RAIL_StateTransitions_t RAIL_AutoAckConfig_t::rxTransitions
```

**Description:** State transitions to do after receiving a packet.

**Details:** When Auto-Acking is enabled, the "error" transition is always ignored and the radio will return to the "success" state after any Acking sequence ([RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx) or [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle)). See [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack) for more details on this.

**Deprecated**RAIL 2.x synonym of [sl_rail_auto_ack_config_t::rx_transitions](sl-rail-auto-ack-config-t#rx-transitions).

###### txTransitions (heading level 7)

```
RAIL_StateTransitions_t RAIL_AutoAckConfig_t::txTransitions
```

**Description:** State transitions to do after transmitting a packet.

**Details:** When Auto-Acking is enabled, the "error" transition is always ignored and the radio will return to the "success" state after any Acking sequence ([RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx) or [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle)). See [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack) for more details on this.

**Deprecated**RAIL 2.x synonym of [sl_rail_auto_ack_config_t::tx_transitions](sl-rail-auto-ack-config-t#tx-transitions).

Enable/disable the Auto-Ack algorithm, based on "enable". 

The structure provides a default state (the "success" of TX/RX transitions when Acking is enabled) for the radio to return to after an Ack operation occurs (transmitting or attempting to receive an Ack), or normal state transitions to return to in the case Acking is disabled. Regardless whether the Ack operation was successful, the radio returns to the specified success state.

ack_timeout_us specifies how long to stay in receive and wait for an Ack to start (sync detected) before issuing a [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout) event and return to the default state. 

###### Public Attributes

###### enable (heading level 7)

```
bool sl_rail_auto_ack_config_t::enable
```

**Description:** Indicate whether Auto-Acking should be enabled or disabled.

###### ack_timeout_us (heading level 7)

```
uint16_t sl_rail_auto_ack_config_t::ack_timeout_us
```

**Description:** Define the RX Ack timeout duration in microseconds up to 65535 microseconds maximum.

**Details:** Only applied when Auto-Acking is enabled. The Ack timeout timer starts at the completion of a [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack) transmit and expires only while waiting for a packet (prior to SYNC detect), triggering [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout). During packet reception that event is held off until packet completion and suppressed entirely if the received packet is the expected Ack.

###### rx_transitions (heading level 7)

```
sl_rail_state_transitions_t sl_rail_auto_ack_config_t::rx_transitions
```

**Description:** State transitions to do after receiving a packet.

**Details:** When Auto-Acking is enabled, the "error" transition is always ignored and the radio will return to the "success" state after any Acking sequence ([SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx) or [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle)). See [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack) for more details on this.

###### tx_transitions (heading level 7)

```
sl_rail_state_transitions_t sl_rail_auto_ack_config_t::tx_transitions
```

**Description:** State transitions to do after transmitting a packet.

**Details:** When Auto-Acking is enabled, the "error" transition is always ignored and the radio will return to the "success" state after any Acking sequence ([SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx) or [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle)). See [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack) for more details on this.

#### Calibration

APIs for calibrating the radio. 

IEEE802154 protocol-specific APIs for calibrating the radio.

Bluetooth protocol-specific APIs for calibrating the radio.

The EFR32 supports the Image Rejection (IR) calibration and a temperature-dependent calibration.

These APIs calibrate the radio. The RAIL library determines which calibrations are necessary. Calibrations can be enabled/disabled with the [RAIL_CalMask_t](calibration#rail-cal-mask-t) parameter.

Some calibrations produce values that can be saved and reapplied to avoid repeating the calibration process.

Calibrations can either be run with [RAIL_Calibrate()](calibration#rail-calibrate), or with the individual chip-specific calibration routines. An example for running code with [RAIL_Calibrate()](calibration#rail-calibrate) looks like the following: 

```c
static RAIL_CalValues_t calValues = RAIL_CALVALUES_UNINIT;
static volatile bool calibrateRadio = false;

void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Omitting other event handlers
  if (events & RAIL_EVENT_CAL_NEEDED) {
    calibrateRadio = true;
  }
}

void main(void)
{
  // Initialize RAIL ...

  // Application main loop
  while (1) {
    ...
    if (calibrateRadio) {
      // Run all pending calibrations, and save the results
      RAIL_Calibrate(railHandle, &calValues, RAIL_CAL_ALL_PENDING);
      calibrateRadio = false;
    }
    ...
  }
}

```

Alternatively, if the image rejection calibration for your radio can be determined ahead of time, such as by running the calibration on a separate firmware image on each chip, the following calibration process will result in smaller code. 

```c
static RAIL_IrCalValues_t irCalValues = {
  .rxIrCalValues = {
    RX_IRCAL_VALUE_RF_PATH0,
    RX_IRCAL_VALUE_RF_PATH1,
  },
  .txIrCalValues = {
    .dcOffsetIQ = TX_IRCAL_DC_OFFSET_IQ,
    .phiEpsilon = TX_IRCAL_PHI_EPSILON,
  },
};

void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Omitting other event handlers
  if (events & RAIL_EVENT_CAL_NEEDED) {
    RAIL_CalMask_t pendingCals = RAIL_GetPendingCal(railHandle);
    // Disable the radio if we have to do an offline calibration
    if (pendingCals & RAIL_CAL_TEMP_VC0) {
      (void) RAIL_CalibrateTemp(railHandle);
    }
    if (pendingCals & RAIL_CAL_ONETIME_IRCAL) {
      (void) RAIL_ApplyIrCalibrationAlt(rail_handle, &ir_cal_values, RAIL_ANTENNA_AUTO);
    }
  }
}

```

The IR calibration can be computed once and stored off or computed each time at startup. Because it is PHY-specific and provides sensitivity improvements, it is highly recommended. The IR calibration should only be run when the radio is IDLE.

The temperature-dependent calibrations are used to recalibrate the synth if the temperature crosses 0C or the temperature delta since the last calibration exceeds 70C while in receive. RAIL will run the VCO calibration automatically upon entering receive or transmit states, so the application can omit this calibration if the stack re-enters receive or transmit with enough frequency to avoid reaching the temperature delta. If the application does not calibrate for temperature, it's possible to miss receive packets due to a drift in the carrier frequency.

These APIs calibrate the radio. The RAIL library determines which calibrations are necessary. Calibrations can be enabled/disabled with the [sl_rail_cal_mask_t](calibration#sl-rail-cal-mask-t) parameter.

Some calibrations produce values that can be saved and reapplied to avoid repeating the calibration process.

Calibrations can either be run with [sl_rail_calibrate()](calibration#sl-rail-calibrate), or with the individual chip-specific calibration routines. An example for running code with [sl_rail_calibrate()](calibration#sl-rail-calibrate) looks like the following: 

```c
static sl_rail_cal_values_t cal_values = SL_RAIL_CALVALUES_UNINIT;
static volatile bool calibrateRadio = false;

void rail_events_callback(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Omitting other event handlers
  if (events & SL_RAIL_EVENT_CAL_NEEDED) {
    calibrateRadio = true;
  }
}

void main(void)
{
  // Initialize RAIL ...

  // Application main loop
  while (1) {
    ...
    if (calibrateRadio) {
      // Run all pending calibrations, and save the results
      sl_rail_calibrate(rail_handle, &cal_values, SL_RAIL_CAL_ALL_PENDING);
      calibrateRadio = false;
    }
    ...
  }
}

```

Alternatively, if the image rejection calibration for your radio can be determined ahead of time, such as by running the calibration on a separate firmware image on each chip, the following calibration process will result in smaller code. 

```c
static sl_rail_ir_cal_values_t ir_cal_values = {
  .rx_ir_cal_values = {
    RX_IRCAL_VALUE_RF_PATH0,
    RX_IRCAL_VALUE_RF_PATH1,
  },
  .tx_ir_cal_values = {
    .dc_offset_iq = TX_IRCAL_DC_OFFSET_IQ,
    .phi_epsilon  = TX_IRCAL_PHI_EPSILON,
  },
};

void rail_events_handler(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Omitting other event handlers
  if (events & SL_RAIL_EVENT_CAL_NEEDED) {
    sl_rail_cal_mask_t pending_cals = sl_rail_get_pending_cal(rail_handle);
    // Disable the radio if we have to do an offline calibration
    if (pending_cals & SL_RAIL_CAL_TEMP_VC0) {
      (void) sl_rail_calibrate_temp(rail_handle);
    }
    if (pending_cals & SL_RAIL_CAL_ONETIME_IRCAL) {
      (void) sl_rail_apply_ir_calibration(rail_handle, &ir_cal_values, SL_RAIL_ANTENNA_AUTO);
    }
  }
}

```

##### Modules

[RAIL_TxIrCalValues_t](rail-tx-ir-cal-values-t)

[RAIL_IrCalValues_t](rail-ir-cal-values-t)

[sl_rail_tx_ir_cal_values_t](sl-rail-tx-ir-cal-values-t)

[sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t)

[EFR32xG2x](calibration-efr32-xg2-x)

[SIxx3xx](calibration-sixx3-xx)

##### Typedefs

###### RAIL_CalMask_t

`RAIL_CalMask_t`

**Description:**

A calibration mask type.

**Details:**

This type is a bitmask of different RAIL calibration values. The exact meaning of these bits depends on what a particular chip supports.

**Deprecated**RAIL 2.x synonym of [sl_rail_cal_mask_t](calibration#sl-rail-cal-mask-t).

###### RAIL_RxIrCalValues_t

`typedef uint32_t RAIL_RxIrCalValues_t[2]`

**Description:**

RAIL_RxIrCalValues_t.

**Details:**

RX IR calibration values.

Platforms with fewer [RAIL_RF_PATHS](calibration-sixx3-xx#rail-rf-paths) than [RAIL_MAX_RF_PATHS](calibration#rail-max-rf-paths) will only respect and update [RAIL_RF_PATHS](calibration-sixx3-xx#rail-rf-paths) indices and ignore the rest.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_ir_cal_values_t](calibration#sl-rail-rx-ir-cal-values-t).

###### RAIL_CalValues_t

`RAIL_CalValues_t`

**Description:**

A calibration value structure.

**Details:**

This structure contains the set of persistent calibration values for EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) to force the code to compute that calibration value.

**Deprecated**RAIL 2.x synonym of [sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t).

###### sl_rail_cal_mask_t

`sl_rail_cal_mask_t`

**Description:**

A calibration mask type.

**Details:**

This type is a bitmask of different RAIL calibration values. The exact meaning of these bits depends on what a particular chip supports.

###### sl_rail_rx_ir_cal_values_t

`typedef uint32_t sl_rail_rx_ir_cal_values_t[2]`

**Description:**

sl_rail_rx_ir_cal_values_t

**Details:**

RX IR calibration values.

Platforms with fewer [SL_RAIL_RF_PATHS](calibration-sixx3-xx#sl-rail-rf-paths) than [SL_RAIL_MAX_RF_PATHS](calibration#sl-rail-max-rf-paths) will only respect and update [SL_RAIL_RF_PATHS](calibration-sixx3-xx#sl-rail-rf-paths) indices and ignore the rest.

###### sl_rail_cal_values_t

`sl_rail_cal_values_t`

**Description:**

A calibration value structure.

**Details:**

This structure contains the set of persistent calibration values for EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) to force the code to compute that calibration value.

##### Functions

###### RAIL_ConfigCal

`RAIL_Status_t RAIL_ConfigCal(RAIL_Handle_t railHandle, RAIL_CalMask_t calEnable)`

**Description:** Initialize RAIL calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_CalMask_t](calibration#rail-cal-mask-t)|[in]|calEnable|A bitmask that indicates which calibrations to enable for a callback notification. The exact meaning of these bits is radio-specific.|

**Returns**

- Status code indicating success of the function call.

Calibration initialization provides the calibration settings that correspond to the current radio configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_cal()](calibration#sl-rail-config-cal). 

###### RAIL_Calibrate

`RAIL_Status_t RAIL_Calibrate(RAIL_Handle_t railHandle, RAIL_CalValues_t *calValues, RAIL_CalMask_t calForce)`

**Description:** Start the calibration process.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_CalValues_t](calibration#rail-cal-values-t) *|[inout]|calValues|A pointer to a structure of calibration values to apply. If a valid calibration structure is provided and the structure contains valid calibration values, those values will be applied to the hardware and the RAIL library will cache those values for use again later. If a valid calibration structure is provided and the structure contains a calibration value of [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) for the desired calibration, the desired calibration will run, the calibration values structure will be updated with a valid calibration value, and the RAIL library will cache that value for use again later. If a NULL pointer is provided, the desired calibration will run and the RAIL library will cache that value for use again later. However, the valid calibration value will not be returned to the application.|
|[RAIL_CalMask_t](calibration#rail-cal-mask-t)|[in]|calForce|A mask to force specific calibration(s) to execute. To run all pending calibrations, use the value [RAIL_CAL_ALL_PENDING](calibration#rail-cal-all-pending). Only the calibrations specified will run, even if not enabled during initialization.|

**Returns**

- Status code indicating success of the function call.

If calibrations were performed previously and the application saves the calibration values (i.e., call this function with a calibration values structure containing calibration values of [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) before a reset), the application can later bypass the time it would normally take to recalibrate hardware by reusing previous calibration values (i.e., call this function with a calibration values structure containing valid calibration values after a reset).

Silicon Labs recommends calling this function from the application main loop.

If multiple protocols are used, this function will make the given railHandle active, if not already, and perform calibration. If called during a protocol switch, to perform an IR calibration for the first time, it will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state), in which case the application must defer calibration until after the protocol switch is complete.

**Note**

- Instead of this function, consider using the individual calibration-specific functions. Using the individual functions will allow for better dead-stripping if not all calibrations are run.
- Some calibrations should only be executed when the radio is IDLE. See chip-specific documentation for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_calibrate()](calibration#sl-rail-calibrate). 

###### RAIL_GetPendingCal

`RAIL_CalMask_t RAIL_GetPendingCal(RAIL_Handle_t railHandle)`

**Description:** Return the current set of pending calibrations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- A mask of all pending calibrations that the user has been asked to perform.

This function returns a full set of pending calibrations. The only way to clear pending calibrations is to perform them using the [RAIL_Calibrate()](calibration#rail-calibrate) API with the appropriate list of calibrations.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_pending_cal()](calibration#sl-rail-get-pending-cal). 

###### RAIL_ApplyIrCalibration

`RAIL_Status_t RAIL_ApplyIrCalibration(RAIL_Handle_t railHandle, uint32_t imageRejection)`

**Description:** Apply a given image rejection calibration value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t|[in]|imageRejection|The image rejection value to apply.|

**Returns**

- Status code indicating success of the function call.

Take an image rejection calibration value and apply it. This value should be determined from a previous run of [RAIL_CalibrateIr](calibration#rail-calibrate-ir) on the same physical device with the same radio configuration. The imageRejection value will also be stored to the [RAIL_ChannelConfigEntry_t::attr](rail-channel-config-entry-t#attr), if possible.

If multiple protocols are used, this function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called and the given railHandle is not active. In that case, the caller must attempt to re-call this function later.

**Deprecated**This previously-deprecated RAIL 2.x function has been replaced by [sl_rail_apply_ir_calibration()](calibration#sl-rail-apply-ir-calibration) with different parameters. 

###### RAIL_ApplyIrCalibrationAlt

`RAIL_Status_t RAIL_ApplyIrCalibrationAlt(RAIL_Handle_t railHandle, RAIL_IrCalValues_t *imageRejection, RAIL_AntennaSel_t rfPath)`

**Description:** Apply given image rejection calibration values.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IrCalValues_t](rail-ir-cal-values-t) *|[in]|imageRejection|A pointer to the image rejection values to apply.|
|[RAIL_AntennaSel_t](antenna-control#rail-antenna-sel-t)|[in]|rfPath|RF path(s) to calibrate.|

**Returns**

- Status code indicating success of the function call.

Take image rejection calibration values and apply them. These values should be determined from a previous run of [RAIL_CalibrateIrAlt()](calibration#rail-calibrate-ir-alt) on the same physical device with the same radio configuration. The imageRejection values will also be stored to the [RAIL_ChannelConfigEntry_t::attr](rail-channel-config-entry-t#attr), if possible.

**Note**

- : To make sure the imageRejection values are stored/configured correctly, [RAIL_ConfigAntenna()](antenna-control#rail-config-antenna) should be called before calling this API.

If multiple protocols are used, this function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called and the given railHandle is not active. In that case, the caller must attempt to re-call this function later.

**Deprecated**RAIL 2.x synonym of [sl_rail_apply_ir_calibration()](calibration#sl-rail-apply-ir-calibration). 

###### RAIL_CalibrateIr

`RAIL_Status_t RAIL_CalibrateIr(RAIL_Handle_t railHandle, uint32_t *imageRejection)`

**Description:** Run the image rejection calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t *|[out]|imageRejection|The result of the image rejection calibration.|

**Returns**

- Status code indicating success of the function call.

Run the image rejection calibration and apply the resulting value. If the imageRejection parameter is not NULL, store the value at that location. The imageRejection value will also be stored to the [RAIL_ChannelConfigEntry_t::attr](rail-channel-config-entry-t#attr), if possible. This is a long-running calibration that adds significant code space when run and can be run with a separate firmware image on each device to save code space in the final image. Silicon Labs recommends calling this function from the application main loop.

If multiple protocols are used, this function will make the given railHandle active, if not already, and perform calibration. If called during a protocol switch, it will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state). In this case, [RAIL_ApplyIrCalibration](calibration#rail-apply-ir-calibration) may be called to apply a previously determined IR calibration value, or the app must defer calibration until the protocol switch is complete.

**Deprecated**This previously-deprecated RAIL 2.x function has been replaced by [sl_rail_calibrate_ir](calibration#sl-rail-calibrate-ir) with different parameters. 

###### RAIL_CalibrateIrAlt

`RAIL_Status_t RAIL_CalibrateIrAlt(RAIL_Handle_t railHandle, RAIL_IrCalValues_t *imageRejection, RAIL_AntennaSel_t rfPath)`

**Description:** Run the image rejection calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IrCalValues_t](rail-ir-cal-values-t) *|[out]|imageRejection|A pointer to the image rejection results.|
|[RAIL_AntennaSel_t](antenna-control#rail-antenna-sel-t)|[in]|rfPath|RF path(s) to calibrate.|

**Returns**

- Status code indicating success of the function call.

Run the image rejection calibration and apply the resulting values. If the imageRejection parameter is not NULL, store the values at that location. The imageRejection values will also be stored to the [RAIL_ChannelConfigEntry_t::attr](rail-channel-config-entry-t#attr), if possible. This is a long-running calibration that adds significant code space when run and can be run with a separate firmware image on each device to save code space in the final image. Silicon Labs recommends calling this function from the application main loop.

**Note**

- : To make sure the imageRejection values are stored/configured correctly, [RAIL_ConfigAntenna()](antenna-control#rail-config-antenna) should be called before calling this API.

If multiple protocols are used, this function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called and the given railHandle is not active. In that case, the caller must attempt to re-call this function later.

**Deprecated**RAIL 2.x synonym of [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir). 

###### RAIL_CalibrateTemp

`RAIL_Status_t RAIL_CalibrateTemp(RAIL_Handle_t railHandle)`

**Description:** Run the temperature calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Run the temperature calibration, which needs to recalibrate the synth if the temperature crosses 0C or the temperature delta since the last calibration exceeds 70C while in receive. RAIL will run the VCO calibration automatically upon entering receive or transmit states, so the application can omit this calibration if the stack re-enters receive or transmit with enough frequency to avoid reaching the temperature delta. If the application does not calibrate for temperature, it's possible to miss receive packets due to a drift in the carrier frequency.

If multiple protocols are used, this function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called and the given railHandle is not active. In that case, the calibration will be automatically performed next time the radio enters receive.

**Note**

- If RX channel hopping is enabled this function may trigger a channel hop, which can result in [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete) occuring before it returns.

**Deprecated**RAIL 2.x synonym of [sl_rail_calibrate_temp()](calibration#sl-rail-calibrate-temp). 

###### RAIL_CalibrateHFXO

`RAIL_Status_t RAIL_CalibrateHFXO(RAIL_Handle_t railHandle, int8_t *crystalPPMError)`

**Description:** Performs HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int8_t *|[out]|crystalPPMError|A pointer for RAIL to store the current deviation that has been corrected, measured in PPM. May be NULL.|

**Returns**

- Status code indicating the result of the function call.

Compute the PPM correction using the thermistor value available when [RAIL_EVENT_THERMISTOR_DONE](events#rail-event-thermistor-done) occurs, after [RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement) call. Then correct the RF frequency as well as TX and RX sampling.

This function calls the following RAIL functions in sequence saving having to call them individually:

- [RAIL_ConvertThermistorImpedance()](external-thermistor#rail-convert-thermistor-impedance)
- [RAIL_ComputeHFXOPPMError()](external-thermistor#rail-compute-hfxoppm-error)
- [RAIL_CompensateHFXO()](external-thermistor#rail-compensate-hfxo)

**Note**

- This function makes the radio idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_calibrate_hfxo()](calibration#sl-rail-calibrate-hfxo). 

###### RAIL_EnablePaCal

`void RAIL_EnablePaCal(bool enable)`

**Description:** Enable/disable the PA calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|bool|[in]|enable|Enables/disables the PA calibration.|

Enabling will ensure that the PA power remains constant chip-to-chip. This feature is enabled by default on Series-2 platforms.

On EFR32xG21 and EFR32xG24 platforms, particularly the 20 dBm variants, it is recommended to keep this feature enabled in order to utilize the chip-specific calibrations designated for the chip.

The chip-specific define SL_RAIL_UTIL_PA_CALIBRATION_ENABLE in the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) plugin also enables/disables PA calibrations on initialization, which can override the default state of the feature.

**Note**

- Call this function before [RAIL_ConfigTxPower()](pa#rail-config-tx-power) if this feature is not desired.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_enable_pa_cal()](calibration#sl-rail-enable-pa-cal) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_BLE_CalibrateIr

`RAIL_Status_t RAIL_BLE_CalibrateIr(RAIL_Handle_t railHandle, uint32_t *imageRejection)`

**Description:** Calibrate image rejection for Bluetooth Low Energy.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t *|[out]|imageRejection|A pointer to where the result of the image rejection calibration will be stored.|

**Returns**

- Status code indicating success of the function call.

Some chips have protocol-specific image rejection calibrations programmed into their flash. This function will either get the value from flash and apply it, or run the image rejection algorithm to find the value.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_calibrate_ir()](calibration#sl-rail-ble-calibrate-ir). 

###### RAIL_IEEE802154_CalibrateIr2p4Ghz

`RAIL_Status_t RAIL_IEEE802154_CalibrateIr2p4Ghz(RAIL_Handle_t railHandle, uint32_t *imageRejection)`

**Description:** Calibrate image rejection for IEEE 802.15.4 2.4 GHz.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t *|[out]|imageRejection|A pointer to the result of the image rejection calibration.|

**Returns**

- Status code indicating success of the function call.

Some chips have protocol-specific image rejection calibrations programmed into their flash. This function will either get the value from flash and apply it, or run the image rejection algorithm to find the value.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_calibrate_ir_2p4_ghz()](calibration#sl-rail-ieee802154-calibrate-ir-2p4-ghz). 

###### RAIL_IEEE802154_CalibrateIrSubGhz

`RAIL_Status_t RAIL_IEEE802154_CalibrateIrSubGhz(RAIL_Handle_t railHandle, uint32_t *imageRejection)`

**Description:** Calibrate image rejection for IEEE 802.15.4 915 MHz and 868 MHz.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t *|[out]|imageRejection|The result of the image rejection calibration.|

**Returns**

- Status code indicating success of the function call.

Some chips have protocol-specific image rejection calibrations programmed into their flash. This function will either get the value from flash and apply it, or run the image rejection algorithm to find the value.

**Deprecated**Use [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir) instead. 

###### sl_rail_config_cal

`sl_rail_status_t sl_rail_config_cal(sl_rail_handle_t rail_handle, sl_rail_cal_mask_t cal_enable_mask)`

**Description:** Initialize RAIL calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_cal_mask_t](calibration#sl-rail-cal-mask-t)|[in]|cal_enable_mask|A bitmask that indicates which calibrations to enable for a callback notification. The exact meaning of these bits is radio-specific.|

**Returns**

- Status code indicating success of the function call.

Calibration initialization provides the calibration settings that correspond to the current radio configuration. 

###### sl_rail_calibrate

`sl_rail_status_t sl_rail_calibrate(sl_rail_handle_t rail_handle, sl_rail_cal_values_t *p_cal_values, sl_rail_cal_mask_t cal_force_mask)`

**Description:** Start the calibration process.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_cal_values_t](calibration#sl-rail-cal-values-t) *|[inout]|p_cal_values|A pointer to a structure of calibration values to apply. If a valid calibration structure is provided and the structure contains valid calibration values, those values will be applied to the hardware and the RAIL library will cache those values for use again later. If a valid calibration structure is provided and the structure contains a calibration value of [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) for the desired calibration, the desired calibration will run, the calibration values structure will be updated with a valid calibration value, and the RAIL library will cache that value for use again later. If a NULL pointer is provided, the desired calibration will run and the RAIL library will cache that value for use again later. However, the valid calibration value will not be returned to the application.|
|[sl_rail_cal_mask_t](calibration#sl-rail-cal-mask-t)|[in]|cal_force_mask|A mask to force specific calibration(s) to execute. To run all pending calibrations, use the value [SL_RAIL_CAL_ALL_PENDING](calibration#sl-rail-cal-all-pending). Only the calibrations specified will run, even if not enabled during initialization.|

**Returns**

- Status code indicating success of the function call.

If calibrations were performed previously and the application saves the calibration values (i.e., call this function with a calibration values structure containing calibration values of [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) before a reset), the application can later bypass the time it would normally take to recalibrate hardware by reusing previous calibration values (i.e., call this function with a calibration values structure containing valid calibration values after a reset).

Silicon Labs recommends calling this function from the application main loop.

If multiple protocols are used, this function will make the given rail_handle active, if not already, and perform calibration. If called during a protocol switch, to perform an IR calibration for the first time, it will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state), in which case the application must defer calibration until after the protocol switch is complete.

**Note**

- Instead of this function, consider using the individual calibration-specific functions. Using the individual functions will allow for better dead-stripping if not all calibrations are run.
- Some calibrations should only be executed when the radio is IDLE. See chip-specific documentation for more details.

###### sl_rail_get_pending_cal

`sl_rail_cal_mask_t sl_rail_get_pending_cal(sl_rail_handle_t rail_handle)`

**Description:** Return the current set of pending calibrations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- A mask of all pending calibrations that the user has been asked to perform.

This function returns a full set of pending calibrations. The only way to clear pending calibrations is to perform them using the [sl_rail_calibrate()](calibration#sl-rail-calibrate) API with the appropriate list of calibrations. 

###### sl_rail_apply_ir_calibration

`sl_rail_status_t sl_rail_apply_ir_calibration(sl_rail_handle_t rail_handle, sl_rail_ir_cal_values_t *p_image_rejection, sl_rail_antenna_sel_t rf_path)`

**Description:** Apply given image rejection calibration values.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t) *|[in]|p_image_rejection|A pointer to the image rejection values to apply.|
|[sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t)|[in]|rf_path|RF path(s) to calibrate.|

**Returns**

- Status code indicating success of the function call.

Take image rejection calibration values and apply them. These values should be determined from a previous run of [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir) on the same physical device with the same radio configuration. The p_image_rejection values will also be stored to the [sl_rail_channel_config_entry_t::p_attr](sl-rail-channel-config-entry-t#p-attr), if possible.

**Note**

- : To make sure the p_image_rejection value is stored/configured correctly, [sl_rail_config_antenna()](antenna-control#sl-rail-config-antenna) should be called before calling this API.

If multiple protocols are used, this function will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is called and the given rail_handle is not active. In that case, the caller must attempt to re-call this function later. 

###### sl_rail_calibrate_ir

`sl_rail_status_t sl_rail_calibrate_ir(sl_rail_handle_t rail_handle, sl_rail_ir_cal_values_t *p_image_rejection, sl_rail_antenna_sel_t rf_path)`

**Description:** Run the image rejection calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t) *|[out]|p_image_rejection|A pointer to the image rejection results.|
|[sl_rail_antenna_sel_t](antenna-control#sl-rail-antenna-sel-t)|[in]|rf_path|RF path(s) to calibrate.|

**Returns**

- Status code indicating success of the function call.

Run the image rejection calibration and apply the resulting values. If the p_image_rejection parameter is not NULL, store the values at that location. The p_image_rejection values will also be stored to the [sl_rail_channel_config_entry_t::p_attr](sl-rail-channel-config-entry-t#p-attr), if possible. This is a long-running calibration that adds significant code space when run and can be run with a separate firmware image on each device to save code space in the final image. Silicon Labs recommends calling this function from the application main loop.

**Note**

- : To make sure the p_image_rejection values are stored/configured correctly, [sl_rail_config_antenna()](antenna-control#sl-rail-config-antenna) should be called before calling this API.

If multiple protocols are used, this function will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is called and the given rail_handle is not active. In that case, the caller must attempt to re-call this function later. 

###### sl_rail_calibrate_temp

`sl_rail_status_t sl_rail_calibrate_temp(sl_rail_handle_t rail_handle)`

**Description:** Run the temperature calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Run the temperature calibration, which needs to recalibrate the synth if the temperature crosses 0C or the temperature delta since the last calibration exceeds 70C while in receive. RAIL will run the VCO calibration automatically upon entering receive or transmit states, so the application can omit this calibration if the stack re-enters receive or transmit with enough frequency to avoid reaching the temperature delta. If the application does not calibrate for temperature, it's possible to miss receive packets due to a drift in the carrier frequency.

If multiple protocols are used, this function will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is called and the given rail_handle is not active. In that case, the calibration will be automatically performed next time the radio enters receive.

**Note**

- If RX channel hopping is enabled this function may trigger a channel hop, which can result in [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#sl-rail-event-rx-channel-hopping-complete) occuring before it returns.

###### sl_rail_calibrate_hfxo

`sl_rail_status_t sl_rail_calibrate_hfxo(sl_rail_handle_t rail_handle, int8_t *p_crystal_error_ppm)`

**Description:** Performs HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|int8_t *|[out]|p_crystal_error_ppm|A pointer for RAIL to store the current deviation that has been corrected, measured in PPM. May be NULL.|

**Returns**

- Status code indicating the result of the function call.

Compute the PPM correction using the thermistor value available when [SL_RAIL_EVENT_THERMISTOR_DONE](events#sl-rail-event-thermistor-done) occurs, after [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement) call. Then correct the RF frequency as well as TX and RX sampling.

This function calls the following RAIL functions in sequence saving having to call them individually:

- [sl_railcb_convert_thermistor_impedance()](external-thermistor#sl-railcb-convert-thermistor-impedance)
- [sl_railcb_compute_hfxo_error_ppm()](external-thermistor#sl-railcb-compute-hfxo-error-ppm)
- [sl_rail_compensate_hfxo()](external-thermistor#sl-rail-compensate-hfxo)

**Note**

- This function makes the radio idle.

###### sl_rail_enable_pa_cal

`void sl_rail_enable_pa_cal(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable/disable the PA calibration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Enables/disables the PA calibration.|

Enabling will ensure that the PA power remains constant chip-to-chip. This feature is enabled by default after reset.

On EFR32xG21 and EFR32xG24 platforms, particularly the 20 dBm variants, it is recommended to keep this feature enabled in order to utilize the chip-specific calibrations designated for the chip.

The chip-specific define SL_RAIL_UTIL_PA_CALIBRATION_ENABLE in the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) plugin also enables/disables PA calibrations on initialization, which can override the default state of the feature.

**Note**

- Call this function before [sl_rail_config_tx_power()](pa#sl-rail-config-tx-power) if this feature is not desired.

###### sl_rail_ble_calibrate_ir

`sl_rail_status_t sl_rail_ble_calibrate_ir(sl_rail_handle_t rail_handle, uint32_t *p_image_rejection)`

**Description:** Calibrate image rejection for Bluetooth Low Energy.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint32_t *|[out]|p_image_rejection|A pointer to where the result of the image rejection calibration will be stored.|

**Returns**

- Status code indicating success of the function call.

Some chips have protocol-specific image rejection calibrations programmed into their flash. This function will either get the value from flash and apply it, or run the image rejection algorithm to find the value. 

###### sl_rail_ieee802154_calibrate_ir_2p4_ghz

`sl_rail_status_t sl_rail_ieee802154_calibrate_ir_2p4_ghz(sl_rail_handle_t rail_handle, uint32_t *p_image_rejection)`

**Description:** Calibrate image rejection for IEEE 802.15.4 2.4 GHz.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint32_t *|[out]|p_image_rejection|A pointer to the result of the image rejection calibration.|

**Returns**

- Status code indicating success of the function call.

Some chips have protocol-specific image rejection calibrations programmed into their flash. This function will either get the value from flash and apply it, or run the image rejection algorithm to find the value. 

##### Macros

`#define RAIL_CAL_TEMP_VCO (0x00000001U)`

**Description**: EFR32-specific temperature calibration bit.

`#define RAIL_CAL_TEMP_HFXO (0x00000002U)`

**Description**: EFR32-specific HFXO temperature check bit.

`#define RAIL_CAL_COMPENSATE_HFXO (0x00000004U)`

**Description**: EFR32-specific HFXO compensation bit.

`#define RAIL_CAL_RX_IRCAL (0x00010000U)`

**Description**: EFR32-specific IR calibration bit.

`#define RAIL_CAL_OFDM_TX_IRCAL (0x00100000U)`

**Description**: EFR32-specific Tx IR calibration bit.

`#define RAIL_CAL_ONETIME_IRCAL (RAIL_CAL_RX_IRCAL | RAIL_CAL_OFDM_TX_IRCAL)`

**Description**: A mask to run EFR32-specific IR calibrations.

`#define RAIL_CAL_TEMP (RAIL_CAL_TEMP_VCO | RAIL_CAL_TEMP_HFXO | RAIL_CAL_COMPENSATE_HFXO)`

**Description**: A mask to run temperature-dependent calibrations.

`#define RAIL_CAL_ONETIME (RAIL_CAL_ONETIME_IRCAL)`

**Description**: A mask to run one-time calibrations.

`#define RAIL_CAL_PERF (0)`

**Description**: A mask to run optional performance calibrations.

`#define RAIL_CAL_OFFLINE (RAIL_CAL_ONETIME_IRCAL)`

**Description**: A mask for calibrations that require the radio to be off.

`#define RAIL_CAL_ALL (RAIL_CAL_TEMP | RAIL_CAL_ONETIME)`

**Description**: A mask to run all possible calibrations for this chip.

`#define RAIL_CAL_ALL_PENDING (0x00000000U)`

**Description**: A mask to run all pending calibrations.

`#define RAIL_CAL_INVALID_VALUE (0xFFFFFFFFU)`

**Description**: An invalid calibration value.

`#define RAIL_MAX_RF_PATHS 2`

**Description**: Indicates the maximum number of RF Paths supported across all platforms.

`#define RAIL_IRCALVALUES_RX_UNINIT `

**Description**: A define to set all [RAIL_RxIrCalValues_t](calibration#rail-rx-ir-cal-values-t) values to uninitialized.

`#define RAIL_IRCALVALUES_TX_UNINIT `

**Description**: A define to set all [RAIL_TxIrCalValues_t](rail-tx-ir-cal-values-t) values to uninitialized.

`#define RAIL_IRCALVALUES_UNINIT `

**Description**: A define to set all [RAIL_IrCalValues_t](rail-ir-cal-values-t) values to uninitialized.

`#define RAIL_IRCALVAL (irCalStruct, rfPath)`

**Description**: A define allowing Rx calibration value access compatibility between non-OFDM and OFDM platforms.

`#define RAIL_CALVALUES_UNINIT RAIL_IRCALVALUES_UNINIT`

**Description**: A define to set all [RAIL_CalValues_t](calibration#rail-cal-values-t) values to uninitialized.

`#define RAIL_PACTUNE_IGNORE (255U)`

**Description**: Use this value with either TX or RX values in [RAIL_SetPaCTune()](radio-configuration#rail-set-pa-c-tune) to use whatever value is already set and do no update.

`#define SL_RAIL_CAL_TEMP_VCO (0x00000001U)`

**Description**: EFR32-specific temperature calibration bit.

`#define SL_RAIL_CAL_TEMP_HFXO (0x00000002U)`

**Description**: EFR32-specific HFXO temperature check bit.

`#define SL_RAIL_CAL_COMPENSATE_HFXO (0x00000004U)`

**Description**: EFR32-specific HFXO compensation bit.

`#define SL_RAIL_CAL_RX_IR_CAL (0x00010000U)`

**Description**: EFR32-specific IR calibration bit.

`#define SL_RAIL_CAL_OFDM_TX_IR_CAL (0x00100000U)`

**Description**: EFR32-specific Tx IR calibration bit.

`#define SL_RAIL_CAL_ONETIME_IR_CAL (SL_RAIL_CAL_RX_IR_CAL | SL_RAIL_CAL_OFDM_TX_IR_CAL)`

**Description**: A mask to run EFR32-specific IR calibrations.

`#define SL_RAIL_CAL_TEMP (SL_RAIL_CAL_TEMP_VCO | SL_RAIL_CAL_TEMP_HFXO | SL_RAIL_CAL_COMPENSATE_HFXO)`

**Description**: A mask to run temperature-dependent calibrations.

`#define SL_RAIL_CAL_ONETIME (SL_RAIL_CAL_ONETIME_IR_CAL)`

**Description**: A mask to run one-time calibrations.

`#define SL_RAIL_CAL_PERF (0)`

**Description**: A mask to run optional performance calibrations.

`#define SL_RAIL_CAL_OFFLINE (SL_RAIL_CAL_ONETIME_IR_CAL)`

**Description**: A mask for calibrations that require the radio to be off.

`#define SL_RAIL_CAL_ALL (SL_RAIL_CAL_TEMP | SL_RAIL_CAL_ONETIME)`

**Description**: A mask to run all possible calibrations for this chip.

`#define SL_RAIL_CAL_ALL_PENDING (0x00000000U)`

**Description**: A mask to run all pending calibrations.

`#define SL_RAIL_CAL_INVALID_VALUE (0xFFFFFFFFU)`

**Description**: An invalid calibration value.

`#define SL_RAIL_MAX_RF_PATHS 2`

**Description**: Indicates the maximum number of RF Paths supported across all platforms.

`#define SL_RAIL_RX_IR_CAL_VALUES_UNINIT `

**Description**: A define to set all [sl_rail_rx_ir_cal_values_t](calibration#sl-rail-rx-ir-cal-values-t) values to uninitialized.

`#define SL_RAIL_TX_IR_CAL_VALUES_UNINIT `

**Description**: A define to set all [sl_rail_tx_ir_cal_values_t](sl-rail-tx-ir-cal-values-t) values to uninitialized.

`#define SL_RAIL_IR_CAL_VALUES_UNINIT `

**Description**: A define to set all [sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t) values to uninitialized.

`#define SL_RAIL_IR_CAL_VAL (ir_cal_struct, rf_path)`

**Description**: A define allowing Rx calibration value access compatibility between non-OFDM and OFDM platforms.

`#define SL_RAIL_CAL_VALUES_UNINIT SL_RAIL_IR_CAL_VALUES_UNINIT`

**Description**: A define to set all [sl_rail_cal_values_t](calibration#sl-rail-cal-values-t) values to uninitialized.

A Tx IR calibration value structure. 

This definition contains the set of persistent calibration values for OFDM on EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) to force the code to compute that calibration value.

Only supported on platforms with [RAIL_SUPPORTS_OFDM_PA](features#rail-supports-ofdm-pa) enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t](sl-rail-tx-ir-cal-values-t). 

###### Public Attributes

###### dcOffsetIQ (heading level 7)

```
uint32_t RAIL_TxIrCalValues_t::dcOffsetIQ
```

**Description:** Tx IR Cal result.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t::dc_offset_iq](sl-rail-tx-ir-cal-values-t#dc-offset-iq).

###### phiEpsilon (heading level 7)

```
uint32_t RAIL_TxIrCalValues_t::phiEpsilon
```

**Description:** Tx IR Cal result.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_ir_cal_values_t::phi_epsilon](sl-rail-tx-ir-cal-values-t#phi-epsilon).

An IR calibration value structure. 

This definition contains the set of persistent calibration values for EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) to force the code to compute that calibration value.

**Deprecated**RAIL 2.x synonym of [sl_rail_ir_cal_values_t](sl-rail-ir-cal-values-t). 

###### Public Attributes

###### rxIrCalValues (heading level 7)

```
RAIL_RxIrCalValues_t RAIL_IrCalValues_t::rxIrCalValues
```

**Description:** RX Image Rejection (IR) calibration value(s).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ir_cal_values_t::rx_ir_cal_values](sl-rail-ir-cal-values-t#rx-ir-cal-values).

###### txIrCalValues (heading level 7)

```
RAIL_TxIrCalValues_t RAIL_IrCalValues_t::txIrCalValues
```

**Description:** TX Image Rejection (IR) calibration value(s) for OFDM.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ir_cal_values_t::tx_ir_cal_values](sl-rail-ir-cal-values-t#tx-ir-cal-values).

A Tx IR calibration value structure. 

This definition contains the set of persistent calibration values for OFDM on EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) to force the code to compute that calibration value.

Only supported on platforms with [SL_RAIL_SUPPORTS_OFDM_PA](features#sl-rail-supports-ofdm-pa-1) enabled. 

###### Public Attributes

###### dc_offset_iq (heading level 7)

```
uint32_t sl_rail_tx_ir_cal_values_t::dc_offset_iq
```

**Description:** Tx IR Cal result.

###### phi_epsilon (heading level 7)

```
uint32_t sl_rail_tx_ir_cal_values_t::phi_epsilon
```

**Description:** Tx IR Cal result.

An IR calibration value structure. 

This definition contains the set of persistent calibration values for EFR32. You can set these beforehand and apply them at startup to save the time required to compute them. Any of these values may be set to [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) to force the code to compute that calibration value. 

###### Public Attributes

###### rx_ir_cal_values (heading level 7)

```
sl_rail_rx_ir_cal_values_t sl_rail_ir_cal_values_t::rx_ir_cal_values
```

**Description:** RX Image Rejection (IR) calibration value(s).

###### tx_ir_cal_values (heading level 7)

```
sl_rail_tx_ir_cal_values_t sl_rail_ir_cal_values_t::tx_ir_cal_values
```

**Description:** TX Image Rejection (IR) calibration value(s) for OFDM.

##### EFR32xG2x

EFR32xG2x-specific Calibrations. 

###### Modules

[RAIL_ChannelConfigEntryAttr](rail-channel-config-entry-attr)

[sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr)

###### Macros

`#define RAIL_RF_PATHS_2P4GIG 0`

**Description**: Indicates the number of 2.4 GHz RF Paths suppported.

`#define RAIL_RF_PATHS_SUBGIG 0`

**Description**: Indicates the number of Sub-GHz RF Paths supported.

`#define RAIL_RF_PATHS (RAIL_RF_PATHS_SUBGIG + RAIL_RF_PATHS_2P4GIG)`

**Description**: Indicates the number of RF Paths supported.

`#define RADIO_CONFIG_ENABLE_IRCAL_MULTIPLE_RF_PATHS 0`

**Description**: Indicates this version of RAIL supports IR calibration on multiple RF paths Needed for backwards compatibility.

`#define SL_RAIL_RF_PATHS_2P4_GHZ 0`

**Description**: Indicates the number of 2.4 GHz RF Paths suppported.

`#define SL_RAIL_RF_PATHS_SUB_GHZ 0`

**Description**: Indicates the number of Sub-GHz RF Paths supported.

`#define SL_RAIL_RF_PATHS (SL_RAIL_RF_PATHS_SUB_GHZ + SL_RAIL_RF_PATHS_2P4_GHZ)`

**Description**: Indicates the number of RF Paths supported.

`#define SL_RAIL_RADIO_CONFIG_ENABLE_IR_CAL_MULTIPLE_RF_PATHS 0`

**Description**: Indicates this version of RAIL supports IR calibration on multiple RF paths Needed for backwards compatibility.

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time.

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr). 

Items listed are designed to be altered and updated during run-time.

**Deprecated**RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr). 

###### Public Attributes (heading level 7)

###### calValues (heading level 8)

```
RAIL_RxIrCalValues_t RAIL_ChannelConfigEntryAttr_t::calValues
```

**Description:** IR calibration attributes specific to each channel configuration entry.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values). 

RAIL_SUPPORTS_OFDM_PA

**Deprecated**RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values). 

RAIL_SUPPORTS_OFDM_PA

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time. 

###### Public Attributes (heading level 7)

###### rx_ir_cal_values (heading level 8)

```
sl_rail_rx_ir_cal_values_t sl_rail_channel_config_entry_attr_t::rx_ir_cal_values
```

**Description:** IR calibration attributes specific to each channel configuration entry.

**Details:** SL_RAIL_SUPPORTS_OFDM_PA

##### SIxx3xx

SIxx3xx-specific Calibrations. 

###### Modules

[RAIL_ChannelConfigEntryAttr](rail-channel-config-entry-attr)

[sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr)

###### Macros

`#define RAIL_RF_PATHS_2P4GIG 0`

**Description**: Indicates the number of 2.4 GHz RF Paths suppported.

`#define RAIL_RF_PATHS_SUBGIG 0`

**Description**: Indicates the number of Sub-GHz RF Paths supported.

`#define RAIL_RF_PATHS (RAIL_RF_PATHS_SUBGIG + RAIL_RF_PATHS_2P4GIG)`

**Description**: Indicates the number of RF Paths supported.

`#define RADIO_CONFIG_ENABLE_IRCAL_MULTIPLE_RF_PATHS 0`

**Description**: Indicates this version of RAIL supports IR calibration on multiple RF paths Needed for backwards compatibility.

`#define SL_RAIL_RF_PATHS_2P4_GHZ 0`

**Description**: Indicates the number of 2.4 GHz RF Paths suppported.

`#define SL_RAIL_RF_PATHS_SUB_GHZ 0`

**Description**: Indicates the number of Sub-GHz RF Paths supported.

`#define SL_RAIL_RF_PATHS (SL_RAIL_RF_PATHS_SUB_GHZ + SL_RAIL_RF_PATHS_2P4_GHZ)`

**Description**: Indicates the number of RF Paths supported.

`#define SL_RAIL_RADIO_CONFIG_ENABLE_IR_CAL_MULTIPLE_RF_PATHS 0`

**Description**: Indicates this version of RAIL supports IR calibration on multiple RF paths Needed for backwards compatibility.

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time.

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr). 

Items listed are designed to be altered and updated during run-time.

**Deprecated**RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr](sl-rail-channel-config-entry-attr). 

###### Public Attributes (heading level 7)

###### calValues (heading level 8)

```
RAIL_RxIrCalValues_t RAIL_ChannelConfigEntryAttr_t::calValues
```

**Description:** IR calibration attributes specific to each channel configuration entry.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values). 

RAIL_SUPPORTS_OFDM_PA

**Deprecated**RAIL 2.x. synonym of [sl_rail_channel_config_entry_attr::rx_ir_cal_values](sl-rail-channel-config-entry-attr#rx-ir-cal-values). 

RAIL_SUPPORTS_OFDM_PA

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time. 

###### Public Attributes (heading level 7)

###### rx_ir_cal_values (heading level 8)

```
sl_rail_rx_ir_cal_values_t sl_rail_channel_config_entry_attr_t::rx_ir_cal_values
```

**Description:** IR calibration attributes specific to each channel configuration entry.

**Details:** SL_RAIL_SUPPORTS_OFDM_PA

#### Chip-Specific

Chip-Specific RAIL APIs, types, and information. 

##### Modules

[RAIL_EFR32xG2x_Interrupts](rail-efr32x-g2x-interrupts)

[sl_rail_efr32xg2x_interrupts](sl-rail-efr32xg2x-interrupts)

[sl_rail_sixg3xx_interrupts](sl-rail-sixg3xx-interrupts)

EFR32xG2x-specific interrupt sources. 

Below are the interrupt handlers implemented within the RAIL library for EFR32 Series 2. See [EFR32](efr32-main) for more details about interrupt initialization and priorities. For more information about the interrupt vectors and where they are on your specific chip, see the startup_efr32xg2xx.c file for your chip. These can be found under the Device/SiliconLabs folder in your release.

**Warnings**

- [RAC_RSM_IRQHandler()](rail-efr32x-g2x-interrupts#rac-rsm-irq-handler) and [RAC_SEQ_IRQHandler()](rail-efr32x-g2x-interrupts#rac-seq-irq-handler) must be set to the same priority level.

###### Public Functions

###### FRC_PRI_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::FRC_PRI_IRQHandler(void)`

**Description:** RAIL interrupt handler for the high-priority FRC_PRI interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the FRC High Priority. It is not used at this time.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### FRC_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::FRC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the normal-priority FRC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles packet completion events for the transmit side. The receive side events are queued and processed in the [BUFC_IRQHandler](rail-efr32x-g2x-interrupts#bufc-irq-handler). The following events are currently in use:

- TX Completed  
  - This event cannot be disabled and is used to clean up after a transmit event. If enabled, one of the following events will be generated after transmit completion: [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent), [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted), [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked), or [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow).
- TX Ack Completed  
  - This event is only turned on if the user calls [RAIL_ConfigEvents()](events#rail-config-events) with one of [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent), [RAIL_EVENT_TXACK_ABORTED](events#rail-event-txack-aborted), [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked), or [RAIL_EVENT_TXACK_UNDERFLOW](events#rail-event-txack-underflow). If enabled, the corresponding event will be generated when an Ack completes.

###### MODEM_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::MODEM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the MODEM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles demodulator and modulator status and error events. The following events are currently in use:

- Preamble Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect). This event will call the RAIL eventsCallback when a preamble is detected by the demodulator if enabled.
- Preamble Lost  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost). This event will call the RAIL eventsCallback when a preamble is lost by the demodulator if enabled.
- Timing Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_TIMING_DETECT](events#rail-event-rx-timing-detect). This event will call the RAIL eventsCallback when timing is detected by the demodulator if enabled.
- Timing Lost  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_TIMING_LOST](events#rail-event-rx-timing-lost). This event will call the RAIL eventsCallback when timing is lost by the demodulator if enabled.
- Sync 1 Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_SYNC1_DETECT](events#rail-event-rx-sync1-detect). This event will call the RAIL eventsCallback when sync word 1 is detected by the demodulator if enabled.
- Sync 2 Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_SYNC2_DETECT](events#rail-event-rx-sync2-detect). This event will call the RAIL eventsCallback when sync word 2 is detected by the demodulator if enabled.

###### RAC_SEQ_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RAC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio sequencer. The following events are currently in use:

- RX timeout  
  - This event cannot be disabled and occurs when a receive timeout, as configured via [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing)[RAIL_StateTiming_t::rxSearchTimeout](rail-state-timing-t#rx-search-timeout) or [RAIL_StateTiming_t::txToRxSearchTimeout](rail-state-timing-t#tx-to-rx-search-timeout), expires and the radio exits receive. This event will call the generic callback if [RAIL_EVENT_RX_TIMEOUT](events#rail-event-rx-timeout) is enabled.
- Ack Timeout  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout). This event is only available when using [Auto-Ack](auto-ack) or [IEEE 802.15.4](ieee802-15-4) and will call the eventsCallback whenever an Ack packet is not received within the Ack timeout window.
- Address Filtering Passed  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed). This event is only enabled when using [Address Filtering](address-filtering) and will call the generic callback whenever a packet passes the filtering criteria.
- IEEE802154 Frame Pending  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command). This event is only available when in [IEEE 802.15.4](ieee802-15-4) mode and will call the eventsCallback whenever a data request packet is received so you can set a frame-pending indicator in the outgoing Ack.
- Temperature Calibration  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_CAL_NEEDED](events#rail-event-cal-needed). This event will fire whenever the temperature changes enough to require recalibration during the RX state.

###### RAC_RSM_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RAC_RSM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RAC_RSM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio state machine. The following events are currently in use:

- Radio State Changed  
  - Enabled in some debug modes.

###### BUFC_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::BUFC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the BUFC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio buffer controller. The following events are currently in use:

- RX Buffer Threshold  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full). This event will trigger an eventsCallback when the contents of the receive buffer exceed the receive buffer threshold set by [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold).
- RX Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX buffer. It should not occur in normal operation as all receive APIs protect against it.
- RX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX buffer have become corrupt. This event should not occur in normal operation.
- TX Buffer Threshold  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty). This event will trigger an eventsCallback when the contents of the transmit buffer fall beneath the transmit threshold set by [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold).
- TX Buffer Overflow  
  - This event cannot be disabled and indicates too much data was placed into the TX buffer. This event should not occur in normal operation as all transmit APIs protect against it.
- TX Buffer Underflow  
  - This event cannot be disabled and occurs when the transmit FIFO runs out of bytes before the end of the packet. This event will always perform any necessary cleanup and will call the eventsCallback if [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) is enabled.
- TX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the TX buffer have become corrupt. This event should not occur in normal operation.
- RX Entry Buffer Threshold  
  - This event cannot be disabled when in receive mode and is used to indicate that a new packet is available in the receive buffer. This event will call the eventsCallback with any of the following if they are enabled: [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received), [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered), [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted), [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error), or [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow). The [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered) event is only used with [Address Filtering](address-filtering) to indicate termination of a packet that does not meet the filtering criteria.
- RX Entry Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX entry buffer. This event should not occur in normal operation.
- RX Entry Buffer Overflow  
  - This event cannot be disabled and will fire one time if the RX entry buffer overflows. It will cause the [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) event to happen later after all valid entries are processed in the RX entry buffer.
- RX Entry Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX entry buffer. This event should not occur in normal operation.
- RX Entry Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX entry buffer have become corrupt. This event should not occur in normal operation.

###### AGC_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::AGC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the AGC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the automatic gain control block. The following events are currently in use:

- RSSI Valid  
  - This event is enabled by [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) and occurs when the first RSSI sample is ready after going into RX state. It will cause the eventsCallback to be called with [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done) set.

###### PROTIMER_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::PROTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the PROTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the RAIL timebase (PROTIMER). The following events are currently in use:

- Scheduled TX/RX  
  - This event cannot be disabled and occurs when a scheduled transmit or receive begins.
- RX scheduled window end timeout  
  - This event cannot be disabled and occurs when the scheduled receive window ends and the radio exits receive. This event will call the eventsCallback if [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) is enabled.
- Transmit with CCA Failed  
  - This event cannot be disabled and occurs when CCA indicates the channel is busy. This event will call the eventsCallback if [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy) is enabled.
- Transmit with CCA Success  
  - This event cannot be disabled and occurs when CCA indicates the channel is clear and the packet will be transmitted. This event will call the eventsCallback if [RAIL_EVENT_TX_CHANNEL_CLEAR](events#rail-event-tx-channel-clear) is enabled.
- Starting a CCA check  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_TX_START_CCA](events#rail-event-tx-start-cca). It will occur when the radio begins warming up for a CCA check.
- CCA Check Activated  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_TX_CCA_ACTIVATED](events#rail-event-tx-cca-activated). It will occur when the CCA check is actually activated, though it may not occur if there was no (zero) backoff prior to the CCA check.
- CCA Retry  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_TX_CCA_RETRY](events#rail-event-tx-cca-retry). It will occur whenever CSMA or LBT have a failed channel check and are going to begin retrying.
- RAIL Timer  
  - This event is enabled by [RAIL_SetTimer()](system-timing#rail-set-timer) and will call the provided callback when the timer expires.

###### SYNTH_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::SYNTH_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYNTH interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the synth module. The following events are currently in use:

- Radio Sequencer Handshake  
  - This event is used in to keep the main core awake during some radio operations.

###### RFSENSE_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RFSENSE_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFSENSE interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the RF Sense module. This source is not available on all EFR32 Series 2 devices. The following events are currently in use:

- RF Sensed  
  - This event is enabled by when the RFSENSE block is initialized using [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) and can be disabled by turning off the RFSENSE block using [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) with the band set to RAIL_RFSENSE_OFF. This event will possibly generate a callback provided to [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) whenever the RFSENSE block detects RF energy.

###### PRORTC_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::PRORTC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the PRORTC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the internal RTC source on chips that support it (EFR32xG21 and EFR32xG22). It is not used at this time.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### HOSTMAILBOX_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::HOSTMAILBOX_IRQHandler(void)`

**Description:** RAIL interrupt handler for the HOSTMAILBOX interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the mailbox between the radio sequencer and main core. This source is not available on all EFR32 Series 2 devices. The following events are currently in use:

- Mailbox Event  
  - Mailbox message from the radio sequencer to the main core.

###### RDMAILBOX_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RDMAILBOX_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RDMAILBOX interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This interrupt source was renamed. See [HOSTMAILBOX_IRQHandler](rail-efr32x-g2x-interrupts#hostmailbox-irq-handler) for more details. 

###### RFECA0_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RFECA0_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA0 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFECA1_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RFECA1_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA1 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFTIMER_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RFTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### SOFTM_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::SOFTM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SOFTM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles demodulator status and error events on some phys configurations. This source is not available on all EFR32 Series 2 devices.

The following events are currently in use:

- Preamble Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect). This event will call the RAIL eventsCallback when a preamble is detected by the demodulator if enabled.
- Preamble Lost  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost). This event will call the RAIL eventsCallback when a preamble is lost by the demodulator if enabled.
- Timing Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_TIMING_DETECT](events#rail-event-rx-timing-detect). This event will call the RAIL eventsCallback when timing is detected by the demodulator if enabled.
- Timing Lost  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_TIMING_LOST](events#rail-event-rx-timing-lost). This event will call the RAIL eventsCallback when timing is lost by the demodulator if enabled.
- Sync 1 Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_SYNC1_DETECT](events#rail-event-rx-sync1-detect). This event will call the RAIL eventsCallback when sync word 1 is detected by the demodulator if enabled.
- Sync 2 Detection  
  - This event is enabled by [RAIL_ConfigEvents()](events#rail-config-events) when given [RAIL_EVENT_RX_SYNC2_DETECT](events#rail-event-rx-sync2-detect). This event will call the RAIL eventsCallback when sync word 2 is detected by the demodulator if enabled.

###### RFLDMA_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::RFLDMA_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFDMA interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### SYSRTC_SEQ_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::SYSRTC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYSRTC SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles system rtc interrupts for the radio subsystem. This source is not available on all EFR32 Series 2 devices.

The following events are currently in use:

- SYSRTC compare channel  
  - This event is enabled by the rail_power_manager and is only used during rail timebase syncronization after sleep.

###### EMUDG_IRQHandler (heading level 7)

`void RAIL_EFR32xG2x_Interrupts::EMUDG_IRQHandler(void)`

**Description:** RAIL interrupt handler for the EMUDG interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles multiple features based on temperature such as:

- HFXO compensation defined by [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1).  
  - This feature is enabled by [RAIL_ConfigHFXOCompensation()](external-thermistor#rail-config-hfxo-compensation).
- Chip thermal protection defined by [RAIL_SUPPORTS_THERMAL_PROTECTION](features#rail-supports-thermal-protection-1).  
  - This feature is enabled by [RAIL_ConfigThermalProtection()](thermal-protection#rail-config-thermal-protection).
- OFDM PA compensation over temperature defined by [RAIL_SUPPORTS_OFDM_PA](features#rail-supports-ofdm-pa)  
  - This feature is automatically enabled when an OFDM PHY is loaded.
- VCO calibration  
  - This feature is automatically enabled.

This source is not available on all EFR32 Series 2 devices.

EFR32xG2x-specific interrupt sources. 

Below are the interrupt handlers implemented within the RAIL library for EFR32 Series 2. See [EFR32](efr32-main) for more details about interrupt initialization and priorities. For more information about the interrupt vectors and where they are on your specific chip, see the startup_efr32xg2x.c file for your chip. These can be found under the Device/SiliconLabs folder in your release.

**Warnings**

- [RAC_RSM_IRQHandler()](sl-rail-efr32xg2x-interrupts#rac-rsm-irq-handler) and [RAC_SEQ_IRQHandler()](sl-rail-efr32xg2x-interrupts#rac-seq-irq-handler) must be set to the same priority level.

###### Public Functions

###### FRC_PRI_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::FRC_PRI_IRQHandler(void)`

**Description:** RAIL interrupt handler for the high-priority FRC_PRI interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the FRC High Priority. It is not used at this time.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### FRC_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::FRC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the normal-priority FRC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles packet completion events for the transmit side. The receive side events are queued and processed in the [BUFC_IRQHandler](sl-rail-efr32xg2x-interrupts#bufc-irq-handler). The following events are currently in use:

- TX Completed  
  - This event cannot be disabled and is used to clean up after a transmit event. If enabled, one of the following events will be generated after transmit completion: [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent), [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted), [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked), or [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow).
- TX Ack Completed  
  - This event is only turned on if the user calls [sl_rail_config_events()](events#sl-rail-config-events) with one of [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent), [SL_RAIL_EVENT_TXACK_ABORTED](events#sl-rail-event-txack-aborted), [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked), or [SL_RAIL_EVENT_TXACK_UNDERFLOW](events#sl-rail-event-txack-underflow). If enabled, the corresponding event will be generated when an Ack completes.

###### MODEM_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::MODEM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the MODEM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles demodulator and modulator status and error events. The following events are currently in use:

- Preamble Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_DETECT](events#sl-rail-event-rx-preamble-detect). This event will call the RAIL events_callback when a preamble is detected by the demodulator if enabled.
- Preamble Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost). This event will call the RAIL events_callback when a preamble is lost by the demodulator if enabled.
- Timing Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_DETECT](events#sl-rail-event-rx-timing-detect). This event will call the RAIL events_callback when timing is detected by the demodulator if enabled.
- Timing Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_LOST](events#sl-rail-event-rx-timing-lost). This event will call the RAIL events_callback when timing is lost by the demodulator if enabled.
- Sync 1 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_0_DETECT](events#sl-rail-event-rx-sync-0-detect). This event will call the RAIL events_callback when sync word 1 is detected by the demodulator if enabled.
- Sync 2 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_1_DETECT](events#sl-rail-event-rx-sync-1-detect). This event will call the RAIL events_callback when sync word 2 is detected by the demodulator if enabled.

###### RAC_SEQ_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RAC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio sequencer. The following events are currently in use:

- RX timeout  
  - This event cannot be disabled and occurs when a receive timeout, as configured via [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing)[sl_rail_state_timing_t::rxsearch_timeout](sl-rail-state-timing-t#rxsearch-timeout) or [sl_rail_state_timing_t::tx_to_rxsearch_timeout](sl-rail-state-timing-t#tx-to-rxsearch-timeout), expires and the radio exits receive. This event will call the generic callback if [SL_RAIL_EVENT_RX_TIMEOUT](events#sl-rail-event-rx-timeout) is enabled.
- Ack Timeout  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout). This event is only available when using [Auto-Ack](auto-ack) or [IEEE 802.15.4](ieee802-15-4) and will call the events_callback whenever an Ack packet is not received within the Ack timeout window.
- Address Filtering Passed  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed). This event is only enabled when using [Address Filtering](address-filtering) and will call the generic callback whenever a packet passes the filtering criteria.
- IEEE802154 Frame Pending  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command). This event is only available when in [IEEE 802.15.4](ieee802-15-4) mode and will call the events_callback whenever a data request packet is received so you can set a frame-pending indicator in the outgoing Ack.
- Temperature Calibration  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed). This event will fire whenever the temperature changes enough to require recalibration during the RX state.

###### RAC_RSM_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RAC_RSM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RAC_RSM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio state machine. The following events are currently in use:

- Radio State Changed  
  - Enabled in some debug modes.

###### BUFC_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::BUFC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the BUFC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio buffer controller. The following events are currently in use:

- RX Buffer Threshold  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full). This event will trigger an events_callback when the contents of the receive buffer exceed the receive buffer threshold set by [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold).
- RX Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX buffer. It should not occur in normal operation as all receive APIs protect against it.
- RX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX buffer have become corrupt. This event should not occur in normal operation.
- TX Buffer Threshold  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty). This event will trigger an events_callback when the contents of the transmit buffer fall beneath the transmit threshold set by [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold).
- TX Buffer Overflow  
  - This event cannot be disabled and indicates too much data was placed into the TX buffer. This event should not occur in normal operation as all transmit APIs protect against it.
- TX Buffer Underflow  
  - This event cannot be disabled and occurs when the transmit FIFO runs out of bytes before the end of the packet. This event will always perform any necessary cleanup and will call the events_callback if [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) is enabled.
- TX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the TX buffer have become corrupt. This event should not occur in normal operation.
- RX Entry Buffer Threshold  
  - This event cannot be disabled when in receive mode and is used to indicate that a new packet is available in the receive buffer. This event will call the events_callback with any of the following if they are enabled: [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received), [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered), [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted), [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error), or [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow). The [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered) event is only used with [Address Filtering](address-filtering) to indicate termination of a packet that does not meet the filtering criteria.
- RX Entry Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX entry buffer. This event should not occur in normal operation.
- RX Entry Buffer Overflow  
  - This event cannot be disabled and will fire one time if the RX entry buffer overflows. It will cause the [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) event to happen later after all valid entries are processed in the RX entry buffer.
- RX Entry Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX entry buffer. This event should not occur in normal operation.
- RX Entry Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX entry buffer have become corrupt. This event should not occur in normal operation.

###### AGC_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::AGC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the AGC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the automatic gain control block. The following events are currently in use:

- RSSI Valid  
  - This event is enabled by [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi) and occurs when the first RSSI sample is ready after going into RX state. It will cause the events_callback to be called with [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done) set.

###### PROTIMER_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::PROTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the PROTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the RAIL timebase (PROTIMER). The following events are currently in use:

- Scheduled TX/RX  
  - This event cannot be disabled and occurs when a scheduled transmit or receive begins.
- RX scheduled window end timeout  
  - This event cannot be disabled and occurs when the scheduled receive window ends and the radio exits receive. This event will call the events_callback if [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) is enabled.
- Transmit with CCA Failed  
  - This event cannot be disabled and occurs when CCA indicates the channel is busy. This event will call the events_callback if [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy) is enabled.
- Transmit with CCA Success  
  - This event cannot be disabled and occurs when CCA indicates the channel is clear and the packet will be transmitted. This event will call the events_callback if [SL_RAIL_EVENT_TX_CHANNEL_CLEAR](events#sl-rail-event-tx-channel-clear) is enabled.
- Starting a CCA check  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_START_CCA](events#sl-rail-event-tx-start-cca). It will occur when the radio begins warming up for a CCA check.
- CCA Retry  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_CCA_RETRY](events#sl-rail-event-tx-cca-retry). It will occur whenever CSMA or LBT have a failed channel check and are going to begin retrying.
- RAIL Timer  
  - This event is enabled by [sl_rail_set_timer()](system-timing#sl-rail-set-timer) and will call the provided callback when the timer expires.

###### SYNTH_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::SYNTH_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYNTH interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the synth module. The following events are currently in use:

- Radio Sequencer Handshake  
  - This event is used in to keep the main core awake during some radio operations.

###### RFSENSE_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RFSENSE_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFSENSE interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the RF Sense module. This source is not available on all EFR32 Series 2 devices. The following events are currently in use:

- RF Sensed  
  - This event is enabled by when the RFSENSE block is initialized using [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) and can be disabled by turning off the RFSENSE block using [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) with the band set to SL_RAIL_RFSENSE_OFF. This event will possibly generate a callback provided to [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) whenever the RFSENSE block detects RF energy.

###### PRORTC_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::PRORTC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the PRORTC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the internal RTC source on chips that support it (EFR32xG21 and EFR32xG22). It is not used at this time.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### HOSTMAILBOX_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::HOSTMAILBOX_IRQHandler(void)`

**Description:** RAIL interrupt handler for the HOSTMAILBOX interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the mailbox between the radio sequencer and main core. This source is not available on all EFR32 Series 2 devices. The following events are currently in use:

- Mailbox Event  
  - Mailbox message from the radio sequencer to the main core.

###### RDMAILBOX_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RDMAILBOX_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RDMAILBOX interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This interrupt source was renamed. See [HOSTMAILBOX_IRQHandler](sl-rail-efr32xg2x-interrupts#hostmailbox-irq-handler) for more details. 

###### RFECA0_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RFECA0_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA0 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFECA1_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RFECA1_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA1 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFTIMER_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RFTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### SOFTM_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::SOFTM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SOFTM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles demodulator status and error events on some phys configurations. This source is not available on all EFR32 Series 2 devices.

The following events are currently in use:

- Preamble Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_DETECT](events#sl-rail-event-rx-preamble-detect). This event will call the RAIL events_callback when a preamble is detected by the demodulator if enabled.
- Preamble Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost). This event will call the RAIL events_callback when a preamble is lost by the demodulator if enabled.
- Timing Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_DETECT](events#sl-rail-event-rx-timing-detect). This event will call the RAIL events_callback when timing is detected by the demodulator if enabled.
- Timing Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_LOST](events#sl-rail-event-rx-timing-lost). This event will call the RAIL events_callback when timing is lost by the demodulator if enabled.
- Sync 1 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_0_DETECT](events#sl-rail-event-rx-sync-0-detect). This event will call the RAIL events_callback when sync word 1 is detected by the demodulator if enabled.
- Sync 2 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_1_DETECT](events#sl-rail-event-rx-sync-1-detect). This event will call the RAIL events_callback when sync word 2 is detected by the demodulator if enabled.

###### RFLDMA_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::RFLDMA_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFDMA interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Currently, there are no interrupt sources enabled within this group. This source is not available on all EFR32 Series 2 devices.

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### SYSRTC_SEQ_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::SYSRTC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYSRTC SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles system rtc interrupts for the radio subsystem. This source is not available on all EFR32 Series 2 devices.

The following events are currently in use:

- SYSRTC compare channel  
  - This event is enabled by the rail_power_manager and is only used during rail timebase syncronization after sleep.

###### EMUDG_IRQHandler (heading level 7)

`void sl_rail_efr32xg2x_interrupts::EMUDG_IRQHandler(void)`

**Description:** RAIL interrupt handler for the EMUDG interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles multiple features based on temperature such as:

- HFXO compensation defined by [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1).  
  - This feature is enabled by [sl_rail_config_hfxo_compensation()](external-thermistor#sl-rail-config-hfxo-compensation).
- Chip thermal protection defined by [SL_RAIL_SUPPORTS_THERMAL_PROTECTION](features#sl-rail-supports-thermal-protection-1).  
  - This feature is enabled by [sl_rail_config_thermal_protection()](thermal-protection#sl-rail-config-thermal-protection).
- OFDM PA compensation over temperature defined by [SL_RAIL_SUPPORTS_OFDM_PA](features#sl-rail-supports-ofdm-pa-1)  
  - This feature is automatically enabled when an OFDM PHY is loaded.
- VCO calibration  
  - This feature is automatically enabled.

This source is not available on all EFR32 Series 2 devices.

SIXG3XX-specific interrupt sources. 

Below are the interrupt handlers implemented within the RAIL library for the Series 3 Wireless Platform. See [EFR32](efr32-main) for more details about interrupt initialization and priorities. For more information about the interrupt vectors and where they are on your specific chip, see the startup_sixg3xx.c file for your chip. These can be found under the Device/SiliconLabs folder in your release.

**Warnings**

- [RAC_RSM_IRQHandler()](sl-rail-sixg3xx-interrupts#rac-rsm-irq-handler) and [RAC_SEQ_IRQHandler()](sl-rail-sixg3xx-interrupts#rac-seq-irq-handler) must be set to the same priority level.

###### Public Functions

###### SYSMBLPW0CPU_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::SYSMBLPW0CPU_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYSMBLPW0CPU interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This interrupt is triggered by the mailbox mechanism to facilitate communication and coordination with the LPW0 subsystem. It handles events and messages exchanged between the main MCU and the LPW0 subsystem, ensuring proper synchronization and operation.

**Note**

- The specific events handled by this interrupt depend on the configuration of the mailbox and the LPW0 subsystem.

###### SEQACC_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::SEQACC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SEQACC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This interrupt handles sequencer accelerator access-related events, such as PHY configuration, aborts, errors, and bus errors. It ensures proper handling of sequencer operations and transitions the system to appropriate states based on the events received.

- If the PHY configuration sequence completes successfully, the system transitions to the idle state.
- If an error occurs during the PHY loading sequence (e.g., abort, sequencer error, or bus error), the system transitions to the uninitialized state.

The interrupt flags are cleared after processing to ensure proper operation of subsequent events. 

###### FRC_PRI_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::FRC_PRI_IRQHandler(void)`

**Description:** RAIL interrupt handler for the high-priority FRC_PRI interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### FRC_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::FRC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the normal-priority FRC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles packet completion events for the transmit side. The receive side events are queued and processed in the [BUFC_IRQHandler](sl-rail-sixg3xx-interrupts#bufc-irq-handler). The following events are currently in use:

- TX Completed  
  - This event cannot be disabled and is used to clean up after a transmit event. If enabled, one of the following events will be generated after transmit completion: [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent), [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted), [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked), or [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow).
- TX Ack Completed  
  - This event is only turned on if the user calls [sl_rail_config_events()](events#sl-rail-config-events) with one of [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent), [SL_RAIL_EVENT_TXACK_ABORTED](events#sl-rail-event-txack-aborted), [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked), or [SL_RAIL_EVENT_TXACK_UNDERFLOW](events#sl-rail-event-txack-underflow). If enabled, the corresponding event will be generated when an Ack completes.

###### MODEM_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::MODEM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the MODEM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles demodulator and modulator status and error events. The following events are currently in use:

- Preamble Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_DETECT](events#sl-rail-event-rx-preamble-detect). This event will call the RAIL events_callback when a preamble is detected by the demodulator if enabled.
- Preamble Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost). This event will call the RAIL events_callback when a preamble is lost by the demodulator if enabled.
- Timing Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_DETECT](events#sl-rail-event-rx-timing-detect). This event will call the RAIL events_callback when timing is detected by the demodulator if enabled.
- Timing Lost  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_TIMING_LOST](events#sl-rail-event-rx-timing-lost). This event will call the RAIL events_callback when timing is lost by the demodulator if enabled.
- Sync 1 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_0_DETECT](events#sl-rail-event-rx-sync-0-detect). This event will call the RAIL events_callback when sync word 1 is detected by the demodulator if enabled.
- Sync 2 Detection  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_SYNC_1_DETECT](events#sl-rail-event-rx-sync-1-detect). This event will call the RAIL events_callback when sync word 2 is detected by the demodulator if enabled.

###### RAC_SEQ_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::RAC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio sequencer. The following events are currently in use:

- RX timeout  
  - This event cannot be disabled and occurs when a receive timeout, as configured via [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing)[sl_rail_state_timing_t::rxsearch_timeout](sl-rail-state-timing-t#rxsearch-timeout) or [sl_rail_state_timing_t::tx_to_rxsearch_timeout](sl-rail-state-timing-t#tx-to-rxsearch-timeout), expires and the radio exits receive. This event will call the generic callback if [SL_RAIL_EVENT_RX_TIMEOUT](events#sl-rail-event-rx-timeout) is enabled.
- Ack Timeout  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout). This event is only available when using [Auto-Ack](auto-ack) or [IEEE 802.15.4](ieee802-15-4) and will call the events_callback whenever an Ack packet is not received within the Ack timeout window.
- Address Filtering Passed  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed). This event is only enabled when using [Address Filtering](address-filtering) and will call the generic callback whenever a packet passes the filtering criteria.
- IEEE802154 Frame Pending  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command). This event is only available when in [IEEE 802.15.4](ieee802-15-4) mode and will call the events_callback whenever a data request packet is received so you can set a frame-pending indicator in the outgoing Ack.
- Temperature Calibration  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed). This event will fire whenever the temperature changes enough to require recalibration during the RX state.

###### RAC_RSM_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::RAC_RSM_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RAC_RSM interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio state machine. The following events are currently in use:

- Radio State Changed  
  - Enabled in some debug modes.

###### BUFC_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::BUFC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the BUFC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the radio buffer controller. The following events are currently in use:

- RX Buffer Threshold  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full). This event will trigger an events_callback when the contents of the receive buffer exceed the receive buffer threshold set by [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold).
- RX Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX buffer. It should not occur in normal operation as all receive APIs protect against it.
- RX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX buffer have become corrupt. This event should not occur in normal operation.
- TX Buffer Threshold  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty). This event will trigger an events_callback when the contents of the transmit buffer fall beneath the transmit threshold set by [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold).
- TX Buffer Overflow  
  - This event cannot be disabled and indicates too much data was placed into the TX buffer. This event should not occur in normal operation as all transmit APIs protect against it.
- TX Buffer Underflow  
  - This event cannot be disabled and occurs when the transmit FIFO runs out of bytes before the end of the packet. This event will always perform any necessary cleanup and will call the events_callback if [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) is enabled.
- TX Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the TX buffer have become corrupt. This event should not occur in normal operation.
- RX Entry Buffer Threshold  
  - This event cannot be disabled when in receive mode and is used to indicate that a new packet is available in the receive buffer. This event will call the events_callback with any of the following if they are enabled: [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received), [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered), [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted), [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error), or [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow). The [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered) event is only used with [Address Filtering](address-filtering) to indicate termination of a packet that does not meet the filtering criteria.
- RX Entry Buffer Underflow  
  - This event cannot be disabled and indicates that too much data was read from the RX entry buffer. This event should not occur in normal operation.
- RX Entry Buffer Overflow  
  - This event cannot be disabled and will fire one time if the RX entry buffer overflows. It will cause the [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) event to happen later after all valid entries are processed in the RX entry buffer.
- RX Entry Buffer Corruption  
  - This event cannot be disabled and indicates the pointers in the RX entry buffer have become corrupt. This event should not occur in normal operation.

###### AGC_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::AGC_IRQHandler(void)`

**Description:** RAIL interrupt handler for the AGC interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the automatic gain control block. The following events are currently in use:

- RSSI Valid  
  - This event is enabled by [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi) and occurs when the first RSSI sample is ready after going into RX state. It will cause the events_callback to be called with [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done) set.

###### PROTIMER_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::PROTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the PROTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the RAIL timebase (PROTIMER). The following events are currently in use:

- Scheduled TX/RX  
  - This event cannot be disabled and occurs when a scheduled transmit or receive begins.
- RX scheduled window end timeout  
  - This event cannot be disabled and occurs when the scheduled receive window ends and the radio exits receive. This event will call the events_callback if [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) is enabled.
- Transmit with CCA Failed  
  - This event cannot be disabled and occurs when CCA indicates the channel is busy. This event will call the events_callback if [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy) is enabled.
- Transmit with CCA Success  
  - This event cannot be disabled and occurs when CCA indicates the channel is clear and the packet will be transmitted. This event will call the events_callback if [SL_RAIL_EVENT_TX_CHANNEL_CLEAR](events#sl-rail-event-tx-channel-clear) is enabled.
- Starting a CCA check  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_START_CCA](events#sl-rail-event-tx-start-cca). It will occur when the radio begins warming up for a CCA check.
- CCA Check Activated  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_CCA_ACTIVATED](events#sl-rail-event-tx-cca-activated). It will occur when the CCA check is actually activated, though it may not occur if there was no (zero) backoff prior to the CCA check.
- CCA Retry  
  - This event is enabled by [sl_rail_config_events()](events#sl-rail-config-events) when given [SL_RAIL_EVENT_TX_CCA_RETRY](events#sl-rail-event-tx-cca-retry). It will occur whenever CSMA or LBT have a failed channel check and are going to begin retrying.
- RAIL Timer  
  - This event is enabled by [sl_rail_set_timer()](system-timing#sl-rail-set-timer) and will call the provided callback when the timer expires.

###### SYNTH_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::SYNTH_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYNTH interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts generated from the synth module. The following events are currently in use:

- Radio Sequencer Handshake  
  - This event is used to keep the main core awake during some radio operations.

###### RFECA0_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::RFECA0_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA0 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the RFECA which is used for debug and some internal RAIL features. Currently no interrupt sources from this module are enabled

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFECA1_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::RFECA1_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFECA1 interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the RFECA which is used for debug and some internal RAIL features. Currently no interrupt sources from this module are enabled

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### RFTIMER_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::RFTIMER_IRQHandler(void)`

**Description:** RAIL interrupt handler for the RFTIMER interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles interrupts from the RFTIMER module which is used for debug and some internal RAIL features. Currently no interrupt sources from this module are enabled

**Note**

- The interrupt vector should still point to the RAIL interrupt handler for compatibility with future RAIL releases.

###### SYSRTC_SEQ_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::SYSRTC_SEQ_IRQHandler(void)`

**Description:** RAIL interrupt handler for the SYSRTC SEQ interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

The following events are currently in use:

- SYSRTC compare channel  
  - This event is enabled by the rail_power_manager and is only used during rail timebase synchronization after sleep.

###### EMUDG_IRQHandler (heading level 7)

`void sl_rail_sixg3xx_interrupts::EMUDG_IRQHandler(void)`

**Description:** RAIL interrupt handler for the EMUDG interrupt source.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This source handles multiple features based on temperature such as:

- HFXO compensation defined by [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1).  
  - This feature is enabled by [sl_rail_config_hfxo_compensation()](external-thermistor#sl-rail-config-hfxo-compensation).
- Chip thermal protection defined by [SL_RAIL_SUPPORTS_THERMAL_PROTECTION](features#sl-rail-supports-thermal-protection-1).  
  - This feature is enabled by [sl_rail_config_thermal_protection()](thermal-protection#sl-rail-config-thermal-protection).
- VCO calibration  
  - This feature is automatically enabled.

This source is currently not used on the SIXG301 device family.

#### Data Management

Data management functions. 

These functions allow the application to choose how data is presented to the application. RAIL provides data in a packet-based method or in a FIFO-based method. As originally conceived, [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) was designed for handling packets that fit within RAIL's FIFOs while [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) was designed for handling packets larger than RAIL's FIFOs could hold. Conceptually it is still useful to think of these modes this way, but functionally their distinction has become blurred by improvements in RAIL's flexibility – applications now have much more control over both receive and transmit FIFO sizes, and the FIFO-management and threshold APIs and related events are no longer restricted to [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) operation but can be used in [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) too.

The application can configure RAIL data management through [RAIL_ConfigData()](data-management#rail-config-data). This function allows the application to specify the type of radio data ([RAIL_TxDataSource_t](data-management#rail-tx-data-source-t) and [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t)) and the method of interacting with data ([RAIL_DataMethod_t](data-management#rail-data-method-t)). By default, RAIL configures TX and RX both with packet data source and [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode).

For transmit, [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) and [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) are functionally the same:

- When not actively transmitting, load a packet's initial transmit data using [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) with reset set to true. Alternatively this data copying can be avoided by changing the transmit FIFO to an already-loaded section of memory with [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo).
- When actively transmitting, load remaining transmit data with [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) with reset set to false.
- If transmit packets exceed the FIFO size, set the transmit FIFO threshold through [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold). The [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) will occur telling the application to load more TX packet data, if needed, to prevent a [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) event from occurring. One can get how much space is available in the transmit FIFO for more transmit data through [RAIL_GetTxFifoSpaceAvailable()](data-management#rail-get-tx-fifo-space-available).
- After transmit completes, the transmit FIFO can be manually reset with [RAIL_ResetFifo()](data-management#rail-reset-fifo), but this should rarely be necessary.

The transmit FIFO is specified by the application and its size is the value returned from the most recent call to [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo). The transmit FIFO is edge-based in that it only provides the [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) event once when the threshold is crossed in the emptying direction.

On EFR32xG25 platforms, the transmit FIFO must contain at least two bytes before starting a transmit. For OFDM and SUN OQPSK modulations, it must contain at least the PHY header (PHR) and first two payload bytes. When actively transmitting, loading data must be done by chunks of at least two bytes, except for the last one.

For receive, the distinction between [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) and [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) basically boils down to how unsuccessfully-received packets are handled. In [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode), data from such packets is automatically rolled back as if the packet was never received, while in [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), rollback does not occur putting more onus on the application to deal with that data.

In receive [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) data management:

- Packet lengths are determined from the Radio Configurator configuration and can be read out at the end using [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info).
- Received packet data is made available on successful packet completion via [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) which can then use [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) and [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) to access packet information and [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet) to access packet data.
- FILTERED, ABORTED, or FRAMEERROR received packet data is automatically rolled back (dropped) without the application needing to worry about consuming it. The application can choose to not even be bothered with the events related to such packets: [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered), [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted), or [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error).

In receive [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) data management:

- Packet Lengths are determined from the Radio Configurator configuration or by application knowledge of packet payload structure.
- Received data can be retrieved prior to packet completion through [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) and is never rolled back on FILTERED, ABORTED, or FRAMEERROR packets. The application should enable and handle these events so it can flush any packet data it's already retrieved.
- After packet completion, remaining packet data for FILTERED, ABORTED, or FRAMEERROR packets remains in the FIFO and the appropriate event is triggered to the user. This data may be consumed in the callback unlike in packet mode where it is automatically rolled back. At the end of the callback all remaining data in the FIFO will be cleaned up as usual. Keep in mind that [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) provides full packet detailed information only for successfully received packets.

Common receive data management features:

- Set the receive FIFO threshold through [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold). The [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) will occur telling the application to consume some RX packet data to prevent a [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) event from occurring.
- Get receive FIFO count information through [RAIL_GetRxPacketInfo](packet-information#rail-get-rx-packet-info)([RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest)) (or [RAIL_GetRxFifoBytesAvailable()](data-management#rail-get-rx-fifo-bytes-available)).
- After receive completes and all its data has been consumed, the receive FIFO can be manually reset with [RAIL_ResetFifo()](data-management#rail-reset-fifo), though this should rarely be necessary and should only be done with the radio idle.

When trying to determine an appropriate threshold, the application needs to know the size of each FIFO. The default receive FIFO is internal to RAIL with a size of 512 bytes. This can be changed, however, using [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo) and the default may be removed entirely by calling this from the [RAILCb_SetupRxFifo()](data-management#rail-cb-setup-rx-fifo) callback. The receive FIFO event is level-based in that the [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) event will constantly pend if the threshold is exceeded. This normally means that inside this event's callback, the application should empty enough of the FIFO to go under the threshold. To defer reading the FIFO to main context, the application can disable or re-enable the receive FIFO threshold event using [RAIL_ConfigEvents()](events#rail-config-events) with the mask [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full).

The receive FIFO can store multiple packets and processing of a packet can be deferred from the RAIL event callback to main-loop processing by using [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet) in the event callback and [RAIL_ReleaseRxPacket()](receive#rail-release-rx-packet) in the main-loop. On some platforms, the receive FIFO is supplemented by an internal fixed-size packet metadata FIFO that limits the number of packets RAIL and applications can hold onto for deferred processing. See chip-specific documentation, such as [EFR32](efr32-main), for more information.

**Note**

- When using multiprotocol the receive FIFO is reset prior to a protocol switch so held packets will be lost if not processed before then.

While [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) occurs solely based on the state of the receive FIFO used for packet data, both [RAIL_EVENT_RX_FIFO_FULL](events#rail-event-rx-fifo-full) and [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) can occur coincident with packet completion when either that or the internal packet metadata FIFO fills or overflows. [RAIL_EVENT_RX_FIFO_FULL](events#rail-event-rx-fifo-full) informs the application it should immediately process and free up the oldest packets/data to make room for new packets/data, reducing the possibility of packet/data loss and [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow).

Before a packet is fully received you can always use [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet) to look at the contents. In FIFO mode, you may also consume its data with [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo). Remember that none of these APIs will read across a packet boundary (even in FIFO mode) so you will need to handle each received packet individually.

While RAIL defaults to [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode), the application can explicitly initialize RAIL for [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) in the following manner: 

```c
extern RAIL_Handle_t railHandle;

void configRailForPacketModeOperation(void)
{
  RAIL_DataConfig_t railDataConfig = {
    .txSource = TX_PACKET_DATA,
    .rxSource = RX_PACKET_DATA,
    .txMethod = PACKET_MODE,
    .rxMethod = PACKET_MODE,
  };

  (void) RAIL_ConfigData(railHandle, &railDataConfig);

  // Events that can occur in Packet Mode:
  //   RAIL_EVENT_TX_PACKET_SENT
  //   RAIL_EVENT_RX_PACKET_RECEIVED
  // and optionally (packet data automatically dropped):
  //   RAIL_EVENT_RX_ADDRESS_FILTERED
  //   RAIL_EVENT_RX_PACKET_ABORTED
  //   RAIL_EVENT_RX_FRAME_ERROR
  //   RAIL_EVENT_RX_FIFO_OVERFLOW
  // and if enabled:
  //   RAIL_EVENT_TX_UNDERFLOW
  //   RAIL_EVENT_TXACK_UNDERFLOW
  //   RAIL_EVENT_TX_FIFO_ALMOST_EMPTY
  //   RAIL_EVENT_RX_FIFO_ALMOST_FULL
}

```

Initializing RAIL for [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) requires a few more function calls: 

```c
extern RAIL_Handle_t railHandle;

void config_rail_for_fifo_mode_operation(void)
{
  RAIL_DataConfig_t railDataConfig = {
    .txSource = TX_PACKET_DATA,
    .rxSource = RX_PACKET_DATA,
    .txMethod = FIFO_MODE,
    .rxMethod = FIFO_MODE,
  };

  (void) RAIL_ConfigData(railHandle, &railDataConfig);

  // Gets the size of the FIFOs.
  // Assume that the transmit and receive FIFOs are the same size
  uint16_t fifoSize = RAIL_GetTxFifoSpaceAvailable(railHandle);

  // Sets the transmit and receive FIFO thresholds.
  // For this example, set the threshold in the middle of each FIFO.
  (void) RAIL_SetRxFifoThreshold(railHandle, fifoSize / 2);
  (void) RAIL_SetTxFifoThreshold(railHandle, fifoSize / 2);

  // Events that can occur in FIFO mode:
  //   RAIL_EVENT_TX_FIFO_ALMOST_EMPTY
  //   RAIL_EVENT_TX_UNDERFLOW
  //   RAIL_EVENT_TXACK_UNDERFLOW
  //   RAIL_EVENT_TX_PACKET_SENT
  //   RAIL_EVENT_RX_FIFO_ALMOST_FULL
  //   RAIL_EVENT_RX_FIFO_OVERFLOW
  //   RAIL_EVENT_RX_ADDRESS_FILTERED
  //   RAIL_EVENT_RX_PACKET_ABORTED
  //   RAIL_EVENT_RX_FRAME_ERROR
  //   RAIL_EVENT_RX_PACKET_RECEIVED
}

```

On receive, an application can use a different [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) that is only compatible with [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode). All that differs from the FIFO mode example above is the [RAIL_DataConfig_t::rxSource](rail-data-config-t#rx-source) setting. IQ data samples are taken at the hardware's oversample rate and the amount of data can easily overwhelm the CPU processing time. The sample rate depends on the chosen PHY, as determined by the data rate and the decimation chain. It is **not** recommended to use the IQ data source with sample rates above 300 k samples/second because the CPU might not be able to keep up with the data stream. Depending on the application and the needed CPU bandwidth, slower data rates may be required. On EFR32xG22 and later platforms, it is recommended to reset the RX buffer before initiating a receive for all modes except [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data) since these other modes require the RX buffer's current write offset to be 32-bit aligned. If not reset, capture is performed to the remaining aligned space available. An unaligned write offset will cause [RAIL_ConfigData()](data-management#rail-config-data) to return error [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state).

```c
// Reset RX buffer (EFR32xG22 and later platforms)
RAIL_ResetFifo(railHandle, false, true);

// IQ data is provided into the receive FIFO.
RAIL_DataConfig_t railDataConfig = {
  .txSource = TX_PACKET_DATA,
  .rxSource = RX_IQDATA_FILTLSB,
  .txMethod = FIFO_MODE,
  .rxMethod = FIFO_MODE,
};

// IQ data comes in the following format when reading out of the FIFO:
//------------------------------------
// I[LSB] | I[MSB] | Q[LSB] | Q[MSB] |
//------------------------------------

```

These functions allow the application to choose how data is presented to the application. RAIL provides data in a packet-based method or in a FIFO-based method. As originally conceived, [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) was designed for handling packets that fit within RAIL's FIFOs while [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) was designed for handling packets larger than RAIL's FIFOs could hold. Conceptually it is still useful to think of these modes this way, but functionally their distinction has become blurred by improvements in RAIL's flexibility – applications now have much more control over both receive and transmit FIFO sizes, and the FIFO-management and threshold APIs and related events are no longer restricted to [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) operation but can be used in [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) too.

The application can configure RAIL data management through [sl_rail_config_tx_data()](data-management#sl-rail-config-tx-data) and [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data). These functions allows the application to specify the type of radio data ([sl_rail_tx_data_source_t](data-management#sl-rail-tx-data-source-t) and [sl_rail_rx_data_source_t](data-management#sl-rail-rx-data-source-t)) and the method of interacting with data ([sl_rail_data_method_t](data-management#sl-rail-data-method-t)). By default, RAIL configures TX and RX both with packet data source and [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode).

For transmit, [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) and [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) are functionally the same:

- When not actively transmitting, load a packet's initial transmit data using [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo) with reset set to true. Alternatively this data copying can be avoided by changing the transmit FIFO to an already-loaded section of memory with [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo).
- When actively transmitting, load remaining transmit data with [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo) with reset set to false.
- If transmit packets exceed the FIFO size, set the transmit FIFO threshold through [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold). The [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) will occur telling the application to load more TX packet data, if needed, to prevent a [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) event from occurring. One can get how much space is available in the transmit FIFO for more transmit data through [sl_rail_get_tx_fifo_space_available()](data-management#sl-rail-get-tx-fifo-space-available).
- After transmit completes, the transmit FIFO can be manually reset with [sl_rail_reset_fifo()](data-management#sl-rail-reset-fifo), but this should rarely be necessary.

The transmit FIFO is specified by the application and its size is the value returned from the most recent call to [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo). The transmit FIFO is edge-based in that it only provides the [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) event once when the threshold is crossed in the emptying direction.

On EFR32xG25 platforms, the transmit FIFO must contain at least two bytes before starting a transmit. For OFDM and SUN OQPSK modulations, it must contain at least the PHY header (PHR) and first two payload bytes. When actively transmitting, loading data must be done by chunks of at least two bytes, except for the last one.

For receive, the distinction between [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) and [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) basically boils down to how unsuccessfully-received packets are handled. In [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode), data from such packets is automatically rolled back as if the packet was never received, while in [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), rollback does not occur putting more onus on the application to deal with that data.

In receive [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) data management:

- Packet lengths are determined from the Radio Configurator configuration and can be read out at the end using [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info).
- Received packet data is made available on successful packet completion via [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) which can then use [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) and [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) to access packet information and [sl_rail_peek_rx_packet()](receive#sl-rail-peek-rx-packet) to access packet data.
- FILTERED, ABORTED, or FRAMEERROR received packet data is automatically rolled back (dropped) without the application needing to worry about consuming it. The application can choose to not even be bothered with the events related to such packets: [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered), [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted), or [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error).

In receive [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) data management:

- Packet Lengths are determined from the Radio Configurator configuration or by application knowledge of packet payload structure.
- Received data can be retrieved prior to packet completion through [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo) and is never rolled back on FILTERED, ABORTED, or FRAMEERROR packets. The application should enable and handle these events so it can flush any packet data it's already retrieved.
- After packet completion, remaining packet data for FILTERED, ABORTED, or FRAMEERROR packets remains in the FIFO and the appropriate event is triggered to the user. This data may be consumed in the callback unlike in packet mode where it is automatically rolled back. At the end of the callback all remaining data in the FIFO will be cleaned up as usual. Keep in mind that [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) provides full packet detailed information only for successfully received packets.

Common receive data management features:

- Set the receive FIFO threshold through [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold). The [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) will occur telling the application to consume some RX packet data to prevent a [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) event from occurring.
- Get receive FIFO count information through [sl_rail_get_rx_packet_info](packet-information#sl-rail-get-rx-packet-info)([SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest)) (or [sl_rail_get_rx_fifo_bytes_available()](data-management#sl-rail-get-rx-fifo-bytes-available)).
- After receive completes and all its data has been consumed, the receive FIFO and associated receive Packet Queue can be manually reset with [sl_rail_reset_fifo()](data-management#sl-rail-reset-fifo), though this should rarely be necessary and should only be done with the radio idle.

When trying to determine an appropriate threshold, the application needs to know the size of each FIFO. This can be obtained via [sl_rail_get_config()](general#sl-rail-get-config) if not already known. The receive FIFO event is level-based in that the [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) event will constantly pend if the threshold is exceeded. This normally means that inside this event's callback, the application should empty enough of the FIFO to go under the threshold. To defer reading the FIFO to main context, the application can disable or re-enable the receive FIFO threshold event using [sl_rail_config_events()](events#sl-rail-config-events) with the mask [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full).

The receive FIFO can store multiple packets and processing of a packet can be deferred from the RAIL event callback to main-loop processing by using [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet) in the event callback and [sl_rail_release_rx_packet()](receive#sl-rail-release-rx-packet) in the main-loop. The receive FIFO is supplemented by the receive Packet Queue that limits the number of packets RAIL and applications can hold onto for deferred processing.

**Note**

- When using multiprotocol, if a protocol's receive FIFO or receive Packet Queue is shared with another protocol, they will be reset during a protocol switch so held packets will be lost if not processed before then.

While [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) occurs solely based on the state of the receive FIFO used for packet data, both [SL_RAIL_EVENT_RX_FIFO_FULL](events#sl-rail-event-rx-fifo-full) and [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) can occur coincident with packet completion when either that or the receive Packet Queue fills or overflows. [SL_RAIL_EVENT_RX_FIFO_FULL](events#sl-rail-event-rx-fifo-full) informs the application it should immediately process and free up the oldest packets/data to make room for new packets/data, reducing the possibility of packet/data loss and [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow).

Before a packet is fully received you can always use [sl_rail_peek_rx_packet()](receive#sl-rail-peek-rx-packet) to look at the contents. In FIFO mode, you may also consume its data with [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo). Remember that none of these APIs will read across a packet boundary (even in FIFO mode) so you will need to handle each received packet individually.

While RAIL defaults to [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode), the application can explicitly initialize RAIL for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) in the following manner: 

```c
extern sl_rail_handle_t rail_handle;

void config_rail_for_packet_mode_operation(void)
{
  sl_rail_tx_data_config_t rail_tx_data_config = {
    .tx_source = SL_RAIL_TX_DATA_SOURCE_PACKET_DATA,
    .tx_method = SL_RAIL_DATA_METHOD_PACKET_MODE,
  };
  sl_rail_rx_data_config_t rail_rx_data_config = {
    .rx_source = SL_RAIL_RX_DATA_SOURCE_PACKET_DATA,
    .rx_method = SL_RAIL_DATA_METHOD_PACKET_MODE,
  };

  (void) sl_rail_config_tx_data(rail_handle, &rail_tx_data_config);
  (void) sl_rail_config_rx_data(rail_handle, &rail_rx_data_config);

  // Events that can occur in Packet Mode:
  //   SL_RAIL_EVENT_TX_PACKET_SENT
  //   SL_RAIL_EVENT_RX_PACKET_RECEIVED
  // and optionally (packet data automatically dropped):
  //   SL_RAIL_EVENT_RX_ADDRESS_FILTERED
  //   SL_RAIL_EVENT_RX_PACKET_ABORTED
  //   SL_RAIL_EVENT_RX_FRAME_ERROR
  //   SL_RAIL_EVENT_RX_FIFO_OVERFLOW
  // and if enabled:
  //   SL_RAIL_EVENT_TX_UNDERFLOW
  //   SL_RAIL_EVENT_TXACK_UNDERFLOW
  //   SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY
  //   SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL
}

```

Initializing RAIL for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) requires a few more function calls: 

```c
extern sl_rail_handle_t rail_handle;

void config_rail_for_fifo_mode_operation(void)
{
  sl_rail_tx_data_config_t rail_tx_data_config = {
    .tx_source = SL_RAIL_TX_DATA_SOURCE_PACKET_DATA,
    .tx_method = SL_RAIL_DATA_METHOD_FIFO_MODE,
  };
  sl_rail_rx_data_config_t rail_rx_data_config = {
    .rx_source = SL_RAIL_RX_DATA_SOURCE_PACKET_DATA,
    .rx_method = SL_RAIL_DATA_METHOD_FIFO_MODE,
  };

  (void) sl_rail_config_tx_data(rail_handle, &rail_tx_data_config);
  (void) sl_rail_config_rx_data(rail_handle, &rail_rx_data_config);

  // Gets the size of the FIFOs.
  // Assume that the transmit and receive FIFOs are the same size
  uint16_t fifo_size = sl_rail_get_tx_fifo_space_available(rail_handle);

  // Sets the transmit and receive FIFO thresholds.
  // For this example, set the threshold in the middle of each FIFO.
  (void) sl_rail_set_rx_fifo_threshold(rail_handle, fifo_size / 2);
  (void) sl_rail_set_tx_fifo_threshold(rail_handle, fifo_size / 2);

  // Events that can occur in FIFO mode:
  //   SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY
  //   SL_RAIL_EVENT_TX_UNDERFLOW
  //   SL_RAIL_EVENT_TXACK_UNDERFLOW
  //   SL_RAIL_EVENT_TX_PACKET_SENT
  //   SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL
  //   SL_RAIL_EVENT_RX_FIFO_OVERFLOW
  //   SL_RAIL_EVENT_RX_ADDRESS_FILTERED
  //   SL_RAIL_EVENT_RX_PACKET_ABORTED
  //   SL_RAIL_EVENT_RX_FRAME_ERROR
  //   SL_RAIL_EVENT_RX_PACKET_RECEIVED
}

```

On receive, an application can use a different [sl_rail_rx_data_source_t](data-management#sl-rail-rx-data-source-t) that is only compatible with [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode). All that differs from the FIFO mode example above is the [sl_rail_rx_data_config_t::rx_source](sl-rail-rx-data-config-t#rx-source) setting. IQ data samples are taken at the hardware's oversample rate and the amount of data can easily overwhelm the CPU processing time. The sample rate depends on the chosen PHY, as determined by the data rate and the decimation chain. It is **not** recommended to use the IQ data source with sample rates above 300 k samples/second because the CPU might not be able to keep up with the data stream. Depending on the application and the needed CPU bandwidth, slower data rates may be required. On EFR32xG22 and later platforms, it is recommended to reset the RX buffer before initiating a receive for all modes except [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) since these other modes require the RX buffer's current write offset to be 32-bit aligned. If not reset, capture is performed to the remaining aligned space available. An unaligned write offset will cause [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data) to return error [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state).

```c
// Reset RX buffer (EFR32xG22 and later platforms)
sl_rail_reset_fifo(rail_handle, false, true);

// IQ data is provided into the receive FIFO.
sl_rail_tx_data_config_t rail_tx_data_config = {
  .tx_source = SL_RAIL_TX_DATA_SOURCE_PACKET_DATA,
  .tx_method = SL_RAIL_DATA_METHOD_FIFO_MODE,
};
sl_rail_tx_data_config_t rail_tx_data_config = {
  .rx_source = SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB,
  .rx_method = SL_RAIL_DATA_METHOD_FIFO_MODE,
};

// IQ data comes in the following format when reading out of the FIFO:
//------------------------------------
// I[LSB] | I[MSB] | Q[LSB] | Q[MSB] |
//------------------------------------

```

##### Modules

[RAIL_DataConfig_t](rail-data-config-t)

[sl_rail_tx_data_config_t](sl-rail-tx-data-config-t)

[sl_rail_rx_data_config_t](sl-rail-rx-data-config-t)

##### Enumerations

###### RAIL_TxDataSource_t

```
enum RAIL_TxDataSource_t {
    TX_PACKET_DATA = 0
    TX_MFM_DATA = 1
    RAIL_TX_DATA_SOURCE_COUNT
}
```

**Description:**

Transmit data sources supported by RAIL.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_data_source_t](data-management#sl-rail-tx-data-source-t).

**Enumerator:**

|   |   |
|---|---|
|TX_PACKET_DATA|Uses the frame hardware to packetize data.|
|TX_MFM_DATA|Uses the multi-level frequency modulation data.|
|RAIL_TX_DATA_SOURCE_COUNT|A count of the choices in this enumeration.|

###### RAIL_RxDataSource_t

```
enum RAIL_RxDataSource_t {
    RX_PACKET_DATA = 0
    RX_DEMOD_DATA = 1
    RX_IQDATA_FILTLSB = 2
    RX_IQDATA_FILTMSB = 3
    RX_DIRECT_MODE_DATA = 4
    RX_DIRECT_SYNCHRONOUS_MODE_DATA = 5
    RAIL_RX_DATA_SOURCE_COUNT
}
```

**Description:**

Receive data sources supported by RAIL.

**Details:**

**Note**

- Data sources other than [RX_PACKET_DATA](data-management#rx-packet-data) require use of [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_data_source_t](data-management#sl-rail-rx-data-source-t).

**Enumerator:**

|   |   |
|---|---|
|RX_PACKET_DATA|Uses the frame hardware to packetize data.|
|RX_DEMOD_DATA|Gets 8-bit data output from the demodulator.|
|RX_IQDATA_FILTLSB|Gets lower 16 bits of I/Q data provided to the demodulator.|
|RX_IQDATA_FILTMSB|Gets highest 16 bits of I/Q data provided to the demodulator.|
|RX_DIRECT_MODE_DATA|Gets RX direct mode data output from the demodulator.|
|RX_DIRECT_SYNCHRONOUS_MODE_DATA|Gets synchronous RX direct mode data output from the demodulator.|
|RAIL_RX_DATA_SOURCE_COUNT|A count of the choices in this enumeration.|

###### RAIL_DataMethod_t

```
enum RAIL_DataMethod_t {
    PACKET_MODE = 0
    FIFO_MODE = 1
    RAIL_DATA_METHOD_COUNT
}
```

**Description:**

Methods for the application to provide and retrieve data from RAIL.

**Details:**

For Transmit the distinction between [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) and [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) has become more cosmetic than functional, as the [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) and [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold) APIs and related [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) event can be used in either mode. For Receive the distinction is functionally important because in [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) rollback occurs automatically for unsuccessfully-received packets ([RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) ABORT statuses), flushing their data. In [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) rollback is prevented, leaving the data from unsuccessfully-received packets in the receive FIFO for the application to deal with. This allows for packets larger than the receive FIFO size where automatic rollback would corrupt the receive FIFO.

**Deprecated**RAIL 2.x synonym of [sl_rail_data_method_t](data-management#sl-rail-data-method-t).

**Enumerator:**

|   |   |
|---|---|
|PACKET_MODE|Packet-based data method.|
|FIFO_MODE|FIFO-based data method.|
|RAIL_DATA_METHOD_COUNT|A count of the choices in this enumeration.|

###### sl_rail_tx_data_source_t

```
enum sl_rail_tx_data_source_t {
    SL_RAIL_TX_DATA_SOURCE_PACKET_DATA = 0u
    SL_RAIL_TX_DATA_SOURCE_MFM_DATA = 1u
    SL_RAIL_TX_DATA_SOURCE_COUNT
}
```

**Description:**

Transmit data sources supported by RAIL.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TX_DATA_SOURCE_PACKET_DATA|Uses the frame hardware to packetize data.|
|SL_RAIL_TX_DATA_SOURCE_MFM_DATA|Uses the multi-level frequency modulation data.|
|SL_RAIL_TX_DATA_SOURCE_COUNT|A count of the choices in this enumeration.|

###### sl_rail_rx_data_source_t

```
enum sl_rail_rx_data_source_t {
    SL_RAIL_RX_DATA_SOURCE_PACKET_DATA = 0u
    SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA = 1u
    SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB = 2u
    SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB = 3u
    SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA = 4u
    SL_RAIL_RX_DATA_SOURCE_DIRECT_SYNCHRONOUS_MODE_DATA = 5u
    SL_RAIL_RX_DATA_SOURCE_COUNT
}
```

**Description:**

Receive data sources supported by RAIL.

**Details:**

**Note**

- Data sources other than [SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) require use of [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RX_DATA_SOURCE_PACKET_DATA|Uses the frame hardware to packetize data.|
|SL_RAIL_RX_DATA_SOURCE_DEMOD_DATA|Gets 8-bit data output from the demodulator.|
|SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTLSB|Gets lower 16 bits of I/Q data provided to the demodulator.|
|SL_RAIL_RX_DATA_SOURCE_IQDATA_FILTMSB|Gets highest 16 bits of I/Q data provided to the demodulator.|
|SL_RAIL_RX_DATA_SOURCE_DIRECT_MODE_DATA|Gets RX direct mode data output from the demodulator.|
|SL_RAIL_RX_DATA_SOURCE_DIRECT_SYNCHRONOUS_MODE_DATA|Gets synchronous RX direct mode data output from the demodulator.|
|SL_RAIL_RX_DATA_SOURCE_COUNT|A count of the choices in this enumeration.|

###### sl_rail_data_method_t

```
enum sl_rail_data_method_t {
    SL_RAIL_DATA_METHOD_PACKET_MODE = 0
    SL_RAIL_DATA_METHOD_FIFO_MODE = 1
    SL_RAIL_DATA_METHOD_COUNT
}
```

**Description:**

Methods for the application to provide and retrieve data from RAIL.

**Details:**

For Transmit the distinction between [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) and [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) has become more cosmetic than functional, as the [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo) and [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold) APIs and related [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) event can be used in either mode. For Receive the distinction is functionally important because in [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) rollback occurs automatically for unsuccessfully-received packets ([sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) ABORT statuses), flushing their data. In [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) rollback is prevented, leaving the data from unsuccessfully-received packets in the receive FIFO for the application to deal with. This allows for packets larger than the receive FIFO size where automatic rollback would corrupt the receive FIFO.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_DATA_METHOD_PACKET_MODE|Packet-based data method.|
|SL_RAIL_DATA_METHOD_FIFO_MODE|FIFO-based data method.|
|SL_RAIL_DATA_METHOD_COUNT|A count of the choices in this enumeration.|

##### Typedefs

###### sl_rail_fifo_buffer_align_t

`typedef uint32_t sl_rail_fifo_buffer_align_t`

**Description:**

Type indicating the needed alignment for RX and TX FIFOs.

###### sl_rail_packet_queue_entry_t

`typedef uint64_t sl_rail_packet_queue_entry_t`

**Description:**

Type used for Packet Queue entries.

**Details:**

RAIL utilizes a receive Packet Queue for packet reception metadata that supplements the receive FIFO, helping [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) and [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) provide their information in the order that packets were received.

##### Variables

###### sl_rail_builtin_rx_fifo_bytes

```
const uint16_t sl_rail_builtin_rx_fifo_bytes
```

**Description:** Run-time size in bytes of the built-in receive FIFO buffer to which [sl_rail_builtin_rx_fifo_ptr](data-management#sl-rail-builtin-rx-fifo-ptr) points.

**Details:** Can be assigned to [sl_rail_config_t::rx_fifo_bytes](sl-rail-config-t#rx-fifo-bytes).

###### sl_rail_builtin_rx_fifo_ptr

```
sl_rail_fifo_buffer_align_t* const sl_rail_builtin_rx_fifo_ptr
```

**Description:** Pointer to built-in receive FIFO buffer that can be shared among built-in protocols on the same radio like RAIL 2.x provided internally.

**Details:** Can be assigned to [sl_rail_config_t::p_rx_fifo_buffer](sl-rail-config-t#p-rx-fifo-buffer).

###### sl_rail_builtin_rx_packet_queue_entries

```
const uint16_t sl_rail_builtin_rx_packet_queue_entries
```

**Description:** Run-time number of entries in the built-in receive Packet Queue to which [sl_rail_builtin_rx_packet_queue_ptr](data-management#sl-rail-builtin-rx-packet-queue-ptr) points.

**Details:** Can be assigned to [sl_rail_config_t::rx_packet_queue_entries](sl-rail-config-t#rx-packet-queue-entries).

###### sl_rail_builtin_rx_packet_queue_ptr

```
sl_rail_packet_queue_entry_t* const sl_rail_builtin_rx_packet_queue_ptr
```

**Description:** Pointer to built-in receive Packet queue that can be shared among built-in protocols on the same radio like RAIL 2.x provided internally.

**Details:** Can be assigned to [sl_rail_config_t::p_rx_packet_queue](sl-rail-config-t#p-rx-packet-queue).

##### Functions

###### RAIL_ConfigData

`RAIL_Status_t RAIL_ConfigData(RAIL_Handle_t railHandle, const RAIL_DataConfig_t *dataConfig)`

**Description:** RAIL data management configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_DataConfig_t](rail-data-config-t) *|[in]|dataConfig|A pointer to a non-NULL RAIL data configuration structure.|

**Returns**

- Status code indicating success of the function call. On EFR32xG22 and later platforms, [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) indicates the RX buffer's current write offset is misaligned for the requested [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t).

This function configures how RAIL manages data. The application can configure RAIL to receive data in a packet-based or FIFO-based manner. [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) is necessary to receive packets larger than the radio's receive FIFO. It is also required for receive data sources other than [RAIL_RxDataSource_t::RX_PACKET_DATA](data-management#rx-packet-data).

Generally with [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), the application sets appropriate FIFO thresholds via [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold) and [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold) and then enables and handles the [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) event callback (to feed more packet data via [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) before the FIFO underflows) and the [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) event callback (to consume packet data via [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) before the receive FIFO overflows).

When configuring TX for [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), this function resets the transmit FIFO. When configuring TX or RX for [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode), this function will reset the corresponding FIFO thresholds such that they won't trigger the [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) or [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) events.

When [RAIL_DataConfig_t::rxMethod](rail-data-config-t#rx-method) is set to [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), the radio won't drop packet data of aborted or CRC error packets, but will present it to the application to deal with accordingly. On completion of erroneous packets, the [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted), [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error), or [RAIL_EVENT_RX_ADDRESS_FILTERED](events#rail-event-rx-address-filtered) will tell the application it can drop any data it read via [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) during reception. For CRC error packets when the [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) RX option is in effect, the application should check for that from the [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) obtained by calling [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info). RAIL will automatically flush any remaining packet data after reporting one of these packet completion events or the application can explicitly flush it by calling [RAIL_ReleaseRxPacket()](receive#rail-release-rx-packet).

When [RAIL_DataConfig_t::rxMethod](rail-data-config-t#rx-method) is set to [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode), the radio will roll back (drop) all packet data associated with aborted packets including those with CRC errors (unless configured to ignore CRC errors via the [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) RX option). The application will never have to deal with packet data from these packets. In either mode, the application can set RX options as needed.

When [RAIL_DataConfig_t::rxSource](rail-data-config-t#rx-source) is set to a value other than [RX_PACKET_DATA](data-management#rx-packet-data) and [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback)[RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) is enabled RX will be terminated if a RX FIFO overflow occurs. If [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) is not enabled, data will be discarded until the overflow condition is resolved. To continue capturing data RX must be restarted using [RAIL_StartRx()](receive#rail-start-rx).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by separate [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data) and [sl_rail_config_tx_data()](data-management#sl-rail-config-tx-data) functions. 

###### RAIL_WriteTxFifo

`uint16_t RAIL_WriteTxFifo(RAIL_Handle_t railHandle, const uint8_t *dataPtr, uint16_t writeLength, bool reset)`

**Description:** Write data to the transmit FIFO previously established by [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const uint8_t *|[in]|dataPtr|A pointer to transmit data.|
|uint16_t|[in]|writeLength|A number of bytes to write to the transmit FIFO.|
|bool|[in]|reset|If true, resets transmit FIFO before writing the data.|

**Returns**

- The number of bytes written to the transmit FIFO.

This function copies writeLength bytes of data from the provided dataPtr into the transmit FIFO previously established by [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) or [RAIL_Init()](general#rail-init). If the requested writeLength exceeds the current number of bytes open in the transmit FIFO, the function only writes until the transmit FIFO is full. The function returns the number of bytes written to the transmit FIFO or returns zero if railHandle is NULL or if the transmit FIFO is full.

**Note**

- The protocol's packet configuration, as set up by the radio configurator or via [RAIL_SetFixedLength()](radio-configuration#rail-set-fixed-length), determines how many bytes of data are consumed from the transmit FIFO for a successful transmit operation, not the writeLength value passed in. If not enough data has been put into the transmit FIFO, a [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) event will occur. If too much data is put into the transmit FIFO, the extra data will either become the first bytes sent in a subsequent packet, or will be thrown away if the FIFO gets reset prior to the next transmit. In general, the proper number of packet bytes to put into the transmit FIFO are all payload bytes except for any CRC bytes, which the packet configuration causes to be sent automatically.
- This function does not utilize a critical section but, depending on the application, calling it within a critical section could be appropriate.

**Deprecated**RAIL 2.x synonym of [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). 

###### RAIL_SetTxFifo

`uint16_t RAIL_SetTxFifo(RAIL_Handle_t railHandle, uint8_t *addr, uint16_t initLength, uint16_t size)`

**Description:** Set the address of the transmit FIFO, a circular buffer used for TX data, possibly pre-populated with transmit data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[inout]|addr|An appropriately-aligned (see below) pointer to a read-write memory location in RAM used as the transmit FIFO. This memory must persist until the next call to this function or [RAIL_SetTxFifoAlt](data-management#rail-set-tx-fifo-alt).|
|uint16_t|[in]|initLength|A number of initial bytes already in the transmit FIFO.|
|uint16_t|[in]|size|A desired size of the transmit FIFO in bytes.|

**Returns**

- The transmit FIFO size in bytes, 0 if an error occurs.

This function sets the memory location for the transmit FIFO. [RAIL_SetTxFifo](data-management#rail-set-tx-fifo) or [RAIL_SetTxFifoAlt](data-management#rail-set-tx-fifo-alt) must be called at least once before any transmit operations occur.

FIFO size can be determined by the return value of this function. The chosen size is determined based on the available FIFO sizes supported by the hardware. Similarly, some hardware has stricter FIFO alignment requirements; 32-bit alignment provides the maximum portability across all RAIL platforms. For more on supported FIFO sizes and alignments, see chip-specific documentation, such as [EFR32](efr32-main). The returned FIFO size will be the closest allowed size less than or equal to the passed in size parameter, unless the size parameter is smaller than the minimum FIFO size, in that case 0 is returned. If the initLength parameter is larger than the returned size, the FIFO will be filled up to its size.

A user may write to the custom memory location directly before calling this function, or use [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) to write to the memory location after calling this function. Users must specify the initLength for previously-written memory to be set in the transmit FIFO.

This function reserves the block of RAM starting at addr with a length of the returned FIFO size, which is used internally as a circular buffer for the transmit FIFO. It must be able to hold the entire FIFO size. The caller must guarantee that the custom FIFO remains intact and unchanged (except via calls to [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo)) until the next call to this function.

**Note**

- The protocol's packet configuration, as set up by the radio configurator or via [RAIL_SetFixedLength()](radio-configuration#rail-set-fixed-length), determines how many bytes of data are consumed from the transmit FIFO for a successful transmit operation, not the initLength value passed in. If not enough data has been put into the transmit FIFO, a [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) event will occur. If too much data is put into the transmit FIFO, the extra data will either become the first bytes sent in a subsequent packet, or will be thrown away if the FIFO gets reset prior to the next transmit. In general, the proper number of packet bytes to put into the transmit FIFO are all payload bytes except for any CRC bytes which the packet configuration causes to be sent automatically.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) with additional parameters and permits establishing a non-power-of-2-sized Tx FIFO. 

###### RAIL_SetTxFifoAlt

`uint16_t RAIL_SetTxFifoAlt(RAIL_Handle_t railHandle, uint8_t *addr, uint16_t startOffset, uint16_t initLength, uint16_t size)`

**Description:** Set the address of the transmit FIFO, a circular buffer used for TX data which can start at offset distance from the FIFO base address.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[inout]|addr|An appropriately-aligned (see [RAIL_SetTxFifo](data-management#rail-set-tx-fifo) description) pointer to a read-write memory location in RAM used as the transmit FIFO. This memory must persist until the next call to this function or [RAIL_SetTxFifo](data-management#rail-set-tx-fifo).|
|uint16_t|[in]|startOffset|A number of bytes defining the start position of the TX data from the transmit FIFO base address, only valid if initLength is not 0.|
|uint16_t|[in]|initLength|The number of valid bytes already in the transmit FIFO after startOffset.|
|uint16_t|[in]|size|A desired size of the transmit FIFO in bytes.|

**Returns**

- The transmit FIFO size in bytes, 0 if an error occurs.

This function is similar to [RAIL_SetTxFifo](data-management#rail-set-tx-fifo) except a startOffset can be specified to indicate where the transmit packet data starts. This allows an application to place unaligned initial packet data within the aligned transmit FIFO (initLength > 0). Specifying a startOffset will not reduce the FIFO threshold or affect [RAIL_GetTxFifoSpaceAvailable()](data-management#rail-get-tx-fifo-space-available). [RAIL_SetTxFifo](data-management#rail-set-tx-fifo) or [RAIL_SetTxFifoAlt](data-management#rail-set-tx-fifo-alt) must be called at least once before any transmit operations occur. FIFO size handling is quite same as [RAIL_SetTxFifo](data-management#rail-set-tx-fifo). Only difference is that if the initLength plus startOffset parameters are larger than the returned size, the FIFO will be filled up to its size from startOffset. Note that the startOffset is essentially forgotten after the next transmit – i.e. it applies onto to the next transmit operation, and is not re-established when the transmit FIFO is reset.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) with parameters in a different order and permits establishing a non-power-of-2-sized Tx FIFO. 

###### RAIL_SetRxFifo

`RAIL_Status_t RAIL_SetRxFifo(RAIL_Handle_t railHandle, uint8_t *addr, uint16_t *size)`

**Description:** Set the address of the receive FIFO, a circular buffer used for receive data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[inout]|addr|A pointer to a read-write memory location in RAM used as the receive FIFO. This memory must persist until the next call to this function.|
|uint16_t *|[inout]|size|A pointer to the desired size of the receive FIFO in bytes. This will be updated with the actual size during the function call.|

**Returns**

- Status code indicating success of the function call.

This function sets the memory location for the receive FIFO. It must be called at least once before any receive operations occur.

**Note**

- After it is called, any prior receive FIFO is orphaned. To avoid orphaning the default internal 512-byte receive FIFO so it does not unnecessarily consume RAM resources in your application, implement [RAILCb_SetupRxFifo()](data-management#rail-cb-setup-rx-fifo) to call this function.

FIFO size can be determined by the return value of this function. The chosen size is determined based on the available FIFO sizes supported by the hardware. Similarly, some hardware has stricter FIFO alignment requirements; 32-bit alignment provides the maximum portability across all RAIL platforms. For more on supported FIFO sizes and alignments, see chip-specific documentation, such as [EFR32](efr32-main). The returned FIFO size will be the closest allowed size less than or equal to the passed in size parameter, unless the size parameter is smaller than the minimum FIFO size.

This function reserves the block of RAM starting at addr with a length of size, which is used internally as a circular buffer for the receive FIFO. It must be able to hold the entire FIFO size. The caller must guarantee that the custom FIFO remains intact and unchanged (except via incoming packet data being written) until the next call to this function.

In multiprotocol, RAIL currently shares one receive FIFO across all protocols. This function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if the requested [RAIL_Handle_t](general#rail-handle-t) is not active.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo). Also see [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue). Unlike in RAIL 2.x where the Rx FIFO and internal Packet Queue are shared among all protocols, those RAIL 3 APIs allow a protocol to establish, even when inactive, its own Rx FIFO and Packet Queue independent of other protocols' which are preserved and not reset during protocol switches. 

###### RAILCb_SetupRxFifo

`RAIL_Status_t RAILCb_SetupRxFifo(RAIL_Handle_t railHandle)`

**Description:** Set up the receive FIFO to use.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

This function is optional to implement.

**Returns**

- Status code indicating success of the function call.

This callback is called during the [RAIL_Init()](general#rail-init) process to set up the FIFO to use for received packets. If not implemented by the application, a default implementation from within the RAIL library will be used to initialize an internal default 512-byte receive FIFO.

If this function returns an error, the [RAIL_Init()](general#rail-init) process will fail.

During this function, the application should generally call [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo). If that does not happen, the application needs to set up the receive FIFO via a call to [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo) before attempting to receive any packets. An example implementation may look like the following: 

```c
#define RX_FIFO_BYTES 1024
static __ALIGNED(RAIL_FIFO_ALIGNMENT) uint8_t rxFifo[RX_FIFO_BYTES];

RAIL_Status_t RAILCb_SetupRxFifo(RAIL_Handle_t railHandle)
{
  uint16_t rxFifoBytes = RX_FIFO_BYTES;
  RAIL_Status_t status = RAIL_SetRxFifo(railHandle, &rxFifo[0], &rxFifoBytes);
  if (rxFifoBytes != RX_FIFO_BYTES) {
    // We set up an incorrect FIFO size
    return RAIL_STATUS_INVALID_PARAMETER;
  }
  if (status == RAIL_STATUS_INVALID_STATE) {
    // Allow failures due to multiprotocol
    return RAIL_STATUS_NO_ERROR;
  }
  return status;
}

```

**Deprecated**This RAIL 2.x callback has been eliminated in RAIL 3. The Rx FIFO (and Packet Queue) can be configured in the [sl_rail_config_t](sl-rail-config-t) passed into [sl_rail_init()](general#sl-rail-init), or later via [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) and/or [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue). Unlike in RAIL 2.x where the Rx FIFO and internal Packet Queue are shared among all protocols, those RAIL 3 APIs allow a protocol to establish, even when inactive, its own Rx FIFO and Packet Queue independent of other protocols' which are preserved and not reset during protocol switches. 

###### RAIL_ReadRxFifo

`uint16_t RAIL_ReadRxFifo(RAIL_Handle_t railHandle, uint8_t *dataPtr, uint16_t readLength)`

**Description:** Read packet data from RAIL's receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[out]|dataPtr|An application-provided pointer to store data. If NULL, the data is thrown away rather than copied out.|
|uint16_t|[in]|readLength|A number of packet bytes to read from the FIFO.|

**Returns**

- The number of packet bytes read from the receive FIFO.

This function reads packet data from the head of receive FIFO and writes it to the provided dataPtr. It does not permit reading more data than is available in the FIFO, nor does it permit reading more data than remains in the oldest unreleased packet.

Because this function does not have a critical section, use it only in one context or make sure function calls are protected to prevent buffer corruption.

**Warnings**

- This function is intended for use only with [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) and should never be called in [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode) where it could lead to receive FIFO corruption.

**Note**

- When reading data from an arriving packet that is not yet complete, keep in mind its data is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the receive FIFO could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to know where a packet's payload ends and not interpret appended info as payload data coming from over the air.

**Deprecated**RAIL 2.x synonym of [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo). 

###### RAIL_SetTxFifoThreshold

`uint16_t RAIL_SetTxFifoThreshold(RAIL_Handle_t railHandle, uint16_t txThreshold)`

**Description:** Configure the RAIL transmit FIFO almost empty threshold.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|txThreshold|The threshold below which the [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) event will fire.|

**Returns**

- Configured transmit FIFO threshold value.

This function configures the threshold for the transmit FIFO. When the number of bytes in the transmit FIFO falls below the configured threshold, [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) will fire with [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) set. The txThreshold value should be smaller than or equal to the transmit FIFO size; higher values will be pegged to the FIFO size. A value of 0 or [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled) will disable the threshold, returning [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled).

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold). 

###### RAIL_SetRxFifoThreshold

`uint16_t RAIL_SetRxFifoThreshold(RAIL_Handle_t railHandle, uint16_t rxThreshold)`

**Description:** Configure the RAIL receive FIFO almost full threshold.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|rxThreshold|The threshold above which the [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) event will fire.|

**Returns**

- Configured receive FIFO threshold value.

This function configures the threshold for the receive FIFO. When the number of bytes of packet data in the receive FIFO exceeds the configured threshold, [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) will keep firing with [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) set as long as the number of bytes in the receive FIFO exceeds the configured threshold value. The rxThreshold value should be smaller than the receive FIFO size; anything else, including a value of [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled), will disable the threshold, returning [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled).

**Note**

- To avoid sticking in the event handler (even in idle state):  
  1. Disable the event (via the config events API or the [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled) parameter).  
  2. Increase FIFO threshold.  
  3. Read the FIFO (that's not an option in [RAIL_DataMethod_t::PACKET_MODE](data-management#packet-mode)) in the event handler.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold). 

###### RAIL_GetTxFifoThreshold

`uint16_t RAIL_GetTxFifoThreshold(RAIL_Handle_t railHandle)`

**Description:** Get the RAIL transmit FIFO almost empty threshold value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Configured TX Threshold value in bytes.

Retrieves the configured TX threshold value.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_fifo_threshold()](data-management#sl-rail-get-tx-fifo-threshold). 

###### RAIL_GetRxFifoThreshold

`uint16_t RAIL_GetRxFifoThreshold(RAIL_Handle_t railHandle)`

**Description:** Get the RAIL receive FIFO almost full threshold value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Configured RX Threshold value in bytes.

Retrieves the configured RX threshold value.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_fifo_threshold()](data-management#sl-rail-get-rx-fifo-threshold). 

###### RAIL_ResetFifo

`RAIL_Status_t RAIL_ResetFifo(RAIL_Handle_t railHandle, bool txFifo, bool rxFifo)`

**Description:** Reset the RAIL transmit and/or receive FIFOs.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|txFifo|If true, reset the transmit FIFO.|
|bool|[in]|rxFifo|If true, reset the receive FIFO and its internal metadata FIFO.|

**Returns**

- Status code indicating success of the function call.

This function can reset each FIFO independently. The application should not reset the receive FIFO while receiving a frame, nor should it reset the transmit FIFO while transmitting a frame.

**Deprecated**RAIL 2.x synonym of [sl_rail_reset_fifo()](data-management#sl-rail-reset-fifo). 

###### RAIL_GetRxFifoBytesAvailable

`uint16_t RAIL_GetRxFifoBytesAvailable(RAIL_Handle_t railHandle)`

**Description:** Get the number of bytes used in the receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

Only use this function in RX [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode). Apps should use [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) instead.

**Returns**

- Number of bytes used in the receive FIFO.

This function indicates how much packet-related data exists in the receive FIFO that could be read.

**Note**

- The number of bytes returned may not just reflect the current packet's data but could also include raw appended info bytes added after successful packet reception and bytes from subsequently received packets. It is up to the app to never try to consume more than the packet's actual data when using the value returned here in a subsequent call to [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo), otherwise the receive FIFO will be corrupted.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_fifo_bytes_available()](data-management#sl-rail-get-rx-fifo-bytes-available). Unlike in RAIL 2.x where this function returns 0 when a protocol is inactive, in RAIL 3 if the protocol has established its own independent Rx FIFO and Packet Queue, this function returns the amount of data preserved in the Rx FIFO. 

###### RAIL_GetTxFifoSpaceAvailable

`uint16_t RAIL_GetTxFifoSpaceAvailable(RAIL_Handle_t railHandle)`

**Description:** Get the number of bytes unused in the transmit FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Number of bytes unused in the transmit FIFO.

This function indicates how much space is available in the transmit FIFO for writing additional packet data.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_fifo_space_available()](data-management#sl-rail-get-tx-fifo-space-available). 

###### sl_rail_config_tx_data

`sl_rail_status_t sl_rail_config_tx_data(sl_rail_handle_t rail_handle, const sl_rail_tx_data_config_t *p_tx_data_config)`

**Description:** RAIL TX data management configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_tx_data_config_t](sl-rail-tx-data-config-t) *|[in]|p_tx_data_config|A non-NULL pointer to RAIL TX data configuration structure.|

**Returns**

- Status code indicating success of the function call.

This function configures how RAIL manages TX data.

Generally with [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), the application sets an appropriate FIFO threshold via [sl_rail_set_tx_fifo_threshold()](data-management#sl-rail-set-tx-fifo-threshold) and then enables and handles the [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) event callback (to feed more packet data via [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo) before the FIFO underflows).

When configuring TX for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), this function resets the transmit FIFO. When configuring TX for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode), this function will reset the corresponding FIFO thresholds such that they won't trigger [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) events. 

###### sl_rail_config_rx_data

`sl_rail_status_t sl_rail_config_rx_data(sl_rail_handle_t rail_handle, const sl_rail_rx_data_config_t *p_rx_data_config)`

**Description:** RAIL RX data management configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_rx_data_config_t](sl-rail-rx-data-config-t) *|[in]|p_rx_data_config|A non-NULL pointer to RAIL RX data configuration structure.|

**Returns**

- Status code indicating success of the function call. On EFR32xG22 and later platforms, [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) indicates the RX buffer's current write offset is misaligned for the requested [sl_rail_rx_data_source_t](data-management#sl-rail-rx-data-source-t).

This function configures how RAIL manages RX data. The application can configure RAIL to receive data in a packet-based or FIFO-based manner. [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) is necessary to receive packets larger than the radio's receive FIFO. It is also required for receive data sources other than [sl_rail_rx_data_source_t::SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data).

Generally with [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), the application sets an appropriate FIFO threshold via [sl_rail_set_rx_fifo_threshold()](data-management#sl-rail-set-rx-fifo-threshold) and then enables and handles the [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) event callback (to consume packet data via [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo) before the receive FIFO overflows).

When configuring RX for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode), this function will reset the corresponding FIFO thresholds such that they won't trigger [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) events.

When [sl_rail_rx_data_config_t::rx_method](sl-rail-rx-data-config-t#rx-method) is set to [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), the radio won't drop packet data of aborted or CRC error packets, but will present it to the application to deal with accordingly. On completion of erroneous packets, the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted), [SL_RAIL_EVENT_RX_FRAME_ERROR](events#sl-rail-event-rx-frame-error), or [SL_RAIL_EVENT_RX_ADDRESS_FILTERED](events#sl-rail-event-rx-address-filtered) will tell the application it can drop any data it read via [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo) during reception. For CRC error packets when the [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#sl-rail-rx-option-ignore-crc-errors) RX option is in effect, the application should check for that from the [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) obtained by calling [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info). RAIL will automatically flush any remaining packet data after reporting one of these packet completion events or the application can explicitly flush it by calling [sl_rail_release_rx_packet()](receive#sl-rail-release-rx-packet).

When [sl_rail_rx_data_config_t::rx_method](sl-rail-rx-data-config-t#rx-method) is set to [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode), the radio will roll back (drop) all packet data associated with aborted packets including those with CRC errors (unless configured to ignore CRC errors via the [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#sl-rail-rx-option-ignore-crc-errors) RX option). The application will never have to deal with packet data from these packets. In either mode, the application can set RX options as needed.

When [sl_rail_rx_data_config_t::rx_source](sl-rail-rx-data-config-t#rx-source) is set to a value other than [SL_RAIL_RX_DATA_SOURCE_PACKET_DATA](data-management#sl-rail-rx-data-source-packet-data) and [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback)[SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) is enabled RX will be terminated if a RX FIFO overflow occurs. If [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) is not enabled, data will be discarded until the overflow condition is resolved. To continue capturing data RX must be restarted using [sl_rail_start_rx()](receive#sl-rail-start-rx). 

###### sl_rail_write_tx_fifo

`uint16_t sl_rail_write_tx_fifo(sl_rail_handle_t rail_handle, const uint8_t *p_data, uint16_t write_bytes, bool reset)`

**Description:** Write data to the transmit FIFO previously established by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const uint8_t *|[in]|p_data|A pointer to transmit data.|
|uint16_t|[in]|write_bytes|A number of bytes to write to the transmit FIFO.|
|bool|[in]|reset|If true, resets transmit FIFO before writing the data.|

**Returns**

- The number of bytes written to the transmit FIFO.

This function copies write_bytes of data from the provided p_data into the transmit FIFO previously established by [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) or [sl_rail_init()](general#sl-rail-init). If the requested write_bytes exceeds the current number of bytes open in the transmit FIFO, the function only writes until the transmit FIFO is full. The function returns the number of bytes written to the transmit FIFO or returns zero if rail_handle is NULL or if the transmit FIFO is full.

**Note**

- The protocol's packet configuration, as set up by the radio configurator or via [sl_rail_set_fixed_length()](radio-configuration#sl-rail-set-fixed-length), determines how many bytes of data are consumed from the transmit FIFO for a successful transmit operation, not the write_bytes value passed in. If not enough data has been put into the transmit FIFO, a [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) event will occur. If too much data is put into the transmit FIFO, the extra data will either become the first bytes sent in a subsequent packet, or will be thrown away if the FIFO gets reset prior to the next transmit. In general, the proper number of packet bytes to put into the transmit FIFO are all payload bytes except for any CRC bytes, which the packet configuration causes to be sent automatically.
- This function does not utilize a critical section but, depending on the application, calling it within a critical section could be appropriate.

###### sl_rail_set_tx_fifo

`sl_rail_status_t sl_rail_set_tx_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_addr, uint16_t size_bytes, uint16_t init_bytes, uint16_t start_offset_bytes)`

**Description:** Set the address of the transmit FIFO, a circular buffer used for TX data, possibly pre-populated with transmit data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) *|[inout]|p_addr|An appropriately-aligned (see [sl_rail_set_tx_fifo](data-management#sl-rail-set-tx-fifo) description) pointer to a read-write memory location in RAM used as the transmit FIFO. This memory must persist until the next call to this function.|
|uint16_t|[in]|size_bytes|The size of the transmit FIFO in bytes. See below for the range of sizes supported and non-power-of-2 limitations.|
|uint16_t|[in]|init_bytes|The number of valid bytes already populated in the transmit FIFO after start_offset.|
|uint16_t|[in]|start_offset_bytes|A number of bytes defining the start position of the TX data from the transmit FIFO p_addr, only valid if init_bytes is not 0.|

**Returns**

- Status code indicating success of the function call.

This function sets the RAM memory area for the transmit FIFO. It must be called at least once before any transmit operations occur, unless a transmit FIFO was previously established by [sl_rail_init()](general#sl-rail-init) in its [sl_rail_config_t](sl-rail-config-t).

The actual FIFO size is specified by the size_bytes argument. It is recommended that size_bytes be a power-of-2 between [SL_RAIL_MINIMUM_FIFO_BYTES](data-management#sl-rail-minimum-fifo-bytes) and [SL_RAIL_MAXIMUM_FIFO_BYTES](data-management#sl-rail-maximum-fifo-bytes), inclusive, so RAIL can treat the buffer as circular and support [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) operation. If size_bytes is a non-power-of-2 it must be below [SL_RAIL_MAXIMUM_FIFO_BYTES](data-management#sl-rail-maximum-fifo-bytes) and is treated as a linear buffer suitable for [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) only.

**Note**

- This is different than RAIL 2.x [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) which disallowed transmit FIFOs smaller than [SL_RAIL_MINIMUM_FIFO_BYTES](data-management#sl-rail-minimum-fifo-bytes) and would round down a non-power-of-2 size to the next-smaller power-of-2.

Platforms have different FIFO alignment requirements. The [sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) accurately reflects the platform's alignment requirement, and the [SL_RAIL_DECLARE_FIFO_BUFFER()](data-management#sl-rail-declare-fifo-buffer) convenience macro should be used to declare it. If the FIFO is improperly aligned, an error is returned.

Typically [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo) is used to write transmit data to the FIFO after calling this function. However, users may pre-populate transmit data directly in the FIFO's memory before calling this function, in which case they must specify the start_offset (allowing unaligned packet data in the aligned FIFO) and init_bytes (relative to start_offset) of that data. If the start_offset plus init_bytes is larger than the FIFOs actual size, the data will be truncated to the FIFO's actual size. Specifying a start_offset will not reduce the FIFO threshold or affect [sl_rail_get_tx_fifo_space_available()](data-management#sl-rail-get-tx-fifo-space-available).

**Note**

- The start_offset is essentially forgotten after the next transmit – it applies only to the next transmit operation, and is not re-established when the transmit FIFO is reset.

In multiprotocol, each protocol should establish its own transmit FIFO; it's not feasible to share a single transmit FIFO among multiple protocols.

**Note**

- The protocol's packet configuration, as set up by the radio configurator or via [sl_rail_set_fixed_length()](radio-configuration#sl-rail-set-fixed-length), determines how many bytes of data are consumed from the transmit FIFO for a successful transmit operation, not the init_bytes value passed in. If not enough data has been put into the transmit FIFO, a [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) event will occur. If too much data is put into the transmit FIFO, the extra data will either become the first bytes sent in a subsequent packet, or will be thrown away if the FIFO gets reset or re-established prior to the next transmit. In general, the proper number of packet bytes to put into the transmit FIFO are all payload bytes except for any CRC bytes which the packet configuration causes to be sent automatically.
- After this function is successfully called, any prior transmit FIFO is orphaned.

###### sl_rail_set_rx_fifo

`sl_rail_status_t sl_rail_set_rx_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_addr, uint16_t *p_size_bytes)`

**Description:** Set the address of the receive FIFO, a circular buffer used for receive data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) *|[inout]|p_addr|A pointer to a read-write memory location in RAM used as the receive FIFO. This memory must persist until the next call to this function.|
|uint16_t *|[inout]|p_size_bytes|A pointer to the desired size of the receive FIFO in bytes. This will be updated with the actual size during the function call.|

**Returns**

- Status code indicating success of the function call.

This function sets the RAM memory area for the receive FIFO, a circular buffer used to hold received data from one or more packets. It must be called at least once before any receive operations occur, unless a receive FIFO was previously established by [sl_rail_init()](general#sl-rail-init) in its [sl_rail_config_t](sl-rail-config-t).

The actual FIFO size can be determined by the output p_size_bytes argument. The chosen size is determined based on the available FIFO sizes supported by the hardware and will be the closest allowed size less than or equal to the requested size, unless the requested size is smaller than the minimum FIFO size, in which case an error is returned. For more on supported FIFO sizes and alignments, see chip-specific documentation, such as [EFR32](efr32-main).

Platforms have different FIFO alignment requirements. The [sl_rail_fifo_buffer_align_t](data-management#sl-rail-fifo-buffer-align-t) accurately reflects the platform's alignment requirement, and the [SL_RAIL_DECLARE_FIFO_BUFFER()](data-management#sl-rail-declare-fifo-buffer) convenience macro should be used to declare it. If the FIFO is improperly aligned, an error is returned.

In multiprotocol, RAIL allows each protocol to have its own receive FIFO (and receive packet queue) or to share one receive FIFO and receive Packet Queue across multiple protocols.

**Note**

- This should never be called while the radio is active nor from the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback). After it is called, any prior receive FIFO is orphaned.
- The receive FIFO works in conjunction with the receive Packet Queue that must be set up by [sl_rail_init()](general#sl-rail-init) or [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue).

###### sl_rail_read_rx_fifo

`uint16_t sl_rail_read_rx_fifo(sl_rail_handle_t rail_handle, uint8_t *p_data, uint16_t read_bytes)`

**Description:** Read packet data from RAIL's receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t *|[out]|p_data|An application-provided pointer to store data. If NULL, the data is thrown away rather than copied out.|
|uint16_t|[in]|read_bytes|A number of packet bytes to read from the FIFO.|

**Returns**

- The number of packet bytes read from the receive FIFO.

This function reads packet data from the head of receive FIFO and writes it to the provided p_data. It does not permit reading more data than is available in the FIFO, nor does it permit reading more data than remains in the oldest unreleased packet.

Because this function does not have a critical section, use it only in one context or make sure function calls are protected to prevent buffer corruption.

**Warnings**

- This function is intended for use only with [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) and should never be called in [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) where it could lead to receive FIFO corruption.

**Note**

- When reading data from an arriving packet that is not yet complete, keep in mind its data is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the receive FIFO could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to know where a packet's payload ends and not interpret appended info as payload data coming from over the air.

###### sl_rail_set_rx_packet_queue

`sl_rail_status_t sl_rail_set_rx_packet_queue(sl_rail_handle_t rail_handle, sl_rail_packet_queue_entry_t *p_rx_packet_queue, uint16_t *p_entries)`

**Description:** Set the address of the receive Packet Queue, a circular buffer used by RAIL for received packet metadata that supplements the receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_packet_queue_entry_t](data-management#sl-rail-packet-queue-entry-t) *|[in]|p_rx_packet_queue|A pointer to a read-write memory location in RAM to use for the receive Packet Queue. This memory must persist until the next call to this function and must be able to hold at least the specified p_entries packets.|
|uint16_t *|[inout]|p_entries|The desired number of entries in the receive Packet Queue. This will be updated with the actual number of entries if the requested entries are not feasible but fewer are.|

**Returns**

- Status code indicating success of the function call.

This function sets the RAM memory location for the receive Packet Queue. The number of entries in this circular queue represents the number of packets RAIL can queue to the application before [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) might occur.

This queue is used for per-packet metadata separate from actual packet payload data placed in the receive FIFO buffer. This function must be called at least once before any receive operations occur if a receive Packet Queue was not provided at [sl_rail_init()](general#sl-rail-init) time via [sl_rail_config_t::p_rx_packet_queue](sl-rail-config-t#p-rx-packet-queue).

The actual number of entries can be determined by the output p_entries argument. The chosen number is determined based on the available queue entries supported by the radio and will be the closest allowed number less than or equal to the requested number, unless the requested number is smaller than the minimum number of queue entries, in which case an error is returned. For more on the supported number of receive Packet Queue entries see chip-specific documentation, such as [EFR32](efr32-main).

**Note**

- This should never be called while the radio is active nor from the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback). After it is called, any prior receive Packet Queue is orphaned.
- If [sl_rail_reset_fifo()](data-management#sl-rail-reset-fifo) is called to reset the receive FIFO, the receive Packet Queue is also reset.

###### sl_rail_set_tx_fifo_threshold

`uint16_t sl_rail_set_tx_fifo_threshold(sl_rail_handle_t rail_handle, uint16_t tx_threshold_bytes)`

**Description:** Configure the RAIL transmit FIFO almost empty threshold.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|tx_threshold_bytes|The threshold below which the [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) event will fire.|

**Returns**

- Configured transmit FIFO threshold value.

This function configures the threshold for the transmit FIFO. When the number of bytes in the transmit FIFO falls below the configured threshold, [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) will fire with [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#sl-rail-event-tx-fifo-almost-empty) set. The tx_threshold_bytes value should be smaller than or equal to the transmit FIFO size; higher values will be pegged to the FIFO size. A value of 0 or [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled) will disable the threshold, returning [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled). 

###### sl_rail_set_rx_fifo_threshold

`uint16_t sl_rail_set_rx_fifo_threshold(sl_rail_handle_t rail_handle, uint16_t rx_threshold_bytes)`

**Description:** Configure the RAIL receive FIFO almost full threshold.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|rx_threshold_bytes|The threshold above which the [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) event will fire.|

**Returns**

- Configured receive FIFO threshold value.

This function configures the threshold for the receive FIFO. When the number of bytes of packet data in the receive FIFO exceeds the configured threshold, [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) will keep firing with [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#sl-rail-event-rx-fifo-almost-full) set as long as the number of bytes in the receive FIFO exceeds the configured threshold value. The rx_threshold_bytes value should be smaller than the receive FIFO size; anything else, including a value of [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled), will disable the threshold, returning [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled).

**Note**

- To avoid sticking in the event handler (even in idle state):  
  1. Disable the event (via the config events API or the [SL_RAIL_FIFO_THRESHOLD_DISABLED](data-management#sl-rail-fifo-threshold-disabled) parameter).  
  2. Increase FIFO threshold.  
  3. Read the FIFO (that's not an option in [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode)) in the event handler.

###### sl_rail_get_tx_fifo_threshold

`uint16_t sl_rail_get_tx_fifo_threshold(sl_rail_handle_t rail_handle)`

**Description:** Get the RAIL transmit FIFO almost empty threshold value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Configured TX Threshold value in bytes.

Retrieves the configured TX threshold value. 

###### sl_rail_get_rx_fifo_threshold

`uint16_t sl_rail_get_rx_fifo_threshold(sl_rail_handle_t rail_handle)`

**Description:** Get the RAIL receive FIFO almost full threshold value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Configured RX Threshold value in bytes.

Retrieves the configured RX threshold value. 

###### sl_rail_reset_fifo

`sl_rail_status_t sl_rail_reset_fifo(sl_rail_handle_t rail_handle, bool tx_fifo, bool rx_fifo)`

**Description:** Reset the RAIL transmit and/or receive FIFOs.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|tx_fifo|If true, reset the transmit FIFO.|
|bool|[in]|rx_fifo|If true, reset the receive FIFO and its associated receive Packet Queue.|

**Returns**

- Status code indicating success of the function call.

This function can reset each FIFO independently. The application should not reset the receive FIFO while receiving a frame, nor should it reset the transmit FIFO while transmitting a frame. 

###### sl_rail_get_rx_fifo_bytes_available

`uint16_t sl_rail_get_rx_fifo_bytes_available(sl_rail_handle_t rail_handle)`

**Description:** Get the number of bytes used in the receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

Only use this function in RX [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode). Apps should use [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) instead.

**Returns**

- Number of bytes used in the receive FIFO.

This function indicates how much packet-related data exists in the receive FIFO that could be read.

**Note**

- The number of bytes returned may not just reflect the current packet's data but could also include raw appended info bytes added after successful packet reception and bytes from subsequently received packets. It is up to the app to never try to consume more than the packet's actual data when using the value returned here in a subsequent call to [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo), otherwise the receive FIFO will be corrupted.

###### sl_rail_get_tx_fifo_space_available

`uint16_t sl_rail_get_tx_fifo_space_available(sl_rail_handle_t rail_handle)`

**Description:** Get the number of bytes unused in the transmit FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Number of bytes unused in the transmit FIFO.

This function indicates how much space is available in the transmit FIFO for writing additional packet data. 

##### Macros

`#define RAIL_FIFO_ALIGNMENT_TYPE uint32_t`

**Description**: Fixed-width type indicating the needed alignment for RX and TX FIFOs.

`#define RAIL_FIFO_ALIGNMENT (sizeof(RAIL_FIFO_ALIGNMENT_TYPE))`

**Description**: Alignment that is needed for the RX and TX FIFOs.

`#define RAIL_FIFO_THRESHOLD_DISABLED 0xFFFFU`

**Description**: A FIFO threshold value that disables the threshold.

`#define SL_RAIL_BUILTIN_RX_FIFO_BYTES 512`

**Description**: Compile-time size in bytes of the built-in receive FIFO buffer to which [sl_rail_builtin_rx_fifo_ptr](data-management#sl-rail-builtin-rx-fifo-ptr) points.

`#define SL_RAIL_BUILTIN_RX_PACKET_QUEUE_ENTRIES 16`

**Description**: Compile-time number of entries in the built-in receive Packet Queue to which [sl_rail_builtin_rx_packet_queue_ptr](data-management#sl-rail-builtin-rx-packet-queue-ptr) points.

`#define SL_RAIL_DECLARE_FIFO_BUFFER (buffer_name, bytes)`

**Description**: Convenience macro for declaring RAIL FIFO buffers of desired size.

`#define SL_RAIL_MINIMUM_FIFO_BYTES (64U)`

**Description**: The minimum size in bytes of a receive / transmit / Auto-Ack FIFO.

`#define SL_RAIL_MAXIMUM_FIFO_BYTES (4096U)`

**Description**: The maximum size in bytes of a receive / transmit / Auto-Ack FIFO.

`#define SL_RAIL_FIFO_THRESHOLD_DISABLED 0xFFFFU`

**Description**: A FIFO threshold value that disables the threshold.

RAIL data configuration structure. 

Select the transmit/receive data sources and the method the application uses to provide/retrieve data from RAIL.

**Deprecated**This RAIL 2.x structure has been split in RAIL 3 into [sl_rail_rx_data_config_t](sl-rail-rx-data-config-t) and [sl_rail_tx_data_config_t](sl-rail-tx-data-config-t). 

###### Public Attributes

###### txSource (heading level 7)

```
RAIL_TxDataSource_t RAIL_DataConfig_t::txSource
```

**Description:** Source of TX Data.

**Details:** **Deprecated**Use [sl_rail_tx_data_config_t::tx_source](sl-rail-tx-data-config-t#tx-source).

###### rxSource (heading level 7)

```
RAIL_RxDataSource_t RAIL_DataConfig_t::rxSource
```

**Description:** Source of RX Data.

**Details:** **Deprecated**Use [sl_rail_rx_data_config_t::rx_source](sl-rail-rx-data-config-t#rx-source).

###### txMethod (heading level 7)

```
RAIL_DataMethod_t RAIL_DataConfig_t::txMethod
```

**Description:** Method of providing transmit data.

**Details:** **Deprecated**Use [sl_rail_tx_data_config_t::tx_method](sl-rail-tx-data-config-t#tx-method).

###### rxMethod (heading level 7)

```
RAIL_DataMethod_t RAIL_DataConfig_t::rxMethod
```

**Description:** Method of retrieving receive data.

**Details:** **Deprecated**Use [sl_rail_rx_data_config_t::rx_method](sl-rail-rx-data-config-t#rx-method).

RAIL TX data configuration structure. 

Select the transmit data sources and the method the application uses to provide data to RAIL. 

###### Public Attributes

###### tx_source (heading level 7)

```
sl_rail_tx_data_source_t sl_rail_tx_data_config_t::tx_source
```

**Description:** Source of TX Data.

###### tx_method (heading level 7)

```
sl_rail_data_method_t sl_rail_tx_data_config_t::tx_method
```

**Description:** Method of providing transmit data.

RAIL RX data configuration structure. 

Select the receive data sources and the method the application uses to retrieve data from RAIL. 

###### Public Attributes

###### rx_source (heading level 7)

```
sl_rail_rx_data_source_t sl_rail_rx_data_config_t::rx_source
```

**Description:** Source of RX Data.

###### rx_method (heading level 7)

```
sl_rail_data_method_t sl_rail_rx_data_config_t::rx_method
```

**Description:** Method of retrieving receive data.

#### Diagnostic

APIs for diagnostic and test chip modes. 

##### Modules

[RAIL_DirectModeConfig_t](rail-direct-mode-config-t)

[RAIL_VerifyConfig_t](rail-verify-config-t)

[sl_rail_direct_mode_config_t](sl-rail-direct-mode-config-t)

##### Enumerations

###### RAIL_StreamMode_t

```
enum RAIL_StreamMode_t {
    RAIL_STREAM_CARRIER_WAVE = 0
    RAIL_STREAM_PN9_STREAM = 1
    RAIL_STREAM_10_STREAM = 2
    RAIL_STREAM_CARRIER_WAVE_PHASENOISE = 3
    RAIL_STREAM_RAMP_STREAM = 4
    RAIL_STREAM_CARRIER_WAVE_SHIFTED = 5
    RAIL_STREAM_1000_STREAM = 6
    RAIL_STREAM_MODES_COUNT
}
```

**Description:**

Possible stream output modes.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_stream_mode_t](diagnostic#sl-rail-stream-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_STREAM_CARRIER_WAVE|An unmodulated carrier wave.|
|RAIL_STREAM_PN9_STREAM|PN9 byte sequence.|
|RAIL_STREAM_10_STREAM|101010 sequence.|
|RAIL_STREAM_CARRIER_WAVE_PHASENOISE|An unmodulated carrier wave with no change to PLL BW.|
|RAIL_STREAM_RAMP_STREAM|ramp sequence starting at a different offset for consecutive packets.|
|RAIL_STREAM_CARRIER_WAVE_SHIFTED|An unmodulated carrier wave not centered on DC but shifted roughly by channel_bandwidth/6 allowing an easy check of the residual DC.|
|RAIL_STREAM_1000_STREAM|10001000 sequence.|
|RAIL_STREAM_MODES_COUNT|A count of the choices in this enumeration.|

###### sl_rail_stream_mode_t

```
enum sl_rail_stream_mode_t {
    SL_RAIL_STREAM_CARRIER_WAVE = 0u
    SL_RAIL_STREAM_PN9_STREAM = 1u
    SL_RAIL_STREAM_10_STREAM = 2u
    SL_RAIL_STREAM_CARRIER_WAVE_PHASENOISE = 3u
    SL_RAIL_STREAM_RAMP_STREAM = 4u
    SL_RAIL_STREAM_CARRIER_WAVE_SHIFTED = 5u
    SL_RAIL_STREAM_1000_STREAM = 6u
    SL_RAIL_STREAM_MODES_COUNT
}
```

**Description:**

Possible stream output modes.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_STREAM_CARRIER_WAVE|An unmodulated carrier wave.|
|SL_RAIL_STREAM_PN9_STREAM|PN9 byte sequence.|
|SL_RAIL_STREAM_10_STREAM|101010 sequence.|
|SL_RAIL_STREAM_CARRIER_WAVE_PHASENOISE|An unmodulated carrier wave with no change to PLL BW.|
|SL_RAIL_STREAM_RAMP_STREAM|ramp sequence starting at a different offset for consecutive packets.|
|SL_RAIL_STREAM_CARRIER_WAVE_SHIFTED|An unmodulated carrier wave not centered on DC but shifted roughly by channel_bandwidth/6 allowing an easy check of the residual DC.|
|SL_RAIL_STREAM_1000_STREAM|10001000 sequence.|
|SL_RAIL_STREAM_MODES_COUNT|A count of the choices in this enumeration.|

##### Typedefs

###### RAIL_FrequencyOffset_t

`RAIL_FrequencyOffset_t`

**Description:**

Type that represents the number of Frequency Offset units.

**Details:**

It is used with [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset) and [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset).

The units are chip-specific. For EFR32 they are radio synthesizer resolution steps (synth ticks) and is limited to 15 bits. A value of [RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#rail-frequency-offset-invalid) means that this value is invalid.

**Deprecated**RAIL 2.x synonym of [sl_rail_frequency_offset_t](diagnostic#sl-rail-frequency-offset-t).

###### RAIL_VerifyCallbackPtr_t

`typedef bool(* RAIL_VerifyCallbackPtr_t) (uint32_t address, uint32_t expectedValue, uint32_t actualValue)`

**Description:**

A pointer to a verification callback function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|address|The address of the data in question.|
||[in]|expectedValue|The expected value of the data in question.|
||[in]|actualValue|The actual value of the data in question.|

**Details:**

This will be called by the radio state verification feature built into RAIL when a verified memory value is different from its reference value.

**Returns**

- true indicates a data value difference is acceptable. false indicates a data value difference in unacceptable.

**Note**

- This callback will be issued when an address' value is different from its reference value and either of the following conditions are met:  
  1. The default radio configuration provided by the radio configurator is used for verification purposes (i.e., a custom radio configuration is not supplied as an input to [RAIL_ConfigVerification()](diagnostic#rail-config-verification)), and the radio configurator has flagged the address under question as being verifiable.  
  2. A custom radio configuration is provided to the verification API (i.e., a custom radio configuration is supplied as an input to [RAIL_ConfigVerification()](diagnostic#rail-config-verification)). When providing a custom radio configuration for verification purposes, all addresses in that configuration will be verified, regardless of whether or not the addresses are flagged as verifiable.

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3. This functionality is no longer supported.

###### sl_rail_frequency_offset_t

`sl_rail_frequency_offset_t`

**Description:**

Type that represents the number of Frequency Offset units.

**Details:**

It is used with [sl_rail_get_rx_freq_offset()](diagnostic#sl-rail-get-rx-freq-offset) and [sl_rail_set_freq_offset()](diagnostic#sl-rail-set-freq-offset).

The units are chip-specific. For EFR32 they are radio synthesizer resolution steps (synth ticks) and is limited to 15 bits. A value of [SL_RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#sl-rail-frequency-offset-invalid) means that this value is invalid.

##### Functions

###### RAIL_ConfigDirectMode

`RAIL_Status_t RAIL_ConfigDirectMode(RAIL_Handle_t railHandle, const RAIL_DirectModeConfig_t *directModeConfig)`

**Description:** Configure direct mode for RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_DirectModeConfig_t](rail-direct-mode-config-t) *|[in]|directModeConfig|A pointer to a configuration structure to specify direct mode parameters. Default configuration will be used if NULL is passed.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success and an error code on failure.

This API configures direct mode and should be called before calling [RAIL_EnableDirectMode()](diagnostic#rail-enable-direct-mode). If this function is not called, the following default [RAIL_DirectModeConfig_t](rail-direct-mode-config-t) configuration will be used: <br />

```c
RAIL_DirectModeConfig_t defaultConfig = {
  .syncRx   = false,
  .syncTx   = false,
  .doutPort = SL_GPIO_PORT_A,
  .doutPin  = 5,
  .dinPort  = SL_GPIO_PORT_A,
  .dinPin   = 7,
  .dclkPort = SL_GPIO_PORT_A,
  .dclkPin  = 6,
};

```

**Warnings**

- This API is not safe to use in a multiprotocol app.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_direct_mode()](diagnostic#sl-rail-config-direct-mode). 

###### RAIL_EnableDirectMode

`RAIL_Status_t RAIL_EnableDirectMode(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable or disable direct mode for RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Whether or not to enable direct mode for TX and RX.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success and an error code on failure.

See [RAIL_EnableDirectModeAlt()](diagnostic#rail-enable-direct-mode-alt) for more detailed function description.

**Warnings**

- New applications should consider using [RAIL_EnableDirectModeAlt()](diagnostic#rail-enable-direct-mode-alt) for this functionality.

**Note**

- This feature is only available on certain devices. [RAIL_SupportsDirectMode()](features#rail-supports-direct-mode) can be used to check if a particular device supports this feature or not.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode) with different parameters. 

###### RAIL_EnableDirectModeAlt

`RAIL_Status_t RAIL_EnableDirectModeAlt(RAIL_Handle_t railHandle, bool enableDirectTx, bool enableDirectRx)`

**Description:** Enable or disable direct mode for RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enableDirectTx|Enable direct mode for data being transmitted out of the radio.|
|bool|[in]|enableDirectRx|Enable direct mode for data being received from the radio.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success or an error code on failure.

This API enables or disables the modem and GPIOs for direct mode operation. see [RAIL_ConfigDirectMode()](diagnostic#rail-config-direct-mode) for information on selecting the correct hardware configuration. If direct mode is enabled, packets are output and input directly to the radio via GPIO and RAIL packet handling is ignored.

**Note**

- This feature is only available on certain chips. [RAIL_SupportsDirectMode()](features#rail-supports-direct-mode) can be used to check if a particular chip supports this feature or not.

**Warnings**

- This API is not safe to use in a multiprotocol app.
- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode). 

###### RAIL_GetRadioClockFreqHz

`uint32_t RAIL_GetRadioClockFreqHz(RAIL_Handle_t railHandle)`

**Description:** Get the radio subsystem clock frequency in Hz.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Radio subsystem clock frequency in Hz.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_radio_clock_freq_hz()](diagnostic#sl-rail-get-radio-clock-freq-hz). 

###### RAIL_SetTune

`RAIL_Status_t RAIL_SetTune(RAIL_Handle_t railHandle, uint32_t tune)`

**Description:** Set the crystal tuning.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t|[in]|tune|A chip-dependent crystal capacitor bank tuning parameter.|

**Returns**

- Status code indicating success of the function call.

Tunes the crystal that the radio depends on to change the location of the center frequency for transmitting and receiving. This function will only succeed if the radio is idle at the time of the call.

**Note**

- This function proportionally affects the entire chip's timing across all its peripherals, including radio tuning and channel spacing. It is recommended to call this function only when HFXO is not being used, as it can cause disturbance on the HFXO frequency. A separate function, [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset), can be used to adjust just the radio tuner without disturbing channel spacing or other chip peripheral timing.
- This API sets CTUNEXIANA and internally CTUNEXOANA = CTUNEXIANA + delta where delta is set or changed by [RAIL_SetTuneDelta()](diagnostic#rail-set-tune-delta). The default delta may not be 0 on some devices.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tune()](diagnostic#sl-rail-set-tune). 

###### RAIL_GetTune

`uint32_t RAIL_GetTune(RAIL_Handle_t railHandle)`

**Description:** Get the crystal tuning.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- A chip-dependent crystal capacitor bank tuning parameter.

Retrieves the current tuning value used by the crystal that the radio depends on. **Note**

- This is the CTUNEXIANA value.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tune()](diagnostic#sl-rail-get-tune). 

###### RAIL_SetTuneDelta

`RAIL_Status_t RAIL_SetTuneDelta(RAIL_Handle_t railHandle, int32_t delta)`

**Description:** Set the crystal tuning delta.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int32_t|[in]|delta|A chip-dependent crystal capacitor bank tuning delta.|

**Returns**

- Status code indicating success of the function call.

Set the CTUNEXOANA delta for [RAIL_SetTune()](diagnostic#rail-set-tune) to use: CTUNEXOANA = CTUNEXIANA + delta (subject to field-size limitations). This function does not change CTUNE values; call [RAIL_SetTune()](diagnostic#rail-set-tune) to put a new delta into effect.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tune_delta()](diagnostic#sl-rail-set-tune-delta). 

###### RAIL_GetTuneDelta

`int32_t RAIL_GetTuneDelta(RAIL_Handle_t railHandle)`

**Description:** Get the crystal tuning delta.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- A chip-dependent crystal capacitor bank tuning delta.

Retrieves the current tuning delta used by [RAIL_SetTune()](diagnostic#rail-set-tune). **Note**

- The default delta if [RAIL_SetTuneDelta()](diagnostic#rail-set-tune-delta) has never been called is device-dependent and may not be 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tune_delta()](diagnostic#sl-rail-get-tune-delta). 

###### RAIL_GetRxFreqOffset

`RAIL_FrequencyOffset_t RAIL_GetRxFreqOffset(RAIL_Handle_t railHandle)`

**Description:** Get the frequency offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The measured frequency offset on a received packet. The units are described in the [RAIL_FrequencyOffset_t](diagnostic#rail-frequency-offset-t) documentation. If this returns [RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#rail-frequency-offset-invalid), it was called while the radio wasn't active and there is no way to get the frequency offset.

Retrieves the measured frequency offset used during the previous received packet, which includes the current radio frequency offset (see [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset)). If the chip has not been in RX, it returns the nominal radio frequency offset.

**Note**

- Changing to any non-idle radio state after reception can cause this value to be overwritten so it is safest to capture during packet reception.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_freq_offset()](diagnostic#sl-rail-get-rx-freq-offset). 

###### RAIL_SetFreqOffset

`RAIL_Status_t RAIL_SetFreqOffset(RAIL_Handle_t railHandle, RAIL_FrequencyOffset_t freqOffset)`

**Description:** Set the nominal radio frequency offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_FrequencyOffset_t](diagnostic#rail-frequency-offset-t)|[in]|freqOffset|[RAIL_FrequencyOffset_t](diagnostic#rail-frequency-offset-t) parameter (signed, 2's complement).|

**Returns**

- Status code indicating success of the function call.

This function is used to adjust the radio's tuning frequency slightly up or down. It might be used in conjunction with [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset) after receiving a packet from a peer to adjust the tuner to better match the peer's tuned frequency.

**Note**

- Unlike [RAIL_SetTune()](diagnostic#rail-set-tune), which affects the entire chip's timing including radio tuning and channel spacing, this function only affects radio tuning without disturbing channel spacing or other chip peripheral timing.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_freq_offset()](diagnostic#sl-rail-set-freq-offset). 

###### RAIL_StartTxStream

`RAIL_Status_t RAIL_StartTxStream(RAIL_Handle_t railHandle, uint16_t channel, RAIL_StreamMode_t mode)`

**Description:** Start transmitting a stream on a certain channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|A channel on which to emit a stream.|
|[RAIL_StreamMode_t](diagnostic#rail-stream-mode-t)|[in]|mode|Choose the stream mode (PN9, and so on).|

**Returns**

- Status code indicating success of the function call.

Begins streaming onto the given channel. The sources can either be an unmodulated carrier wave or an encoded stream of bits from a PN9 source. All ongoing radio operations will be stopped before transmission begins.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream) with its additional parameter. 

###### RAIL_StartTxStreamAlt

`RAIL_Status_t RAIL_StartTxStreamAlt(RAIL_Handle_t railHandle, uint16_t channel, RAIL_StreamMode_t mode, RAIL_TxOptions_t options)`

**Description:** Start transmitting a stream on a certain channel with the ability to select an antenna.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|A channel on which to emit a stream.|
|[RAIL_StreamMode_t](diagnostic#rail-stream-mode-t)|[in]|mode|Choose the stream mode (PN9, and so on).|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|Choose the TX Antenna option. Takes only [RAIL_TX_OPTION_ANTENNA0](transmit#rail-tx-option-antenna0), [RAIL_TX_OPTION_ANTENNA1](transmit#rail-tx-option-antenna1), [RAIL_TX_OPTIONS_DEFAULT](transmit#rail-tx-options-default) or [RAIL_TX_OPTIONS_NONE](transmit#rail-tx-options-none) from the [RAIL_TxOptions_t](transmit#rail-tx-options-t). If some other value is used then, transmission is possible on any antenna.|

**Returns**

- Status code indicating success of the function call.

Begins streaming onto the given channel. The sources can either be an unmodulated carrier wave or an encoded stream of bits from a PN9 source. All ongoing radio operations will be stopped before transmission begins.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream). 

###### RAIL_StopTxStream

`RAIL_Status_t RAIL_StopTxStream(RAIL_Handle_t railHandle)`

**Description:** Stop stream transmission and idle the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Halts the transmission started by [RAIL_StartTxStream()](diagnostic#rail-start-tx-stream).

**Deprecated**RAIL 2.x synonym of [sl_rail_stop_tx_stream()](diagnostic#sl-rail-stop-tx-stream). 

###### RAIL_StopInfinitePreambleTx

`RAIL_Status_t RAIL_StopInfinitePreambleTx(RAIL_Handle_t railHandle)`

**Description:** Stop infinite preamble transmission started and start transmitting the rest of the packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call: [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if infinite preamble was stopped; [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if the radio isn't configured for infinite preamble; [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if the radio isn't transmitting.

This function is only useful for radio configurations that specify an infinite preamble. Call this API only after [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) has occurred and the radio is transmitting.

**Deprecated**RAIL 2.x synonym of [sl_rail_stop_infinite_preamble_tx()](diagnostic#sl-rail-stop-infinite-preamble-tx). 

###### RAIL_ConfigVerification

`RAIL_Status_t RAIL_ConfigVerification(RAIL_Handle_t railHandle, RAIL_VerifyConfig_t *configVerify, RAIL_RadioConfig_t radioConfig, RAIL_VerifyCallbackPtr_t cb)`

**Description:** Configure the verification of radio memory contents.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_VerifyConfig_t](rail-verify-config-t) *|[inout]|configVerify|A pointer to a configuration structure made available to RAIL to perform radio state verification. This structure must be allocated in application global read-write memory. RAIL may modify fields within or referenced by this structure during its operation.|
|[RAIL_RadioConfig_t](radio-configuration#rail-radio-config-t)|[in]|radioConfig|A radio configuration (pointer) that is to be used as a white list for verifying memory contents.|
|[RAIL_VerifyCallbackPtr_t](diagnostic#rail-verify-callback-ptr-t)|[in]|cb|A callback that notifies the application of a mismatch in expected vs actual memory contents. A NULL parameter may be passed in if a callback is not needed by the application.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if setup of the verification feature successfully occurred. [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) is returned if the provided railHandle or configVerify structures are invalid.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3. This functionality is no longer supported. 

###### RAIL_Verify

`RAIL_Status_t RAIL_Verify(RAIL_VerifyConfig_t *configVerify, uint32_t durationUs, bool restart)`

**Description:** Verify radio memory contents.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_VerifyConfig_t](rail-verify-config-t) *|[inout]|configVerify|A pointer to the configuration structure previously established by [RAIL_ConfigVerification()](diagnostic#rail-config-verification).|
|uint32_t|[in]|durationUs|The duration (in microseconds) for how long memory verification should occur before returning to the application. A value of [RAIL_VERIFY_DURATION_MAX](diagnostic#rail-verify-duration-max) indicates that all memory contents should be verified before returning to the application.|
|bool|[in]|restart|This flag only has meaning if a previous call of this function returned [RAIL_STATUS_SUSPENDED](general#rail-status-suspended). By restarting (true), the verification process starts over from the beginning, or by resuming where verification left off after being suspended (false), verification can proceed towards completion.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the contents of all applicable memory locations have been verified. [RAIL_STATUS_SUSPENDED](general#rail-status-suspended) is returned if the provided test duration expired but the time was not sufficient to verify all memory contents. By calling [RAIL_Verify()](diagnostic#rail-verify) again, further verification will commence. [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) is returned if the provided verifyConfig structure pointer is not configured for use by the active RAIL handle. [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) is returned if any of the verified memory contents are different from their reference values.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3. This functionality is no longer supported. 

###### sl_rail_config_direct_mode

`sl_rail_status_t sl_rail_config_direct_mode(sl_rail_handle_t rail_handle, const sl_rail_direct_mode_config_t *p_direct_mode_config)`

**Description:** Configure direct mode for RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_direct_mode_config_t](sl-rail-direct-mode-config-t) *|[in]|p_direct_mode_config|A pointer to a configuration structure to specify direct mode parameters. Default configuration will be used if NULL is passed.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success and an error code on failure.

This API configures direct mode and should be called before calling [sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode). If this function is not called, the following default configuration will be used: <br />

```c
sl_rail_direct_mode_config_t default_config = {
  .sync_rx   = false,
  .sync_tx   = false,
  .dout_port = SL_GPIO_PORT_A,
  .dout_pin  = 5,
  .din_port  = SL_GPIO_PORT_A,
  .din_pin   = 7,
  .dclk_port = SL_GPIO_PORT_A,
  .dclk_pin  = 6,
};

```

**Warnings**

- This API is not safe to use in a multiprotocol app.

###### sl_rail_enable_direct_mode

`sl_rail_status_t sl_rail_enable_direct_mode(sl_rail_handle_t rail_handle, bool enable_direct_tx, bool enable_direct_rx)`

**Description:** Enable or disable direct mode for RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable_direct_tx|Enable direct mode for data being transmitted out of the radio.|
|bool|[in]|enable_direct_rx|Enable direct mode for data being received from the radio.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success or an error code on failure.

This API enables or disables the modem and GPIOs for direct mode operation. see [sl_rail_config_direct_mode()](diagnostic#sl-rail-config-direct-mode) for information on selecting the correct hardware configuration. If direct mode is enabled, packets are output and input directly to the radio via GPIO and RAIL packet handling is ignored.

**Note**

- This feature is only available on certain chips. [sl_rail_supports_direct_mode()](features#sl-rail-supports-direct-mode) can be used to check if a particular chip supports this feature or not.

**Warnings**

- This API is not safe to use in a multiprotocol app.
- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_get_radio_clock_freq_hz

`uint32_t sl_rail_get_radio_clock_freq_hz(sl_rail_handle_t rail_handle)`

**Description:** Get the radio subsystem clock frequency in Hz.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Radio subsystem clock frequency in Hz.

###### sl_rail_set_tune

`sl_rail_status_t sl_rail_set_tune(sl_rail_handle_t rail_handle, uint32_t tune)`

**Description:** Set the crystal tuning.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|uint32_t|[in]|tune|A chip-dependent crystal capacitor bank tuning parameter.|

**Returns**

- Status code indicating success of the function call.

Tunes the crystal that the radio depends on to change the location of the center frequency for transmitting and receiving. This function will only succeed if the radio is idle at the time of the call.

**Note**

- This function proportionally affects the entire chip's timing across all its peripherals, including radio tuning and channel spacing. It is recommended to call this function only when HFXO is not being used, as it can cause disturbance on the HFXO frequency. A separate function, [sl_rail_set_freq_offset()](diagnostic#sl-rail-set-freq-offset), can be used to adjust just the radio tuner without disturbing channel spacing or other chip peripheral timing.
- This API sets CTUNEXIANA and internally CTUNEXOANA = CTUNEXIANA + delta where delta is set or changed by [sl_rail_set_tune_delta()](diagnostic#sl-rail-set-tune-delta). The default delta may not be 0 on some devices.

###### sl_rail_get_tune

`uint32_t sl_rail_get_tune(sl_rail_handle_t rail_handle)`

**Description:** Get the crystal tuning.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- A chip-dependent crystal capacitor bank tuning parameter.

Retrieves the current tuning value used by the crystal that the radio depends on. **Note**

- This is the CTUNEXIANA value.

###### sl_rail_set_tune_delta

`sl_rail_status_t sl_rail_set_tune_delta(sl_rail_handle_t rail_handle, int32_t delta)`

**Description:** Set the crystal tuning delta.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|int32_t|[in]|delta|A chip-dependent crystal capacitor bank tuning delta.|

**Returns**

- Status code indicating success of the function call.

Set the CTUNEXOANA delta for [sl_rail_set_tune()](diagnostic#sl-rail-set-tune) to use: CTUNEXOANA = CTUNEXIANA + delta (subject to field-size limitations). This function does not change CTUNE values; call [sl_rail_set_tune()](diagnostic#sl-rail-set-tune) to put a new delta into effect. 

###### sl_rail_get_tune_delta

`int32_t sl_rail_get_tune_delta(sl_rail_handle_t rail_handle)`

**Description:** Get the crystal tuning delta.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- A chip-dependent crystal capacitor bank tuning delta.

Retrieves the current tuning delta used by [sl_rail_set_tune()](diagnostic#sl-rail-set-tune). **Note**

- The default delta if [sl_rail_set_tune_delta()](diagnostic#sl-rail-set-tune-delta) has never been called is device-dependent and may not be 0.

###### sl_rail_get_rx_freq_offset

`sl_rail_frequency_offset_t sl_rail_get_rx_freq_offset(sl_rail_handle_t rail_handle)`

**Description:** Get the frequency offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The measured frequency offset on a received packet. The units are described in the [sl_rail_frequency_offset_t](diagnostic#sl-rail-frequency-offset-t) documentation. If this returns [SL_RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#sl-rail-frequency-offset-invalid), it was called while the radio wasn't active and there is no way to get the frequency offset.

Retrieves the measured frequency offset used during the previous received packet, which includes the current radio frequency offset (see [sl_rail_set_freq_offset()](diagnostic#sl-rail-set-freq-offset)). If the chip has not been in RX, it returns the nominal radio frequency offset.

**Note**

- Changing to any non-idle radio state after reception can cause this value to be overwritten so it is safest to capture during packet reception.

###### sl_rail_set_freq_offset

`sl_rail_status_t sl_rail_set_freq_offset(sl_rail_handle_t rail_handle, sl_rail_frequency_offset_t freq_offset)`

**Description:** Set the nominal radio frequency offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_frequency_offset_t](diagnostic#sl-rail-frequency-offset-t)|[in]|freq_offset|[sl_rail_frequency_offset_t](diagnostic#sl-rail-frequency-offset-t) parameter (signed, 2's complement).|

**Returns**

- Status code indicating success of the function call.

This function is used to adjust the radio's tuning frequency slightly up or down. It might be used in conjunction with [sl_rail_get_rx_freq_offset()](diagnostic#sl-rail-get-rx-freq-offset) after receiving a packet from a peer to adjust the tuner to better match the peer's tuned frequency.

**Note**

- Unlike [sl_rail_set_tune()](diagnostic#sl-rail-set-tune), which affects the entire chip's timing including radio tuning and channel spacing, this function only affects radio tuning without disturbing channel spacing or other chip peripheral timing.

###### sl_rail_start_tx_stream

`sl_rail_status_t sl_rail_start_tx_stream(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_stream_mode_t mode, sl_rail_tx_options_t tx_options)`

**Description:** Start transmitting a stream on a certain channel with the ability to select an antenna.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|A channel on which to emit a stream.|
|[sl_rail_stream_mode_t](diagnostic#sl-rail-stream-mode-t)|[in]|mode|Choose the stream mode (PN9, and so on).|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|Choose the TX Antenna option. Takes only [SL_RAIL_TX_OPTION_ANTENNA_0](transmit#sl-rail-tx-option-antenna-0), [SL_RAIL_TX_OPTION_ANTENNA_1](transmit#sl-rail-tx-option-antenna-1), [SL_RAIL_TX_OPTIONS_DEFAULT](transmit#sl-rail-tx-options-default) or [SL_RAIL_TX_OPTIONS_NONE](transmit#sl-rail-tx-options-none) from the [sl_rail_tx_options_t](transmit#sl-rail-tx-options-t). If some other value is used then, transmission is possible on any antenna.|

**Returns**

- Status code indicating success of the function call.

Begins streaming onto the given channel. The sources can either be an unmodulated carrier wave or an encoded stream of bits from a PN9 source. All ongoing radio operations will be stopped before transmission begins. 

###### sl_rail_stop_tx_stream

`sl_rail_status_t sl_rail_stop_tx_stream(sl_rail_handle_t rail_handle)`

**Description:** Stop stream transmission and idle the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Halts the transmission started by [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream). 

###### sl_rail_stop_infinite_preamble_tx

`sl_rail_status_t sl_rail_stop_infinite_preamble_tx(sl_rail_handle_t rail_handle)`

**Description:** Stop infinite preamble transmission started and start transmitting the rest of the packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call: [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if infinite preamble was stopped; [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if the radio isn't configured for infinite preamble; [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if the radio isn't transmitting.

This function is only useful for radio configurations that specify an infinite preamble. Call this API only after [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started) has occurred and the radio is transmitting. 

##### Macros

`#define RAIL_FREQUENCY_OFFSET_MAX ((RAIL_FrequencyOffset_t) 0x3FFF)`

**Description**: The maximum frequency offset value supported.

`#define RAIL_FREQUENCY_OFFSET_MIN ((RAIL_FrequencyOffset_t) -RAIL_FREQUENCY_OFFSET_MAX)`

**Description**: The minimum frequency offset value supported.

`#define RAIL_FREQUENCY_OFFSET_INVALID ((RAIL_FrequencyOffset_t) 0x8000)`

**Description**: Specify an invalid frequency offset value.

`#define RAIL_VERIFY_DURATION_MAX 0xFFFFFFFFUL`

**Description**: This radio state verification duration indicates to RAIL that all memory contents should be verified by RAIL before returning to the application.

`#define SL_RAIL_FREQUENCY_OFFSET_MAX ((sl_rail_frequency_offset_t) 0x3FFF)`

**Description**: The maximum frequency offset value supported.

`#define SL_RAIL_FREQUENCY_OFFSET_MIN ((sl_rail_frequency_offset_t) -SL_RAIL_FREQUENCY_OFFSET_MAX)`

**Description**: The minimum frequency offset value supported.

`#define SL_RAIL_FREQUENCY_OFFSET_INVALID ((sl_rail_frequency_offset_t) 0x8000)`

**Description**: Specify an invalid frequency offset value.

Allows the user to specify direct mode parameters using [RAIL_ConfigDirectMode()](diagnostic#rail-config-direct-mode). 

**Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t](sl-rail-direct-mode-config-t). 

###### Public Attributes

###### syncRx (heading level 7)

```
bool RAIL_DirectModeConfig_t::syncRx
```

**Description:** Enable synchronous RX DOUT using DCLK vs.

**Details:** asynchronous RX DOUT.

**Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::sync_rx](sl-rail-direct-mode-config-t#sync-rx).

###### syncTx (heading level 7)

```
bool RAIL_DirectModeConfig_t::syncTx
```

**Description:** Enable synchronous TX DIN using DCLK vs.

**Details:** asynchronous TX DIN.

**Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::sync_tx](sl-rail-direct-mode-config-t#sync-tx).

###### doutPort (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::doutPort
```

**Description:** RX Data output (DOUT) GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dout_port](sl-rail-direct-mode-config-t#dout-port).

###### doutPin (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::doutPin
```

**Description:** RX Data output (DOUT) GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dout_pin](sl-rail-direct-mode-config-t#dout-pin).

###### dclkPort (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dclkPort
```

**Description:** Data clock (DCLK) GPIO port.

**Details:** Only used in synchronous mode.

**Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dclk_port](sl-rail-direct-mode-config-t#dclk-port).

###### dclkPin (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dclkPin
```

**Description:** Data clock (DCLK) GPIO pin.

**Details:** Only used in synchronous mode.

**Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::dclk_pin](sl-rail-direct-mode-config-t#dclk-pin).

###### dinPort (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dinPort
```

**Description:** TX Data input (DIN) GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::din_port](sl-rail-direct-mode-config-t#din-port).

###### dinPin (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dinPin
```

**Description:** TX Data input (DIN) GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_direct_mode_config_t::din_pin](sl-rail-direct-mode-config-t#din-pin).

###### doutLoc (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::doutLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_0](sl-rail-direct-mode-config-t#reserved-0).

###### dclkLoc (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dclkLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_1](sl-rail-direct-mode-config-t#reserved-1).

###### dinLoc (heading level 7)

```
uint8_t RAIL_DirectModeConfig_t::dinLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_direct_mode_config_t::reserved_2](sl-rail-direct-mode-config-t#reserved-2).

The configuration array provided to RAIL for use by the radio state verification feature. 

This structure will be populated with appropriate values by calling [RAIL_ConfigVerification()](diagnostic#rail-config-verification). The application should not set or alter any of these structure elements.

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3. 

###### Public Attributes

###### correspondingHandle (heading level 7)

```
RAIL_Handle_t RAIL_VerifyConfig_t::correspondingHandle
```

**Description:** Internal verification tracking information.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### nextIndexToVerify (heading level 7)

```
uint32_t RAIL_VerifyConfig_t::nextIndexToVerify
```

**Description:** Internal verification tracking information.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### override (heading level 7)

```
RAIL_RadioConfig_t RAIL_VerifyConfig_t::override
```

**Description:** Internal verification tracking information.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### cb (heading level 7)

```
RAIL_VerifyCallbackPtr_t RAIL_VerifyConfig_t::cb
```

**Description:** Internal verification tracking information.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

Allows the user to specify direct mode parameters using [sl_rail_config_direct_mode()](diagnostic#sl-rail-config-direct-mode). 

###### Public Attributes

###### sync_rx (heading level 7)

```
bool sl_rail_direct_mode_config_t::sync_rx
```

**Description:** Enable synchronous RX DOUT using DCLK vs.

**Details:** asynchronous RX DOUT.

###### sync_tx (heading level 7)

```
bool sl_rail_direct_mode_config_t::sync_tx
```

**Description:** Enable synchronous TX DIN using DCLK vs.

**Details:** asynchronous TX DIN.

###### dout_port (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::dout_port
```

**Description:** RX Data output (DOUT) GPIO port.

###### dout_pin (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::dout_pin
```

**Description:** RX Data output (DOUT) GPIO pin.

###### dclk_port (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::dclk_port
```

**Description:** Data clock (DCLK) GPIO port.

**Details:** Only used in synchronous mode.

###### dclk_pin (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::dclk_pin
```

**Description:** Data clock (DCLK) GPIO pin.

**Details:** Only used in synchronous mode.

###### din_port (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::din_port
```

**Description:** TX Data input (DIN) GPIO port.

###### din_pin (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::din_pin
```

**Description:** TX Data input (DIN) GPIO pin.

###### reserved_0 (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::reserved_0
```

**Description:** Reserved for future use.

###### reserved_1 (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::reserved_1
```

**Description:** Reserved for future use.

###### reserved_2 (heading level 7)

```
uint8_t sl_rail_direct_mode_config_t::reserved_2
```

**Description:** Reserved for future use.

#### External Thermistor

APIs to measure temperature using an external thermistor. 

This feature allows reading the temperature via an external thermistor on chips that support it. This will require connecting the necessary components and configuring the pins as required. 

##### Modules

[RAIL_HFXOThermistorConfig_t](rail-hfxo-thermistor-config-t)

[RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t)

[sl_rail_hfxo_thermistor_config_t](sl-rail-hfxo-thermistor-config-t)

[sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t)

##### Functions

###### RAIL_StartThermistorMeasurement

`RAIL_Status_t RAIL_StartThermistorMeasurement(RAIL_Handle_t railHandle)`

**Description:** Start a thermistor measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. Returns [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if the thermistor is started while the radio is transmitting.

To get the thermistor impedance, call the function [RAIL_GetThermistorImpedance()](external-thermistor#rail-get-thermistor-impedance). On platforms having [RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#rail-supports-external-thermistor-1), this function reconfigures GPIO_THMSW_EN_PIN located in GPIO_THMSW_EN_PORT. To locate this pin, refer to the data sheet or appropriate header files of the device. For proper operation, [RAIL_Init()](general#rail-init) must be called before using this function.

**Note**

- When an EFF is attached, this function must not be called during transmit.

**Warnings**

- This API is not safe to use in a multiprotocol app.
- As this function relies on EMU, GPIO and HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if EMU, GPIO or HFXO are configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement). 

###### RAIL_GetThermistorImpedance

`RAIL_Status_t RAIL_GetThermistorImpedance(RAIL_Handle_t railHandle, uint32_t *thermistorImpedance)`

**Description:** Get the thermistor impedance measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|uint32_t *|[out]|thermistorImpedance|A pointer to a uint32_t updated with the current thermistor impedance measurement in Ohms, or [RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#rail-invalid-thermistor-value) on error.|

Sets the output parameter to [RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#rail-invalid-thermistor-value) if the thermistor is not properly configured or the thermistor measurement is not ready.

**Returns**

- Status code indicating success of the function call.

**Note**

- This function is already called in [RAIL_CalibrateHFXO()](calibration#rail-calibrate-hfxo). It does not need to be manually called during the compensation sequence.
- When HFXO compensation is enabled and a measurement is in progress, this function returns [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) with the most recent cached thermistor value.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_thermistor_impedance()](external-thermistor#sl-rail-get-thermistor-impedance). 

###### RAIL_ConvertThermistorImpedance

`RAIL_Status_t RAIL_ConvertThermistorImpedance(RAIL_Handle_t railHandle, uint32_t thermistorImpedance, int16_t *thermistorTemperatureC)`

**Description:** Convert the thermistor impedance into temperature, in Celsius.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|uint32_t|[in]|thermistorImpedance|Current thermistor impedance measurement in Ohms.|
|int16_t *|[out]|thermistorTemperatureC|A non-NULL pointer to an int16_t updated with the current thermistor temperature in eighth of Celsius degrees.|

**Returns**

- Status code indicating success of the function call.

A version of this function is provided in the [Thermistor Utility](rail-util-thermistor) plugin for Silicon Labs radio boards. For custom boards this function can be modified and re-implemented as needed in the plugin.

**Note**

- The [Thermistor Utility](rail-util-thermistor) plugin is mandatory on EFR32xG25 platforms.

**Deprecated**RAIL 2.x synonym of [sl_railcb_convert_thermistor_impedance()](external-thermistor#sl-railcb-convert-thermistor-impedance). 

###### RAIL_ComputeHFXOPPMError

`RAIL_Status_t RAIL_ComputeHFXOPPMError(RAIL_Handle_t railHandle, int16_t crystalTemperatureC, int8_t *crystalPPMError)`

**Description:** Compute the crystal PPM deviation from the thermistor temperature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|int16_t|[in]|crystalTemperatureC|Current crystal temperature, in Celsius.|
|int8_t *|[out]|crystalPPMError|A non-NULL pointer to an int8_t updated with the current ppm error in ppm units.|

**Returns**

- Status code indicating success of the function call.

A version of this function is provided in the [Thermistor Utility](rail-util-thermistor) plugin for Silicon Labs radio boards. For custom boards this function can be modified and re-implemented as needed in the plugin.

**Note**

- The [Thermistor Utility](rail-util-thermistor) plugin is mandatory on EFR32xG25 platforms.

**Deprecated**RAIL 2.x synonym of [sl_railcb_compute_hfxo_error_ppm()](external-thermistor#sl-railcb-compute-hfxo-error-ppm). 

###### RAIL_ConfigHFXOThermistor

`RAIL_Status_t RAIL_ConfigHFXOThermistor(RAIL_Handle_t railHandle, const RAIL_HFXOThermistorConfig_t *pHfxoThermistorConfig)`

**Description:** Configure the GPIO for thermistor usage.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|const [RAIL_HFXOThermistorConfig_t](rail-hfxo-thermistor-config-t) *|[in]|pHfxoThermistorConfig|A non-NULL pointer to the thermistor configuration indicating the GPIO port and pin to use.|

**Returns**

- Status code indicating the result of the function call.

**Note**

- The port and pin that must be passed in [RAIL_HFXOThermistorConfig_t](rail-hfxo-thermistor-config-t) are GPIO_THMSW_EN_PORT and GPIO_THMSW_EN_PIN respectively.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_hfxo_thermistor()](external-thermistor#sl-rail-config-hfxo-thermistor). 

###### RAIL_ConfigHFXOCompensation

`RAIL_Status_t RAIL_ConfigHFXOCompensation(RAIL_Handle_t railHandle, const RAIL_HFXOCompensationConfig_t *pHfxoCompensationConfig)`

**Description:** Configure the temperature parameters for HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t) *|[in]|pHfxoCompensationConfig|A non-NULL pointer to HFXO compensation parameters indicating the temperature variations used to trigger a compensation.|

**Returns**

- Status code indicating the result of the function call.

**Note**

- This function must be called after [RAIL_ConfigHFXOThermistor()](external-thermistor#rail-config-hfxo-thermistor) to succeed.

In [RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t), deltaNominal and deltaCritical define the temperature variation triggering a new compensation. The field zoneTemperatureC defines the temperature separating the nominal case (below) from the critical one (above).

When enabled and either deltaNominal or deltaCritical are exceeded, RAIL raises event [RAIL_EVENT_CAL_NEEDED](events#rail-event-cal-needed) with [RAIL_CAL_TEMP_HFXO](calibration#rail-cal-temp-hfxo) bit set. The API [RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement) must be called afterwards. The latter will raise [RAIL_EVENT_THERMISTOR_DONE](events#rail-event-thermistor-done) with calibration bit [RAIL_CAL_COMPENSATE_HFXO](calibration#rail-cal-compensate-hfxo) set and a call to [RAIL_CalibrateHFXO()](calibration#rail-calibrate-hfxo) must follow.

**Note**

- Set deltaNominal and deltaCritical to 0 to perform compensation after each transmit.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_hfxo_compensation()](external-thermistor#sl-rail-config-hfxo-compensation). 

###### RAIL_GetHFXOCompensationConfig

`RAIL_Status_t RAIL_GetHFXOCompensationConfig(RAIL_Handle_t railHandle, RAIL_HFXOCompensationConfig_t *pHfxoCompensationConfig)`

**Description:** Get the temperature parameters for HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_HFXOCompensationConfig_t](rail-hfxo-compensation-config-t) *|[out]|pHfxoCompensationConfig|A non-NULL pointer to HFXO compensation parameters filled in by the function.|

**Returns**

- Status code indicating the result of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_hfxo_compensation_config()](external-thermistor#sl-rail-get-hfxo-compensation-config). 

###### RAIL_CompensateHFXO

`RAIL_Status_t RAIL_CompensateHFXO(RAIL_Handle_t railHandle, int8_t crystalPPMError)`

**Description:** Compute a frequency offset and compensate HFXO accordingly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int8_t|[in]|crystalPPMError|The current ppm error. Positive values indicate the HFXO frequency is too high; negative values indicate it's too low.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function only works for platforms having [RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#rail-supports-external-thermistor-1) alongside [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_compensate_hfxo()](external-thermistor#sl-rail-compensate-hfxo). 

###### sl_rail_start_thermistor_measurement

`sl_rail_status_t sl_rail_start_thermistor_measurement(sl_rail_handle_t rail_handle)`

**Description:** Start a thermistor measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. Returns [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if the thermistor is started while the radio is transmitting.

To get the thermistor impedance, call the function [sl_rail_get_thermistor_impedance()](external-thermistor#sl-rail-get-thermistor-impedance). On platforms having [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1), this function reconfigures GPIO_THMSW_EN_PIN located in GPIO_THMSW_EN_PORT. To locate this pin, refer to the data sheet or appropriate header files of the device. For proper operation, [sl_rail_init()](general#sl-rail-init) must be called before using this function.

**Note**

- When an EFF is attached, this function must not be called during transmit.

**Warnings**

- This API is not safe to use in a multiprotocol app.
- As this function relies on EMU, GPIO and HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if EMU, GPIO or HFXO are configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_get_thermistor_impedance

`sl_rail_status_t sl_rail_get_thermistor_impedance(sl_rail_handle_t rail_handle, uint32_t *p_thermistor_impedance_ohms)`

**Description:** Get the thermistor impedance measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|uint32_t *|[out]|p_thermistor_impedance_ohms|A pointer to a uint32_t updated with the current thermistor impedance measurement in Ohms, or [SL_RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#sl-rail-invalid-thermistor-value) on error.|

Sets the output parameter to [SL_RAIL_INVALID_THERMISTOR_VALUE](external-thermistor#sl-rail-invalid-thermistor-value) if the thermistor is not properly configured or the thermistor measurement is not ready.

**Returns**

- Status code indicating success of the function call.

**Note**

- This function is already called in [sl_rail_calibrate_hfxo()](calibration#sl-rail-calibrate-hfxo). It does not need to be manually called during the compensation sequence.
- When HFXO compensation is enabled and a measurement is in progress, this function returns [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) with the most recent cached thermistor value.

###### sl_railcb_convert_thermistor_impedance

`sl_rail_status_t sl_railcb_convert_thermistor_impedance(sl_rail_handle_t rail_handle, uint32_t thermistor_impedance_ohms, int16_t *p_thermistor_temperature_8c)`

**Description:** Callback to convert the thermistor impedance into temperature, in Celsius.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|uint32_t|[in]|thermistor_impedance_ohms|Current thermistor impedance measurement in Ohms.|
|int16_t *|[out]|p_thermistor_temperature_8c|A non-NULL pointer to an int16_t updated with the current thermistor temperature in eighth of Celsius degrees.|

**Returns**

- Status code indicating success of the function call.

A version of this function is provided in the [Thermistor Utility](rail-util-thermistor) plugin for Silicon Labs radio boards. For custom boards this function can be modified and re-implemented as needed in the plugin.

**Note**

- The [Thermistor Utility](rail-util-thermistor) plugin is mandatory on EFR32xG25 platforms.

###### sl_railcb_compute_hfxo_error_ppm

`sl_rail_status_t sl_railcb_compute_hfxo_error_ppm(sl_rail_handle_t rail_handle, int16_t crystal_temperature_c, int8_t *p_crystal_error_ppm)`

**Description:** Callback to compute the crystal PPM deviation from the thermistor temperature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|int16_t|[in]|crystal_temperature_c|Current crystal temperature, in Celsius.|
|int8_t *|[out]|p_crystal_error_ppm|A non-NULL pointer to an int8_t updated with the current ppm error in ppm units.|

**Returns**

- Status code indicating success of the function call.

A version of this function is provided in the [Thermistor Utility](rail-util-thermistor) plugin for Silicon Labs radio boards. For custom boards this function can be modified and re-implemented as needed in the plugin.

**Note**

- The [Thermistor Utility](rail-util-thermistor) plugin is mandatory on EFR32xG25 platforms.

###### sl_rail_config_hfxo_thermistor

`sl_rail_status_t sl_rail_config_hfxo_thermistor(sl_rail_handle_t rail_handle, const sl_rail_hfxo_thermistor_config_t *p_hfxo_thermistor_config)`

**Description:** Configure the GPIO for thermistor usage.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|const [sl_rail_hfxo_thermistor_config_t](sl-rail-hfxo-thermistor-config-t) *|[in]|p_hfxo_thermistor_config|A non-NULL pointer to the thermistor configuration indicating the GPIO port and pin to use.|

**Returns**

- Status code indicating the result of the function call.

**Note**

- The port and pin that must be passed in [sl_rail_hfxo_thermistor_config_t](sl-rail-hfxo-thermistor-config-t) are GPIO_THMSW_EN_PORT and GPIO_THMSW_EN_PIN respectively.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_config_hfxo_compensation

`sl_rail_status_t sl_rail_config_hfxo_compensation(sl_rail_handle_t rail_handle, const sl_rail_hfxo_compensation_config_t *p_hfxo_compensation_config)`

**Description:** Configure the temperature parameters for HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t) *|[in]|p_hfxo_compensation_config|A non-NULL pointer to HFXO compensation parameters indicating the temperature variations used to trigger a compensation.|

**Returns**

- Status code indicating the result of the function call.

**Note**

- This function must be called after [sl_rail_config_hfxo_thermistor()](external-thermistor#sl-rail-config-hfxo-thermistor) to succeed.

In [sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t), delta_nominal_celsius and delta_critical_celsius define the temperature variation triggering a new compensation. The field zone_temperature_celsius defines the temperature separating the nominal case (below) from the critical one (above).

When enabled and either delta_nominal_celsius or delta_critical_celsius are exceeded, RAIL raises event [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) with [SL_RAIL_CAL_TEMP_HFXO](calibration#sl-rail-cal-temp-hfxo) bit set. The API [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement) must be called afterwards. The latter will raise [SL_RAIL_EVENT_THERMISTOR_DONE](events#sl-rail-event-thermistor-done) with calibration bit [SL_RAIL_CAL_COMPENSATE_HFXO](calibration#sl-rail-cal-compensate-hfxo) set and a call to [sl_rail_calibrate_hfxo()](calibration#sl-rail-calibrate-hfxo) must follow.

**Note**

- Set delta_nominal_celsius and delta_critical_celsius to 0 to perform compensation after each transmit.

###### sl_rail_get_hfxo_compensation_config

`sl_rail_status_t sl_rail_get_hfxo_compensation_config(sl_rail_handle_t rail_handle, sl_rail_hfxo_compensation_config_t *p_hfxo_compensation_config)`

**Description:** Get the temperature parameters for HFXO compensation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t) *|[out]|p_hfxo_compensation_config|A non-NULL pointer to HFXO compensation parameters filled in by the function.|

**Returns**

- Status code indicating the result of the function call.

###### sl_rail_compensate_hfxo

`sl_rail_status_t sl_rail_compensate_hfxo(sl_rail_handle_t rail_handle, int8_t crystal_error_ppm)`

**Description:** Compute a frequency offset and compensate HFXO accordingly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|int8_t|[in]|crystal_error_ppm|The current ppm error. Positive values indicate the HFXO frequency is too high; negative values indicate it's too low.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function only works for platforms having [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1) alongside [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1).

##### Macros

`#define RAIL_INVALID_THERMISTOR_VALUE (0xFFFFFFFFU)`

**Description**: A sentinel value to indicate an invalid thermistor measurement value.

`#define RAIL_INVALID_PPM_VALUE (-128)`

**Description**: A sentinel value to indicate an invalid PPM calculation value.

`#define SL_RAIL_INVALID_THERMISTOR_VALUE (0xFFFFFFFFU)`

**Description**: A sentinel value to indicate an invalid thermistor measurement value.

`#define SL_RAIL_INVALID_PPM_VALUE (-128)`

**Description**: A sentinel value to indicate an invalid PPM calculation value.

Configure the port and pin of the thermistor. 

**Note**

- This configuration is chip OPN dependent.

**Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t](sl-rail-hfxo-thermistor-config-t). 

###### Public Attributes

###### port (heading level 7)

```
uint8_t RAIL_HFXOThermistorConfig_t::port
```

**Description:** The GPIO port to access the thermistor.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t::port](sl-rail-hfxo-thermistor-config-t#port).

###### pin (heading level 7)

```
uint8_t RAIL_HFXOThermistorConfig_t::pin
```

**Description:** The GPIO pin to set the thermistor.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_thermistor_config_t::pin](sl-rail-hfxo-thermistor-config-t#pin).

Set compensation specific parameters. 

**Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t](sl-rail-hfxo-compensation-config-t). 

###### Public Attributes

###### enableCompensation (heading level 7)

```
bool RAIL_HFXOCompensationConfig_t::enableCompensation
```

**Description:** Indicates whether the HFXO compensation in temperature is activated.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::enable_compensation](sl-rail-hfxo-compensation-config-t#enable-compensation).

###### zoneTemperatureC (heading level 7)

```
int8_t RAIL_HFXOCompensationConfig_t::zoneTemperatureC
```

**Description:** The temperature reference delimiting the nominal zone from the critical one.

**Details:** This field is relevant if enableCompensation is set to true.

**Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::zone_temperature_celsius](sl-rail-hfxo-compensation-config-t#zone-temperature-celsius).

###### deltaNominal (heading level 7)

```
uint8_t RAIL_HFXOCompensationConfig_t::deltaNominal
```

**Description:** The temperature shift used to start a new compensation, in the nominal zone.

**Details:** This field is relevant if enableCompensation is set to true.

**Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::delta_nominal_celsius](sl-rail-hfxo-compensation-config-t#delta-nominal-celsius).

###### deltaCritical (heading level 7)

```
uint8_t RAIL_HFXOCompensationConfig_t::deltaCritical
```

**Description:** The temperature shift used to start a new compensation, in the critical zone.

**Details:** This field is relevant if enableCompensation is set to true.

**Deprecated**RAIL 2.x synonym of [sl_rail_hfxo_compensation_config_t::delta_critical_celsius](sl-rail-hfxo-compensation-config-t#delta-critical-celsius).

Configure the port and pin of the thermistor. 

**Note**

- This configuration is chip OPN dependent.

###### Public Attributes

###### port (heading level 7)

```
uint8_t sl_rail_hfxo_thermistor_config_t::port
```

**Description:** The GPIO port to access the thermistor.

###### pin (heading level 7)

```
uint8_t sl_rail_hfxo_thermistor_config_t::pin
```

**Description:** The GPIO pin to set the thermistor.

Set compensation specific parameters. 

###### Public Attributes

###### enable_compensation (heading level 7)

```
bool sl_rail_hfxo_compensation_config_t::enable_compensation
```

**Description:** Indicates whether the HFXO compensation in temperature is activated.

###### zone_temperature_celsius (heading level 7)

```
int8_t sl_rail_hfxo_compensation_config_t::zone_temperature_celsius
```

**Description:** The temperature reference delimiting the nominal zone from the critical one.

**Details:** This field is relevant if enable_compensation is set to true.

###### delta_nominal_celsius (heading level 7)

```
uint8_t sl_rail_hfxo_compensation_config_t::delta_nominal_celsius
```

**Description:** The temperature shift used to start a new compensation, in the nominal zone.

**Details:** This field is relevant if enable_compensation is set to true.

###### delta_critical_celsius (heading level 7)

```
uint8_t sl_rail_hfxo_compensation_config_t::delta_critical_celsius
```

**Description:** The temperature shift used to start a new compensation, in the critical zone.

**Details:** This field is relevant if enable_compensation is set to true.

#### Front End Module Voltage Detection

APIs for configuring and detecting a voltage from a Front End Module (VDET). 

The rail_util_vdet plugin lets customers measure an output voltage from their attached Front End Module at a specific time in a Tx packet. This information allows optimizations to power configuration, and monitoring FEM performance.

**Note**

- VDET is only supported with EFR32xG25 devices.

The sl_rail_util_vdet plugin lets customers measure an output voltage from their attached Front End Module at a specific time in a Tx packet. This information allows optimizations to power configuration, and monitoring FEM performance.

**Note**

- VDET is only supported with EFR32xG25 devices.

##### Modules

[RAIL_VdetConfig_t](rail-vdet-config-t)

[sl_rail_vdet_config_t](sl-rail-vdet-config-t)

##### Enumerations

###### RAIL_Vdet_Mode_t

```
enum RAIL_Vdet_Mode_t {
    RAIL_VDET_MODE_DISABLED = 0u
    RAIL_VDET_MODE_AUTOMATIC = 1u
    RAIL_VDET_MODE_IMMEDIATE = 2u
    RAIL_VDET_MODE_COUNT
}
```

**Description:**

VDET Modes.

**Details:**

The VDET Mode is passed to [RAIL_ConfigVdet()](vdet#rail-config-vdet) via [RAIL_VdetConfig_t](rail-vdet-config-t). The [Front End Module Voltage Detection (VDET) Utility](rail-util-vdet) component allows customers to measure their Front End Module performance at specified points in the Transmit packet.

**Deprecated**RAIL 2.x synonym of [sl_rail_vdet_mode_t](vdet#sl-rail-vdet-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_VDET_MODE_DISABLED|VDET is completely disabled.|
|RAIL_VDET_MODE_AUTOMATIC|AUTOMATIC causes VDET measurements to be taken every Tx packet at the specified time.|
|RAIL_VDET_MODE_IMMEDIATE|IMMEDIATE causes an immediate VDET measurement.|
|RAIL_VDET_MODE_COUNT|A count of the choices in this enumeration.|

###### RAIL_Vdet_Resolution_t

```
enum RAIL_Vdet_Resolution_t {
    RAIL_VDET_RESOLUTION_10_BIT = 0u
    RAIL_VDET_RESOLUTION_11_BIT = 1u
    RAIL_VDET_RESOLUTION_12_BIT = 2u
    RAIL_VDET_RESOLUTION_COUNT
}
```

**Description:**

VDET Resolution for the Aux ADC.

**Details:**

The VDET Resolution is passed to [RAIL_ConfigVdet()](vdet#rail-config-vdet) via [RAIL_VdetConfig_t](rail-vdet-config-t). Shows available resolution options.

**Deprecated**RAIL 2.x synonym of [sl_rail_vdet_resolution_t](vdet#sl-rail-vdet-resolution-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_VDET_RESOLUTION_10_BIT|~10 bit resolution.|
|RAIL_VDET_RESOLUTION_11_BIT|~11 bit resolution.|
|RAIL_VDET_RESOLUTION_12_BIT|~12 bit resolution.|
|RAIL_VDET_RESOLUTION_COUNT|A count of the choices in this enumeration.|

###### RAIL_Vdet_Status_t

```
enum RAIL_Vdet_Status_t {
    RAIL_VDET_STATUS_IDLE = 0u
    RAIL_VDET_STATUS_START = 1u
    RAIL_VDET_STATUS_10_BIT_DONE = 2u
    RAIL_VDET_STATUS_11_BIT_DONE = 3u
    RAIL_VDET_STATUS_12_BIT_DONE = 4u
    RAIL_VDET_STATUS_BLOCKED = 5u
    RAIL_VDET_STATUS_ERROR = 6u
    RAIL_VDET_STATUS_COUNT
}
```

**Description:**

VDET Status.

**Details:**

The VDET Status for internal debug. Shows states.

**Deprecated**RAIL 2.x synonym of [sl_rail_vdet_status_t](vdet#sl-rail-vdet-status-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_VDET_STATUS_IDLE|IDLE - Waiting for next command/measurement.|
|RAIL_VDET_STATUS_START|START of the VDET measurement activity.|
|RAIL_VDET_STATUS_10_BIT_DONE|Completion of a 10 bit measurement.|
|RAIL_VDET_STATUS_11_BIT_DONE|Completion of a 11 bit measurement.|
|RAIL_VDET_STATUS_12_BIT_DONE|Completion of a 12 bit measurement.|
|RAIL_VDET_STATUS_BLOCKED|Conflict with another AuxADC user.|
|RAIL_VDET_STATUS_ERROR|An error has occurred.|
|RAIL_VDET_STATUS_COUNT|A count of the choices in this enumeration.|

###### sl_rail_vdet_mode_t

```
enum sl_rail_vdet_mode_t {
    SL_RAIL_VDET_MODE_DISABLED = 0u
    SL_RAIL_VDET_MODE_AUTOMATIC = 1u
    SL_RAIL_VDET_MODE_IMMEDIATE = 2u
    SL_RAIL_VDET_MODE_COUNT
}
```

**Description:**

VDET Modes.

**Details:**

The VDET Mode is passed to [sl_rail_config_vdet()](vdet#sl-rail-config-vdet) via [sl_rail_vdet_config_t](sl-rail-vdet-config-t). The [Front End Module Voltage Detection (VDET) Utility](rail-util-vdet) component allows customers to measure their Front End Module performance at specified points in the Transmit packet.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_VDET_MODE_DISABLED|VDET is completely disabled.|
|SL_RAIL_VDET_MODE_AUTOMATIC|AUTOMATIC causes VDET measurements to be taken every Tx packet at the specified time.|
|SL_RAIL_VDET_MODE_IMMEDIATE|IMMEDIATE causes an immediate VDET measurement.|
|SL_RAIL_VDET_MODE_COUNT|A count of the choices in this enumeration.|

###### sl_rail_vdet_resolution_t

```
enum sl_rail_vdet_resolution_t {
    SL_RAIL_VDET_RESOLUTION_10_BIT = 0u
    SL_RAIL_VDET_RESOLUTION_11_BIT = 1u
    SL_RAIL_VDET_RESOLUTION_12_BIT = 2u
    SL_RAIL_VDET_RESOLUTION_COUNT
}
```

**Description:**

VDET Resolution for the Aux ADC.

**Details:**

The VDET Resolution is passed to [sl_rail_config_vdet()](vdet#sl-rail-config-vdet) via [sl_rail_vdet_config_t](sl-rail-vdet-config-t). Shows available resolution options.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_VDET_RESOLUTION_10_BIT|~10 bit resolution.|
|SL_RAIL_VDET_RESOLUTION_11_BIT|~11 bit resolution.|
|SL_RAIL_VDET_RESOLUTION_12_BIT|~12 bit resolution.|
|SL_RAIL_VDET_RESOLUTION_COUNT|A count of the choices in this enumeration.|

###### sl_rail_vdet_status_t

```
enum sl_rail_vdet_status_t {
    SL_RAIL_VDET_STATUS_IDLE = 0u
    SL_RAIL_VDET_STATUS_START = 1u
    SL_RAIL_VDET_STATUS_10_BIT_DONE = 2u
    SL_RAIL_VDET_STATUS_11_BIT_DONE = 3u
    SL_RAIL_VDET_STATUS_12_BIT_DONE = 4u
    SL_RAIL_VDET_STATUS_BLOCKED = 5u
    SL_RAIL_VDET_STATUS_ERROR = 6u
    SL_RAIL_VDET_STATUS_COUNT
}
```

**Description:**

VDET Status.

**Details:**

The VDET Status for internal debug. Shows states.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_VDET_STATUS_IDLE|IDLE - Waiting for next command/measurement.|
|SL_RAIL_VDET_STATUS_START|START of the VDET measurement activity.|
|SL_RAIL_VDET_STATUS_10_BIT_DONE|Completion of a 10 bit measurement.|
|SL_RAIL_VDET_STATUS_11_BIT_DONE|Completion of a 11 bit measurement.|
|SL_RAIL_VDET_STATUS_12_BIT_DONE|Completion of a 12 bit measurement.|
|SL_RAIL_VDET_STATUS_BLOCKED|Conflict with another AuxADC user.|
|SL_RAIL_VDET_STATUS_ERROR|An error has occurred.|
|SL_RAIL_VDET_STATUS_COUNT|A count of the choices in this enumeration.|

##### Functions

###### RAIL_ConfigVdet

`RAIL_Status_t RAIL_ConfigVdet(RAIL_Handle_t genericRailHandle, const RAIL_VdetConfig_t *config)`

**Description:** Configure the VDET plugin.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A radio-generic RAIL handle.|
|const [RAIL_VdetConfig_t](rail-vdet-config-t) *|[in]|config|A pointer to a [RAIL_VdetConfig_t](rail-vdet-config-t) struct that contains configuration data for the VDET.|

**Returns**

- [RAIL_Status_t](general#rail-status-t)

**Return values**

- RAIL_STATUS_NO_ERROR: - All went well
- RAIL_STATUS_INVALID_STATE: - VDET is enabled. Must be disabled first.
- RAIL_STATUS_INVALID_PARAMETER: - mode/resolution/delayUs out-of-bounds.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_vdet()](vdet#sl-rail-config-vdet). 

###### RAIL_GetVdetConfig

`RAIL_Status_t RAIL_GetVdetConfig(RAIL_Handle_t genericRailHandle, RAIL_VdetConfig_t *config)`

**Description:** Get the VDET plugin configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A radio-generic RAIL handle.|
|[RAIL_VdetConfig_t](rail-vdet-config-t) *|[out]|config|A pointer to a [RAIL_VdetConfig_t](rail-vdet-config-t) struct that will return configuration data for the VDET.|

**Returns**

- [RAIL_Status_t](general#rail-status-t)

**Return values**

- RAIL_STATUS_NO_ERROR: - All went well.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_vdet_config()](vdet#sl-rail-get-vdet-config). 

###### RAIL_EnableVdet

`RAIL_Status_t RAIL_EnableVdet(RAIL_Handle_t genericRailHandle, bool enable)`

**Description:** Enable the VDET plugin.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A RAIL instance handle.|
|bool|[in]|enable|Enable or disable [RAIL_VDET_MODE_AUTOMATIC](vdet#rail-vdet-mode-automatic) mode captures. Begins measurement if in [RAIL_VDET_MODE_IMMEDIATE](vdet#rail-vdet-mode-immediate).|

**Returns**

- [RAIL_Status_t](general#rail-status-t)

**Return values**

- RAIL_STATUS_NO_ERROR: - All went well, VDET is enabled or disabled.
- RAIL_STATUS_INVALID_STATE: - VDET has not been configured or VDET was not idle. VDET is disabled.

**Warnings**

- As this function relies on HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if HFXO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_vdet()](vdet#sl-rail-enable-vdet). 

###### RAIL_IsVdetEnabled

`bool RAIL_IsVdetEnabled(RAIL_Handle_t genericRailHandle)`

**Description:** Check if the VDET plugin is enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A RAIL instance handle.|

**Returns**

- bool

**Deprecated**RAIL 2.x synonym of [sl_rail_is_vdet_enabled()](vdet#sl-rail-is-vdet-enabled). 

###### RAIL_GetVdet

`RAIL_Status_t RAIL_GetVdet(RAIL_Handle_t genericRailHandle, uint32_t *pVdetMv)`

**Description:** Get VDET measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A RAIL instance handle.|
|uint32_t *|[out]|pVdetMv|A pointer to a uint32_t for returning the measurement.|

A processed measurement in millivolts.

**Returns**

- [RAIL_Status_t](general#rail-status-t)

**Return values**

- RAIL_STATUS_NO_ERROR: - All went well, value in *pVdetMv is valid.
- RAIL_STATUS_INVALID_CALL: - VDET is in progress, wait until VDET capture is complete and try again.
- RAIL_STATUS_INVALID_STATE: - VDET is not enabled or valid. Wait until next packet and try reading again.<br />[RAIL_VDET_MODE_AUTOMATIC](vdet#rail-vdet-mode-automatic) - Wait until next packet and try reading again.<br />[RAIL_VDET_MODE_IMMEDIATE](vdet#rail-vdet-mode-immediate) - Resend [.\n](vdet#rail-enable-vdet)
- RAIL_STATUS_INVALID_PARAMETER: - In [RAIL_VDET_MODE_IMMEDIATE](vdet#rail-vdet-mode-immediate), resend [.\n](vdet#rail-enable-vdet)
- RAIL_STATUS_SUSPENDED: - Blocked by AuxADC contention. Wait until next packet and try reading again.

**Warnings**

- As this function relies on HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if HFXO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_vdet()](vdet#sl-rail-get-vdet). 

###### sl_rail_config_vdet

`sl_rail_status_t sl_rail_config_vdet(sl_rail_handle_t radio_handle, const sl_rail_vdet_config_t *p_config)`

**Description:** Configure the VDET plugin.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|const [sl_rail_vdet_config_t](sl-rail-vdet-config-t) *|[in]|p_config|A pointer to a [sl_rail_vdet_config_t](sl-rail-vdet-config-t) struct that contains configuration data for the VDET.|

**Returns**

- [sl_rail_status_t](general#sl-rail-status-t)

**Return values**

- SL_RAIL_STATUS_NO_ERROR: - All went well
- SL_RAIL_STATUS_INVALID_STATE: - VDET is enabled. Must be disabled first.
- SL_RAIL_STATUS_INVALID_PARAMETER: - mode/resolution/delay_us out-of-bounds.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_get_vdet_config

`sl_rail_status_t sl_rail_get_vdet_config(sl_rail_handle_t radio_handle, sl_rail_vdet_config_t *p_config)`

**Description:** Get the VDET plugin configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|[sl_rail_vdet_config_t](sl-rail-vdet-config-t) *|[out]|p_config|A pointer to a [sl_rail_vdet_config_t](sl-rail-vdet-config-t) struct that will return configuration data for the VDET.|

**Returns**

- [sl_rail_status_t](general#sl-rail-status-t)

**Return values**

- SL_RAIL_STATUS_NO_ERROR: - All went well.

###### sl_rail_enable_vdet

`sl_rail_status_t sl_rail_enable_vdet(sl_rail_handle_t radio_handle, bool enable)`

**Description:** Enable the VDET plugin.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|bool|[in]|enable|Enable or disable [SL_RAIL_VDET_MODE_AUTOMATIC](vdet#sl-rail-vdet-mode-automatic) mode captures. Begins measurement if in [SL_RAIL_VDET_MODE_IMMEDIATE](vdet#sl-rail-vdet-mode-immediate).|

**Returns**

- [sl_rail_status_t](general#sl-rail-status-t)

**Return values**

- SL_RAIL_STATUS_NO_ERROR: - All went well, VDET is enabled or disabled.
- SL_RAIL_STATUS_INVALID_STATE: - VDET has not been configured or VDET was not idle. VDET is disabled.

**Warnings**

- As this function relies on HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if HFXO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_is_vdet_enabled

`bool sl_rail_is_vdet_enabled(sl_rail_handle_t radio_handle)`

**Description:** Check if the VDET plugin is enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|

**Returns**

- bool

###### sl_rail_get_vdet

`sl_rail_status_t sl_rail_get_vdet(sl_rail_handle_t radio_handle, uint32_t *p_vdet_mv)`

**Description:** Get VDET measurement.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|uint32_t *|[out]|p_vdet_mv|A pointer to a uint32_t for returning the measurement.|

A processed measurement in millivolts.

**Returns**

- [sl_rail_status_t](general#sl-rail-status-t)

**Return values**

- SL_RAIL_STATUS_NO_ERROR: - All went well, value in *p_vdet_mv is valid.
- SL_RAIL_STATUS_INVALID_CALL: - VDET is in progress, wait until VDET capture is complete and try again.
- SL_RAIL_STATUS_INVALID_STATE: - VDET is not enabled or valid. Wait until next packet and try reading again.<br />[SL_RAIL_VDET_MODE_AUTOMATIC](vdet#sl-rail-vdet-mode-automatic) - Wait until next packet and try reading again.<br />[SL_RAIL_VDET_MODE_IMMEDIATE](vdet#sl-rail-vdet-mode-immediate) - Resend [.\n](vdet#sl-rail-enable-vdet)
- SL_RAIL_STATUS_INVALID_PARAMETER: - in [SL_RAIL_VDET_MODE_IMMEDIATE](vdet#sl-rail-vdet-mode-immediate), resend [.\n](vdet#sl-rail-enable-vdet)
- SL_RAIL_STATUS_SUSPENDED: - Blocked by AuxADC contention. Wait until next packet and try reading again.

**Warnings**

- As this function relies on HFXO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if HFXO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

##### Macros

`#define RAIL_VDET_MODE_ENUM_NAMES `

**Description**: A macro that is string versions of the calibration enums.

`#define RAIL_VDET_RESOLUTION_ENUM_NAMES `

**Description**: A macro that is string versions of the resolution enums.

`#define RAIL_VDET_STATUS_ENUM_NAMES `

**Description**: A macro that is string versions of the status enums.

`#define SL_RAIL_VDET_MODE_ENUM_NAMES `

**Description**: A macro that is string versions of the calibration enums.

`#define SL_RAIL_VDET_RESOLUTION_ENUM_NAMES `

**Description**: A macro that is string versions of the resolution enums.

`#define SL_RAIL_VDET_STATUS_ENUM_NAMES `

**Description**: A macro that is string versions of the status enums.

Configuration information for FEM Voltage Detection plugin. 

A structure of type [RAIL_VdetConfig_t](rail-vdet-config-t) is passed to [RAIL_ConfigVdet()](vdet#rail-config-vdet).

**Deprecated**RAIL 2.x synonym of [sl_rail_vdet_config_t](sl-rail-vdet-config-t). 

###### Public Attributes

###### mode (heading level 7)

```
RAIL_Vdet_Mode_t RAIL_VdetConfig_t::mode
```

**Description:** Mode for the VDET.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_vdet_config_t::mode](sl-rail-vdet-config-t#mode).

###### resolution (heading level 7)

```
RAIL_Vdet_Resolution_t RAIL_VdetConfig_t::resolution
```

**Description:** Resolution to use for the capture.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_vdet_config_t::resolution](sl-rail-vdet-config-t#resolution).

###### delayUs (heading level 7)

```
uint32_t RAIL_VdetConfig_t::delayUs
```

**Description:** Delay in microseconds for the capture from Tx Start in [RAIL_VDET_MODE_AUTOMATIC](vdet#rail-vdet-mode-automatic).

**Details:** Minimum 5 us, maximum 100000 us.

**Deprecated**RAIL 2.x synonym of [sl_rail_vdet_config_t::delay_us](sl-rail-vdet-config-t#delay-us).

Configuration information for FEM Voltage Detection plugin. 

A structure of type [sl_rail_vdet_config_t](sl-rail-vdet-config-t) is passed to [sl_rail_config_vdet()](vdet#sl-rail-config-vdet). 

###### Public Attributes

###### mode (heading level 7)

```
sl_rail_vdet_mode_t sl_rail_vdet_config_t::mode
```

**Description:** Mode for the VDET.

###### resolution (heading level 7)

```
sl_rail_vdet_resolution_t sl_rail_vdet_config_t::resolution
```

**Description:** Resolution to use for the capture.

###### delay_us (heading level 7)

```
uint32_t sl_rail_vdet_config_t::delay_us
```

**Description:** Delay in microseconds for the capture from Tx Start in [SL_RAIL_VDET_MODE_AUTOMATIC](vdet#sl-rail-vdet-mode-automatic).

**Details:** Minimum 5 us, maximum 100000 us.

#### General

Basic APIs to set up and interact with the RAIL library. 

##### Modules

[RAIL_Version_t](rail-version-t)

[RAILSched_Config_t](rail-sched-config-t)

[RAIL_Config_t](rail-config-t)

[sl_rail_version_t](sl-rail-version-t)

[sl_rail_config_t](sl-rail-config-t)

[EFR32xG2x](general-efr32-xg2-x)

[SIxx3xx](general-sixx3-xx)

##### Typedefs

###### RAIL_Handle_t

`RAIL_Handle_t`

**Description:**

A radio-generic handle (e.g., [RAIL_EFR32_HANDLE](general#rail-efr32-handle)), or a real RAIL instance handle as returned from [RAIL_Init()](general#rail-init).

**Details:**

Generic handles should be used for certain RAIL APIs that are called prior to RAIL initialization. However, once RAIL has been initialized, the real handle returned by [RAIL_Init()](general#rail-init) should be used instead.

**Deprecated**RAIL 2.x synonym of [sl_rail_handle_t](general#sl-rail-handle-t).

###### RAIL_Status_t

`RAIL_Status_t`

**Description:**

A status returned by many RAIL API calls indicating their success or failure.

**Details:**

It is a subset of sl_status_t.

**Deprecated**RAIL 2.x synonym of [sl_rail_status_t](general#sl-rail-status-t).

###### RAIL_InitCompleteCallbackPtr_t

`typedef void(* RAIL_InitCompleteCallbackPtr_t) (RAIL_Handle_t railHandle)`

**Description:**

A pointer to an initialization complete callback function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|railHandle|The initialized RAIL instance handle.|

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_init_complete_callback_t()](general#sl-rail-init-complete-callback-t).

###### RAIL_StateBuffer_t

`RAIL_StateBuffer_t`

**Description:**

Provided for backwards compatibility.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_opaque_value_t](general#sl-rail-opaque-value-t).

###### sl_rail_handle_t

`sl_rail_handle_t`

**Description:**

A radio-generic handle (e.g., [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle)), or a real RAIL instance handle as returned from [sl_rail_init()](general#sl-rail-init).

**Details:**

Generic-radio handles must be used for certain RAIL APIs that are called prior to RAIL initialization. However, once RAIL has been initialized, the real handle returned by [sl_rail_init()](general#sl-rail-init) should be used instead.

###### sl_rail_status_t

`sl_rail_status_t`

**Description:**

A status returned by many RAIL API calls indicating their success or failure.

**Details:**

It is a subset of sl_status_t.

###### sl_rail_init_complete_callback_t

`typedef void(* sl_rail_init_complete_callback_t) (sl_rail_handle_t rail_handle)`

**Description:**

A pointer to an initialization complete callback function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|rail_handle|The initialized RAIL instance handle.|

**Details:**

###### sl_rail_opaque_value_t

`sl_rail_opaque_value_t`

**Description:**

An opaque type not examined by RAIL; can be used for application- specific purposes.

###### sl_rail_events_callback_t

`typedef void(* sl_rail_events_callback_t) (sl_rail_handle_t rail_handle, sl_rail_events_t events)`

**Description:**

A pointer to the callback called when some RAIL event(s) occur.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|rail_handle|The RAIL handle active when the event occurred.|
||[in]|events|The RAIL event(s) that have occurred.|

**Details:**

##### Functions

###### RAIL_GetVersion

`RAIL_Status_t RAIL_GetVersion(RAIL_Version_t *version, bool verbose)`

**Description:** Get the version information for the compiled RAIL library.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Version_t](rail-version-t) *|[out]|version|A non-NULL pointer to [RAIL_Version_t](rail-version-t) structure to populate with version information.|
|bool|[in]|verbose|Populate [RAIL_Version_t](rail-version-t) struct with verbose information.|

**Returns**

- Status code indicating success of the function call.

The version information contains a major version number, a minor version number, and a rev (revision) number.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_version()](general#sl-rail-get-version) with fewer parameters and always returns verbose information. 

###### RAIL_AddStateBuffer3

`RAIL_Status_t RAIL_AddStateBuffer3(RAIL_Handle_t genericRailHandle)`

**Description:** Add a 3rd multiprotocol internal state buffer for use by [RAIL_Init()](general#rail-init).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A generic RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. An error is returned if the 3rd state buffer was previously added or this isn't the RAIL multiprotocol library.

**Deprecated**RAIL 2.x synonym of [sl_rail_add_state_buffer_3()](general#sl-rail-add-state-buffer-3). 

###### RAIL_AddStateBuffer4

`RAIL_Status_t RAIL_AddStateBuffer4(RAIL_Handle_t genericRailHandle)`

**Description:** Add a 4th multiprotocol internal state buffer for use by [RAIL_Init()](general#rail-init).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A generic RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. An error is returned if the 4th state buffer was previously added. or this isn't the RAIL multiprotocol library.

**Deprecated**RAIL 2.x synonym of [sl_rail_add_state_buffer_4()](general#sl-rail-add-state-buffer-4). 

###### RAIL_UseDma

`RAIL_Status_t RAIL_UseDma(uint8_t channel)`

**Description:** Allocate a DMA channel for RAIL to work with.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|channel|The DMA channel to use when copying memory. If a value of [RAIL_DMA_INVALID](general#rail-dma-invalid) is passed, RAIL will stop using any DMA channel.|

**Returns**

- Status code indicating success of the function call.

To use this API, the application must initialize the DMA engine on the chip and allocate a DMA channel. This channel will be used periodically to copy memory more efficiently. Call this function before [RAIL_Init()](general#rail-init) to have the most benefit. If the application needs to take back control of the DMA channel that RAIL is using, this API may be called with a channel of [RAIL_DMA_INVALID](general#rail-dma-invalid) to tell RAIL to stop using DMA.

**Warnings**

- To allocate and use a DMA channel for RAIL to work with when TrustZone is enabled and LDMA is configured as secure peripheral, the secure application must initialize the DMA engine and call this API. The non-secure application must provide a non-NULL [RAIL_TZ_Config_t::radioPerformM2mLdmaCallback](rail-tz-config-t#radio-perform-m2m-ldma-callback) to [RAIL_TZ_InitNonSecure()](trust-zone#rail-tz-init-non-secure). To take back control of the DMA channel when TrustZone is enabled and LDMA is configured as secure peripheral, the secure application must call this API with a channel of [RAIL_DMA_INVALID](general#rail-dma-invalid). The non-secure application must provide a NULL [RAIL_TZ_Config_t::radioPerformM2mLdmaCallback](rail-tz-config-t#radio-perform-m2m-ldma-callback) to [RAIL_TZ_InitNonSecure()](trust-zone#rail-tz-init-non-secure).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_use_dma()](general#sl-rail-use-dma) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_CopyDeviceInfo

`RAIL_Status_t RAIL_CopyDeviceInfo(RAIL_Handle_t genericRailHandle)`

**Description:** Reads out device specific data that may be needed by RAIL and populates appropriate data structures in the library.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A generic RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must be called before calling [RAIL_Init()](general#rail-init) on any platforms that require this data and should not be called inside a critical section. This function does nothing on EFR32 Series 2 devices.

**Deprecated**RAIL 2.x synonym of [sl_rail_copy_device_info()](general#sl-rail-copy-device-info). 

###### RAIL_Init

`RAIL_Handle_t RAIL_Init(const RAIL_Config_t *railCfg, RAIL_InitCompleteCallbackPtr_t cb)`

**Description:** Initialize RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [RAIL_Config_t](rail-config-t) *|[in]|railCfg|The configuration for setting up the protocol.|
|[RAIL_InitCompleteCallbackPtr_t](general#rail-init-complete-callback-ptr-t)|[in]|cb|A callback that notifies the application when the radio is finished initializing and is ready for further configuration. This callback is useful for potential transceiver products that require a power up sequence before further configuration is available. After the callback fires, the radio is ready for additional configuration before transmit and receive operations.|

**Returns**

- Handle for initialized rail instance or NULL if an invalid value was passed in the railCfg.

**Note**

- Call this function only once per protocol. If called again, it will do nothing and return NULL. [RAIL_CopyDeviceInfo()](general#rail-copy-device-info) should be called once before calling this function for Silicon Labs Series 3 devices.
- The first call to [RAIL_Init()](general#rail-init) implicitly enables PTI, but it won't take effect unless or until [RAIL_ConfigPti()](pti#rail-config-pti) has been called with a mode other than the default [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_init()](general#sl-rail-init) with different parameters, return value, and functionality allowing per-protocol configuration of Rx FIFO and Rx Packet Queue (formerly hidden in RAIL 2.x and shared across all protocols in multiprotocol applications), in addition to configuring the Tx FIFO. See [sl_rail_config_t](sl-rail-config-t). 

###### RAIL_IsInitialized

`bool RAIL_IsInitialized(void)`

**Description:** Get RAIL initialization status.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- true if the radio has finished initializing and false otherwise.

RAIL APIs, e.g., [RAIL_GetTime()](system-timing#rail-get-time), which work only if [RAIL_Init()](general#rail-init) has been called, can use [RAIL_IsInitialized()](general#rail-is-initialized) to determine whether RAIL has been initialized or not.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_initialized()](general#sl-rail-is-initialized) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_GetRadioEntropy

`uint16_t RAIL_GetRadioEntropy(RAIL_Handle_t railHandle, uint8_t *buffer, uint16_t bytes)`

**Description:** Collect entropy from the radio if available.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[out]|buffer|A non-NULL pointer to the buffer to write the collected entropy.|
|uint16_t|[in]|bytes|The number of bytes to fill in the input buffer.|

**Returns**

- The number of bytes of entropy collected. For radios that don't support entropy collection, the function returns 0. Values less than the requested amount may also be returned on platforms that use entropy pools to collect random data periodically.

Attempts to fill the provided buffer with the requested number of bytes of entropy. If the requested number of bytes can't be provided, as many bytes as possible will be filled and returned. For radios that do not support this function, 0 bytes are always returned. For information about the specific mechanism for gathering entropy, see documentation for the chip family.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_radio_entropy()](general#sl-rail-get-radio-entropy). 

###### sl_rail_get_version

`sl_rail_status_t sl_rail_get_version(sl_rail_version_t *p_version)`

**Description:** Get the version information for the compiled RAIL library.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_version_t](sl-rail-version-t) *|[out]|p_version|A non-NULL pointer to [sl_rail_version_t](sl-rail-version-t) structure to populate with version information.|

**Returns**

- Status code indicating success of the function call.

The p_version information contains a major version number, a minor version number, a rev (revision) number, and some supplemental build details. 

###### sl_rail_add_state_buffer_3

`sl_rail_status_t sl_rail_add_state_buffer_3(sl_rail_handle_t radio_handle)`

**Description:** Add a 3rd multiprotocol internal state buffer for use by [sl_rail_init()](general#sl-rail-init).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|

**Returns**

- Status code indicating success of the function call. An error is returned if the 3rd state buffer was previously added or this isn't the RAIL multiprotocol library.

###### sl_rail_add_state_buffer_4

`sl_rail_status_t sl_rail_add_state_buffer_4(sl_rail_handle_t radio_handle)`

**Description:** Add a 4th multiprotocol internal state buffer for use by [sl_rail_init()](general#sl-rail-init).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|

**Returns**

- Status code indicating success of the function call. An error is returned if the 4th state buffer was previously added. or this isn't the RAIL multiprotocol library.

###### sl_rail_use_dma

`sl_rail_status_t sl_rail_use_dma(sl_rail_handle_t rail_handle, uint8_t dma_channel)`

**Description:** Allocate a DMA channel for RAIL to work with.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|uint8_t|[in]|dma_channel|The DMA channel to use when copying memory. If a value of [SL_RAIL_DMA_INVALID](general#sl-rail-dma-invalid) is passed, RAIL will stop using any DMA channel.|

**Returns**

- Status code indicating success of the function call.

To use this API, the application must initialize the DMA engine on the chip and allocate a DMA channel. This channel will be used periodically to copy memory more efficiently. Call this function before [sl_rail_init()](general#sl-rail-init) to have the most benefit. If the application needs to take back control of the DMA channel that RAIL is using, this API may be called with a channel of [SL_RAIL_DMA_INVALID](general#sl-rail-dma-invalid) to tell RAIL to stop using DMA.

**Warnings**

- To allocate and use a DMA channel for RAIL to work with when TrustZone is enabled and LDMA is configured as secure peripheral, the secure application must initialize the DMA engine and call this API. The non-secure application must provide a non-NULL [sl_rail_tz_config_t::radio_perform_m2m_ldma_callback](sl-rail-tz-config-t#radio-perform-m2m-ldma-callback) to [sl_rail_tz_init_non_secure()](trust-zone#sl-rail-tz-init-non-secure). To take back control of the DMA channel when TrustZone is enabled and LDMA is configured as secure peripheral, the secure application must call this API with a channel of [SL_RAIL_DMA_INVALID](general#sl-rail-dma-invalid). The non-secure application must provide a NULL [sl_rail_tz_config_t::radio_perform_m2m_ldma_callback](sl-rail-tz-config-t#radio-perform-m2m-ldma-callback) to [sl_rail_tz_init_non_secure()](trust-zone#sl-rail-tz-init-non-secure).

###### sl_rail_copy_device_info

`sl_rail_status_t sl_rail_copy_device_info(sl_rail_handle_t radio_handle)`

**Description:** Reads out device specific data that may be needed by RAIL and populates appropriate data structures in the library.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must be called before calling [sl_rail_init()](general#sl-rail-init) on any platforms that require this data and should not be called inside a critical section. This function does nothing on EFR32 Series 2 devices.

###### sl_rail_init

`sl_rail_status_t sl_rail_init(sl_rail_handle_t *p_rail_handle, const sl_rail_config_t *p_rail_config, sl_rail_init_complete_callback_t init_complete_callback)`

**Description:** Initialize RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t) *|[inout]|p_rail_handle|A non-NULL pointer to a non-zero radio-generic RAIL handle (e.g., [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle)) that RAIL will overwrite with the real RAIL instance handle when returning a success status code.|
|const [sl_rail_config_t](sl-rail-config-t) *|[in]|p_rail_config|The configuration for setting up the protocol.|
|[sl_rail_init_complete_callback_t](general#sl-rail-init-complete-callback-t)|[in]|init_complete_callback|A callback that notifies the application when the radio is finished initializing and is ready for further configuration. This callback is useful for potential transceiver products that require a power up sequence before further configuration is available. After the callback fires, the radio is ready for additional configuration before transmit and receive operations.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Call this function only once per protocol. If called again, it will do nothing and return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state). [sl_rail_copy_device_info()](general#sl-rail-copy-device-info) should be called once before calling this function for Silicon Labs Series 3 devices.
- The first call to [sl_rail_init()](general#sl-rail-init) implicitly enables PTI, but it won't take effect unless or until [sl_rail_config_pti()](pti#sl-rail-config-pti) has been called with a mode other than the default [SL_RAIL_PTI_MODE_DISABLED](pti#sl-rail-pti-mode-disabled).

###### sl_rail_is_initialized

`bool sl_rail_is_initialized(sl_rail_handle_t rail_handle)`

**Description:** Get RAIL initialization status.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if the radio has finished initializing and false otherwise.

RAIL APIs, e.g., [sl_rail_get_time()](system-timing#sl-rail-get-time), which work only if [sl_rail_init()](general#sl-rail-init) has been called, can use [sl_rail_is_initialized()](general#sl-rail-is-initialized) to determine whether RAIL has been initialized or not. 

###### sl_rail_get_config

`const sl_rail_config_t * sl_rail_get_config(sl_rail_handle_t rail_handle)`

**Description:** Get the [sl_rail_config_t](sl-rail-config-t) pointer associated with a [sl_rail_handle_t](general#sl-rail-handle-t).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The pointer to the [sl_rail_config_t](sl-rail-config-t) associated with the RAIL instance handle, or NULL if the handle is not a valid instance provided by a [sl_rail_init()](general#sl-rail-init) call.

Applications can read but must not change any [sl_rail_config_t](sl-rail-config-t) fields using the returned pointer. 

###### sl_rail_get_radio_entropy

`uint16_t sl_rail_get_radio_entropy(sl_rail_handle_t rail_handle, uint8_t *p_buffer, uint16_t bytes)`

**Description:** Collect entropy from the radio if available.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t *|[out]|p_buffer|A non-NULL pointer to the buffer to write the collected entropy.|
|uint16_t|[in]|bytes|The number of bytes to fill in the input buffer.|

**Returns**

- The number of bytes of entropy collected. For radios that don't support entropy collection, the function returns 0. Values less than the requested amount may also be returned on platforms that use entropy pools to collect random data periodically.

Attempts to fill the provided buffer with the requested number of bytes of entropy. If the requested number of bytes can't be provided, as many bytes as possible will be filled and returned. For radios that do not support this function, 0 bytes are always returned. For information about the specific mechanism for gathering entropy, see documentation for the chip family.

This function returns 0 if a radio configuration is not loaded. If a channel is not set then this function sets the first channel in the loaded configuration implicitly. If the implicit channel setting fails, the function returns 0.

Returns 0 if no receive FIFO or Packet Queue have been configured. 

##### Macros

`#define RAIL_EFR32_HANDLE ((RAIL_Handle_t)0xFFFFFFFFUL)`

**Description**: A placeholder for a radio-generic RAIL handle.

`#define RAIL_STATUS_NO_ERROR SL_STATUS_OK`

**Description**: RAIL function reports no error.

`#define RAIL_STATUS_INVALID_PARAMETER SL_STATUS_INVALID_PARAMETER`

**Description**: Call to RAIL function threw an error because of an invalid parameter.

`#define RAIL_STATUS_INVALID_STATE SL_STATUS_INVALID_STATE`

**Description**: Call to RAIL function threw an error because it was called during an invalid radio state.

`#define RAIL_STATUS_INVALID_CALL SL_STATUS_NOT_AVAILABLE`

**Description**: RAIL function is called in an invalid order.

`#define RAIL_STATUS_SUSPENDED SL_STATUS_IN_PROGRESS`

**Description**: RAIL function did not finish in the allotted time.

`#define RAIL_STATUS_SCHED_ERROR SL_STATUS_ABORT`

**Description**: RAIL function could not be scheduled by the Radio scheduler.

`#define RAIL_DMA_INVALID (0xFFU)`

**Description**: A value to signal that RAIL should not use DMA.

`#define SL_RAIL_EFR32_HANDLE ((sl_rail_handle_t)0xFFFFFFFFUL)`

**Description**: A generic-radio RAIL handle for the primary EFR32 radio.

`#define SL_RAIL_STATUS_NO_ERROR SL_STATUS_OK`

**Description**: RAIL function reports no error.

`#define SL_RAIL_STATUS_INVALID_PARAMETER SL_STATUS_INVALID_PARAMETER`

**Description**: Call to RAIL function threw an error because of an invalid parameter.

`#define SL_RAIL_STATUS_INVALID_STATE SL_STATUS_INVALID_STATE`

**Description**: Call to RAIL function threw an error because it was called during an invalid radio state.

`#define SL_RAIL_STATUS_INVALID_CALL SL_STATUS_NOT_AVAILABLE`

**Description**: RAIL function is called in an invalid order.

`#define SL_RAIL_STATUS_SUSPENDED SL_STATUS_IN_PROGRESS`

**Description**: RAIL function did not finish in the allotted time.

`#define SL_RAIL_STATUS_SCHED_ERROR SL_STATUS_ABORT`

**Description**: RAIL function could not be scheduled by the Radio scheduler.

`#define SL_RAIL_STATUS_NO_MORE_RESOURCE SL_STATUS_NO_MORE_RESOURCE`

**Description**: RAIL function could not allocate needed resource(s).

`#define SL_RAIL_DMA_INVALID (0xFFU)`

**Description**: A value to signal that RAIL should not use DMA.

Contains RAIL Library Version Information. 

It is filled in by [RAIL_GetVersion()](general#rail-get-version).

**Deprecated**RAIL 2.x synonym of [sl_rail_version_t](sl-rail-version-t). 

###### Public Attributes

###### hash (heading level 7)

```
uint32_t RAIL_Version_t::hash
```

**Description:** Git hash.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::hash](sl-rail-version-t#hash).

###### major (heading level 7)

```
uint8_t RAIL_Version_t::major
```

**Description:** Major number.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::major](sl-rail-version-t#major).

###### minor (heading level 7)

```
uint8_t RAIL_Version_t::minor
```

**Description:** Minor number.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::minor](sl-rail-version-t#minor).

###### rev (heading level 7)

```
uint8_t RAIL_Version_t::rev
```

**Description:** Revision number.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::rev](sl-rail-version-t#rev).

###### build (heading level 7)

```
uint8_t RAIL_Version_t::build
```

**Description:** Build number.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::build](sl-rail-version-t#build).

###### flags (heading level 7)

```
uint8_t RAIL_Version_t::flags
```

**Description:** Build flags.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::flags](sl-rail-version-t#flags).

###### multiprotocol (heading level 7)

```
bool RAIL_Version_t::multiprotocol
```

**Description:** Boolean to indicate whether this is a multiprotocol library or not.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_version_t::multiprotocol](sl-rail-version-t#multiprotocol).

Provided for backwards compatibility. 

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3. 

###### Public Attributes

###### buffer (heading level 7)

```
uint8_t RAILSched_Config_t::buffer[1]
```

**Description:** Dummy buffer no longer used.

**Details:** **Deprecated**This RAIL 2.x type has been eliminated in RAIL 3.

RAIL configuration structure. 

**Deprecated**This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_config_t](sl-rail-config-t). 

###### Public Attributes

###### eventsCallback (heading level 7)

```
void(* RAIL_Config_t::eventsCallback) (RAIL_Handle_t railHandle, RAIL_Events_t events)
```

**Description:** A pointer to a function, which is called whenever a RAIL event occurs.

**Details:** See the [RAIL_Events_t](events#rail-events-t) documentation for the list of RAIL events.

**Deprecated**Refer to [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback).

###### protocol (heading level 7)

```
void* RAIL_Config_t::protocol
```

**Description:** Provided for backwards compatibility.

**Details:** Ignored.

**Deprecated**Refer to [sl_rail_config_t::p_opaque_handle_0](sl-rail-config-t#p-opaque-handle-0).

###### scheduler (heading level 7)

```
RAILSched_Config_t* RAIL_Config_t::scheduler
```

**Description:** Provided for backwards compatibility.

**Details:** Ignored.

**Deprecated**Refer to [sl_rail_config_t::p_opaque_handle_1](sl-rail-config-t#p-opaque-handle-1).

###### buffer (heading level 7)

```
RAIL_StateBuffer_t RAIL_Config_t::buffer
```

**Description:** Provided for backwards compatibility.

**Details:** Ignored.

**Deprecated**Refer to [sl_rail_config_t::opaque_value](sl-rail-config-t#opaque-value).

Contains RAIL Library Version Information. 

It is filled in by [sl_rail_get_version()](general#sl-rail-get-version). 

###### Public Attributes

###### hash (heading level 7)

```
uint32_t sl_rail_version_t::hash
```

**Description:** Git hash.

###### major (heading level 7)

```
uint8_t sl_rail_version_t::major
```

**Description:** Major number.

###### minor (heading level 7)

```
uint8_t sl_rail_version_t::minor
```

**Description:** Minor number.

###### rev (heading level 7)

```
uint8_t sl_rail_version_t::rev
```

**Description:** Revision number.

###### build (heading level 7)

```
uint8_t sl_rail_version_t::build
```

**Description:** Build number.

###### flags (heading level 7)

```
uint8_t sl_rail_version_t::flags
```

**Description:** Build flags.

###### multiprotocol (heading level 7)

```
bool sl_rail_version_t::multiprotocol
```

**Description:** Boolean to indicate whether this is a multiprotocol library or not.

RAIL configuration structure. 

###### Public Attributes

###### events_callback (heading level 7)

```
sl_rail_events_callback_t sl_rail_config_t::events_callback
```

**Description:** A pointer to a function, which is called whenever a RAIL event occurs.

**Details:** See the [sl_rail_events_t](events#sl-rail-events-t) documentation for the list of RAIL events.

###### p_opaque_handle_0 (heading level 7)

```
void* sl_rail_config_t::p_opaque_handle_0
```

**Description:** A pointer for application convenience that is opaque to RAIL.

###### p_opaque_handle_1 (heading level 7)

```
void* sl_rail_config_t::p_opaque_handle_1
```

**Description:** Another pointer for application convenience that is opaque to RAIL.

###### opaque_value (heading level 7)

```
sl_rail_opaque_value_t sl_rail_config_t::opaque_value
```

**Description:** A value for application convenience that is opaque to RAIL.

###### rx_packet_queue_entries (heading level 7)

```
uint16_t sl_rail_config_t::rx_packet_queue_entries
```

**Description:** The number of entries in the rx_packet_queue.

**Details:** May be set to 0 if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue) call. This queue is used by RAIL for storing received packet metadata in the order received. Its size indicates how many packets can be held by RAIL for the application to process before [SL_RAIL_EVENT_RX_FIFO_OVERFLOW](events#sl-rail-event-rx-fifo-overflow) might occur.

[sl_rail_init()](general#sl-rail-init) may update this to a smaller size based on chip constraints.

###### rx_fifo_bytes (heading level 7)

```
uint16_t sl_rail_config_t::rx_fifo_bytes
```

**Description:** The number of bytes in the rx_fifo_buffer.

**Details:** May be set to 0 if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) call.

[sl_rail_init()](general#sl-rail-init) may update this to a smaller size based on chip constraints.

###### tx_fifo_bytes (heading level 7)

```
uint16_t sl_rail_config_t::tx_fifo_bytes
```

**Description:** The number of bytes in the tx_fifo_buffer.

**Details:** Must be no more than [SL_RAIL_MAXIMUM_FIFO_BYTES](data-management#sl-rail-maximum-fifo-bytes).

May be set to 0 if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) call.

###### tx_fifo_init_bytes (heading level 7)

```
uint16_t sl_rail_config_t::tx_fifo_init_bytes
```

**Description:** The number of data bytes already placed in the tx_fifo_buffer.

**Details:** Set to 0 if the tx_fifo_buffer is initially empty, otherwise set it to the length of the pre-populated data already placed in the buffer. If this is larger than the FIFO's actual size, the FIFO will be filled only up to its actual size.

###### p_rx_packet_queue (heading level 7)

```
sl_rail_packet_queue_entry_t* sl_rail_config_t::p_rx_packet_queue
```

**Description:** Pointer to the receive Packet Queue to use.

**Details:** May be set to NULL if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue) call.

The receive Packet Queue must be allocated in global read-write memory with at least the number of entries indicated by rx_packet_queue_entries and with the appropriate alignment dictated by this type. It must persist for the duration of RAIL usage or until [sl_rail_set_rx_packet_queue()](data-management#sl-rail-set-rx-packet-queue) is called to change it.

Enabled receive packet completion events add an entry to this queue which is removed when the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) returns or when [sl_rail_release_rx_packet()](receive#sl-rail-release-rx-packet) is called after [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet).

Earlier versions of RAIL used a built-in fixed-size queue of 16 entries.

###### p_rx_fifo_buffer (heading level 7)

```
sl_rail_fifo_buffer_align_t* sl_rail_config_t::p_rx_fifo_buffer
```

**Description:** Pointer to the receive FIFO buffer to use.

**Details:** May be set to NULL if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) call.

The receive FIFO buffer must be allocated in global read-write memory of at least the size indicated by rx_fifo_bytes and with the appropriate alignment dictated by this type. It must persist for the duration of RAIL usage or until [sl_rail_set_rx_fifo()](data-management#sl-rail-set-rx-fifo) is called to change it.

Earlier versions of RAIL provided a default built-in receive FIFO of 512 bytes.

###### p_tx_fifo_buffer (heading level 7)

```
sl_rail_fifo_buffer_align_t* sl_rail_config_t::p_tx_fifo_buffer
```

**Description:** Pointer to the transmit FIFO buffer to use.

**Details:** May be set to NULL if application wants to defer specifying this at [sl_rail_init()](general#sl-rail-init) time to a later [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) call.

The transmit FIFO buffer must be allocated in global read-write memory of at least the size indicated by tx_fifo_bytes and with the appropriate alignment dictated by this type. It must persist for the duration of RAIL usage or until [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) is called to change it.

##### EFR32xG2x

Types specific to the EFR32xG2x for general configuration.

##### SIxx3xx

Types specific to the SIxx3xx for general configuration. 

###### Macros

`#define RAIL_S3LPW_HANDLE RAIL_EFR32_HANDLE`

**Description**: Synonym of [RAIL_EFR32_HANDLE](general#rail-efr32-handle) for Series 3.

`#define SL_RAIL_S3LPW_HANDLE SL_RAIL_EFR32_HANDLE`

**Description**: Synonym of [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle) for Series 3.

#### Multiprotocol

Multiprotocol scheduler APIs to support multiple time-sliced PHYs. 

##### Modules

[RAIL_SchedulerInfo_t](rail-scheduler-info-t)

[sl_rail_scheduler_info_t](sl-rail-scheduler-info-t)

[EFR32xG2x](multiprotocol-efr32-xg2-x)

[Multiprotocol Transition Time](multiprotocol-transition-time)

[SIxx3xx](multiprotocol-sixx3-xx)

##### Enumerations

###### RAIL_SchedulerStatus_t

```
enum RAIL_SchedulerStatus_t {
    RAIL_SCHEDULER_STATUS_NO_ERROR = (0U <<  0 )
    RAIL_SCHEDULER_STATUS_UNSUPPORTED = (1U <<  0 )
    RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED = (2U <<  0 )
    RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL = (3U <<  0 )
    RAIL_SCHEDULER_STATUS_TASK_FAIL = (4U <<  0 )
    RAIL_SCHEDULER_STATUS_INTERNAL_ERROR = (5U <<  0 )
    RAIL_SCHEDULER_TASK_EMPTY = (0U <<  4 )
    RAIL_SCHEDULER_TASK_SCHEDULED_RX = (1U <<  4 )
    RAIL_SCHEDULER_TASK_SCHEDULED_TX = (2U <<  4 )
    RAIL_SCHEDULER_TASK_SINGLE_TX = (3U <<  4 )
    RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX = (4U <<  4 )
    RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX = (5U <<  4 )
    RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX = (6U <<  4 )
    RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX = (7U <<  4 )
    RAIL_SCHEDULER_TASK_TX_STREAM = (8U <<  4 )
    RAIL_SCHEDULER_TASK_AVERAGE_RSSI = (9U <<  4 )
    RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL = (RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                             | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL = (RAIL_SCHEDULER_TASK_SINGLE_TX
                                          | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL = (RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                            | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL = (RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                           | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL = (RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                             | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL = (RAIL_SCHEDULER_TASK_TX_STREAM
                                          | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL = (RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                             | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                  | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                             | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                  | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                             | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_TX
                                             | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_TX
                                               | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SINGLE_TX
                                          | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                      | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                        | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                   | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                     | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                       | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                  | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                         | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                               | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                           | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                      | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                        | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                              | RAIL_SCHEDULER_STATUS_TASK_FAIL)
    RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                          | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED = (RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                     | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_TX_STREAM
                                             | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_TX_STREAM
                                               | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_TX_STREAM_INTERRUPTED = (RAIL_SCHEDULER_TASK_TX_STREAM
                                          | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR = (RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                | RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR = (RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                  | RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED = (RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                             | RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
}
```

**Description:**

Multiprotocol scheduler status returned by [RAIL_GetSchedulerStatus()](multiprotocol#rail-get-scheduler-status).

**Details:**

[Multiprotocol](multiprotocol) scheduler status is a combination of the upper 4 bits which constitute the type of scheduler task and the lower 4 bits which constitute the type of scheduler error.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_SCHEDULER_STATUS_NO_ERROR|Multiprotocol scheduler reports no error.|
|RAIL_SCHEDULER_STATUS_UNSUPPORTED|The scheduler is disabled or the requested scheduler operation is unsupported.|
|RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED|The scheduled task was started but was interrupted by a higher-priority event before it could be completed.|
|RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL|Scheduled task could not be scheduled given its priority and the other tasks running on the system.|
|RAIL_SCHEDULER_STATUS_TASK_FAIL|Calling the RAIL API associated with the Radio scheduler task returned an error code.|
|RAIL_SCHEDULER_STATUS_INTERNAL_ERROR|An internal error occurred in scheduler data structures, which should not happen and indicates a problem.|
|RAIL_SCHEDULER_TASK_EMPTY|Radio scheduler has no task.|
|RAIL_SCHEDULER_TASK_SCHEDULED_RX|Radio scheduler calls [RAIL_ScheduleRx()](receive#rail-schedule-rx).|
|RAIL_SCHEDULER_TASK_SCHEDULED_TX|Radio scheduler calls [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx).|
|RAIL_SCHEDULER_TASK_SINGLE_TX|Radio scheduler calls [RAIL_StartTx()](packet-tx#rail-start-tx).|
|RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX|Radio scheduler calls [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx).|
|RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX|Radio scheduler calls [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx).|
|RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX|Radio scheduler calls [RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx).|
|RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX|Radio scheduler calls [RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx).|
|RAIL_SCHEDULER_TASK_TX_STREAM|Radio scheduler calls [RAIL_StartTxStream()](diagnostic#rail-start-tx-stream).|
|RAIL_SCHEDULER_TASK_AVERAGE_RSSI|Radio scheduler calls [RAIL_StartAverageRssi()](receive#rail-start-average-rssi).|
|RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL|[RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx) returned error status.|
|RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL|[RAIL_StartTx()](packet-tx#rail-start-tx) returned error status.|
|RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL|[RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) returned error status.|
|RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL|[RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) returned error status.|
|RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL|[RAIL_ScheduleRx()](receive#rail-schedule-rx) returned error status.|
|RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL|[RAIL_StartTxStream()](diagnostic#rail-start-tx-stream) returned error status.|
|RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL|[RAIL_StartAverageRssi()](receive#rail-start-average-rssi) returned error status.|
|RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR|Multiprotocol scheduled receive function internal error.|
|RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR|Multiprotocol scheduled receive scheduling error.|
|RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED|[RAIL_ScheduleRx()](receive#rail-schedule-rx) operation interrupted|
|RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR|Multiprotocol scheduled TX internal error.|
|RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR|Multiprotocol scheduled TX scheduling error.|
|RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED|[RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx) operation interrupted.|
|RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR|Multiprotocol instantaneous TX internal error.|
|RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR|Multiprotocol instantaneous TX scheduling error.|
|RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED|[RAIL_StartTx()](packet-tx#rail-start-tx) operation interrupted.|
|RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR|Multiprotocol single CSMA transmit function internal error.|
|RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR|Multiprotocol single CSMA transmit scheduling error.|
|RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED|[RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) operation interrupted.|
|RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR|Multiprotocol single LBT transmit function internal error.|
|RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR|Multiprotocol single LBT transmit scheduling error.|
|RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED|[RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) operation interrupted.|
|RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR|Multiprotocol scheduled CSMA transmit function internal error.|
|RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL|[RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx) returned error status.|
|RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR|Multiprotocol scheduled CSMA transmit scheduling error.|
|RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED|[RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx) operation interrupted.|
|RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR|Multiprotocol scheduled LBT transmit function internal error.|
|RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL|[RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx) returned error status.|
|RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR|Multiprotocol scheduled LBT transmit scheduling error.|
|RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED|[RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx) operation interrupted.|
|RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR|Multiprotocol stream transmit function internal error.|
|RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR|Multiprotocol stream transmit scheduling error.|
|RAIL_SCHEDULER_TX_STREAM_INTERRUPTED|[RAIL_StartTxStream()](diagnostic#rail-start-tx-stream) operation interrupted.|
|RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR|Multiprotocol RSSI averaging function internal error.|
|RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR|Multiprotocol RSSI average scheduling error.|
|RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED|[RAIL_StartAverageRssi()](receive#rail-start-average-rssi) operation interrupted.|

###### RAIL_TaskType_t

```
enum RAIL_TaskType_t {
    RAIL_TASK_TYPE_START_RX = 0
    RAIL_TASK_TYPE_OTHER = 1
}
```

**Description:**

Multiprotocol radio operation task types, used with [RAIL_SetTaskPriority()](multiprotocol#rail-set-task-priority).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_task_type_t](multiprotocol#sl-rail-task-type-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_TASK_TYPE_START_RX|Indicate a task started using [RAIL_StartRx()](receive#rail-start-rx).|
|RAIL_TASK_TYPE_OTHER|Indicate a task started functions other than [RAIL_StartRx()](receive#rail-start-rx).|

###### sl_rail_scheduler_status_t

```
enum sl_rail_scheduler_status_t {
    SL_RAIL_SCHEDULER_STATUS_NO_ERROR = (0U <<  0 )
    SL_RAIL_SCHEDULER_STATUS_UNSUPPORTED = (1U <<  0 )
    SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED = (2U <<  0 )
    SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL = (3U <<  0 )
    SL_RAIL_SCHEDULER_STATUS_TASK_FAIL = (4U <<  0 )
    SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR = (5U <<  0 )
    SL_RAIL_SCHEDULER_TASK_EMPTY = (0U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX = (1U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX = (2U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SINGLE_TX = (3U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX = (4U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX = (5U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX = (6U <<  4 )
    SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX = (7U <<  4 )
    SL_RAIL_SCHEDULER_TASK_TX_STREAM = (8U <<  4 )
    SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI = (9U <<  4 )
    SL_RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SINGLE_TX
                                             | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                               | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                              | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL = (SL_RAIL_SCHEDULER_TASK_TX_STREAM
                                             | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL = (SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                   | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                     | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX
                                                | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                   | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                     | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX
                                                | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_TX
                                                | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_TX
                                                  | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SINGLE_TX
                                             | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                         | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                           | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX
                                                      | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                        | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                          | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX
                                                     | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                            | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                  | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                              | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX
                                                         | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                           | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                 | SL_RAIL_SCHEDULER_STATUS_TASK_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                             | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX
                                                        | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_TX_STREAM
                                                | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_TX_STREAM
                                                  | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_TX_STREAM_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_TX_STREAM
                                             | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
    SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR = (SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                   | SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR)
    SL_RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR = (SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                     | SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL)
    SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED = (SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI
                                                | SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED)
}
```

**Description:**

Multiprotocol scheduler status returned by [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status).

**Details:**

[Multiprotocol](multiprotocol) scheduler status is a combination of the upper 4 bits which constitute the type of scheduler task and the lower 4 bits which constitute the type of scheduler error.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_SCHEDULER_STATUS_NO_ERROR|Multiprotocol scheduler reports no error.|
|SL_RAIL_SCHEDULER_STATUS_UNSUPPORTED|The scheduler is disabled or the requested scheduler operation is unsupported.|
|SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED|The scheduled task was started but was interrupted by a higher-priority event before it could be completed.|
|SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL|Scheduled task could not be scheduled given its priority and the other tasks running on the system.|
|SL_RAIL_SCHEDULER_STATUS_TASK_FAIL|Calling the RAIL API associated with the Radio scheduler task returned an error code.|
|SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR|An internal error occurred in scheduler data structures, which should not happen and indicates a problem.|
|SL_RAIL_SCHEDULER_TASK_EMPTY|Radio scheduler has no task.|
|SL_RAIL_SCHEDULER_TASK_SCHEDULED_RX|Radio scheduler calls [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx).|
|SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX|Radio scheduler calls [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx).|
|SL_RAIL_SCHEDULER_TASK_SINGLE_TX|Radio scheduler calls [sl_rail_start_tx()](packet-tx#sl-rail-start-tx).|
|SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_CSMA_TX|Radio scheduler calls [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx).|
|SL_RAIL_SCHEDULER_TASK_SINGLE_CCA_LBT_TX|Radio scheduler calls [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx).|
|SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_CSMA_TX|Radio scheduler calls [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx).|
|SL_RAIL_SCHEDULER_TASK_SCHEDULED_CCA_LBT_TX|Radio scheduler calls [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx).|
|SL_RAIL_SCHEDULER_TASK_TX_STREAM|Radio scheduler calls [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream).|
|SL_RAIL_SCHEDULER_TASK_AVERAGE_RSSI|Radio scheduler calls [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi).|
|SL_RAIL_SCHEDULER_STATUS_SCHEDULED_TX_FAIL|[sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_SINGLE_TX_FAIL|[sl_rail_start_tx()](packet-tx#sl-rail-start-tx) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_CCA_CSMA_TX_FAIL|[sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_CCA_LBT_TX_FAIL|[sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_SCHEDULED_RX_FAIL|[sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_TX_STREAM_FAIL|[sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream) returned error status.|
|SL_RAIL_SCHEDULER_STATUS_AVERAGE_RSSI_FAIL|[sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi) returned error status.|
|SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERNAL_ERROR|Multiprotocol scheduled receive function internal error.|
|SL_RAIL_SCHEDULER_SCHEDULED_RX_SCHEDULING_ERROR|Multiprotocol scheduled receive scheduling error.|
|SL_RAIL_SCHEDULER_SCHEDULED_RX_INTERRUPTED|[sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx) operation interrupted|
|SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERNAL_ERROR|Multiprotocol scheduled TX internal error.|
|SL_RAIL_SCHEDULER_SCHEDULED_TX_SCHEDULING_ERROR|Multiprotocol scheduled TX scheduling error.|
|SL_RAIL_SCHEDULER_SCHEDULED_TX_INTERRUPTED|[sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_SINGLE_TX_INTERNAL_ERROR|Multiprotocol instantaneous TX internal error.|
|SL_RAIL_SCHEDULER_SINGLE_TX_SCHEDULING_ERROR|Multiprotocol instantaneous TX scheduling error.|
|SL_RAIL_SCHEDULER_SINGLE_TX_INTERRUPTED|[sl_rail_start_tx()](packet-tx#sl-rail-start-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERNAL_ERROR|Multiprotocol single CSMA transmit function internal error.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_SCHEDULING_ERROR|Multiprotocol single CSMA transmit scheduling error.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_CSMA_TX_INTERRUPTED|[sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERNAL_ERROR|Multiprotocol single LBT transmit function internal error.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_SCHEDULING_ERROR|Multiprotocol single LBT transmit scheduling error.|
|SL_RAIL_SCHEDULER_SINGLE_CCA_LBT_TX_INTERRUPTED|[sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERNAL_ERROR|Multiprotocol scheduled CSMA transmit function internal error.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_FAIL|[sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx) returned error status.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_SCHEDULING_ERROR|Multiprotocol scheduled CSMA transmit scheduling error.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_CSMA_TX_INTERRUPTED|[sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERNAL_ERROR|Multiprotocol scheduled LBT transmit function internal error.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_FAIL|[sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx) returned error status.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_SCHEDULING_ERROR|Multiprotocol scheduled LBT transmit scheduling error.|
|SL_RAIL_SCHEDULER_SCHEDULED_CCA_LBT_TX_INTERRUPTED|[sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx) operation interrupted.|
|SL_RAIL_SCHEDULER_TX_STREAM_INTERNAL_ERROR|Multiprotocol stream transmit function internal error.|
|SL_RAIL_SCHEDULER_TX_STREAM_SCHEDULING_ERROR|Multiprotocol stream transmit scheduling error.|
|SL_RAIL_SCHEDULER_TX_STREAM_INTERRUPTED|[sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream) operation interrupted.|
|SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERNAL_ERROR|Multiprotocol RSSI averaging function internal error.|
|SL_RAIL_SCHEDULER_AVERAGE_RSSI_SCHEDULING_ERROR|Multiprotocol RSSI average scheduling error.|
|SL_RAIL_SCHEDULER_AVERAGE_RSSI_INTERRUPTED|[sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi) operation interrupted.|

###### sl_rail_task_type_t

```
enum sl_rail_task_type_t {
    SL_RAIL_TASK_TYPE_START_RX = 0u
    SL_RAIL_TASK_TYPE_OTHER = 1u
}
```

**Description:**

Multiprotocol radio operation task types, used with [sl_rail_set_task_priority()](multiprotocol#sl-rail-set-task-priority).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TASK_TYPE_START_RX|Indicate a task started using [sl_rail_start_rx()](receive#sl-rail-start-rx).|
|SL_RAIL_TASK_TYPE_OTHER|Indicate a task started functions other than [sl_rail_start_rx()](receive#sl-rail-start-rx).|

##### Functions

###### RAIL_YieldRadio

`RAIL_Status_t RAIL_YieldRadio(RAIL_Handle_t railHandle)`

**Description:** Yield the radio to other configurations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function is used to indicate that the previous transmit or scheduled receive operation has completed. It must be used in multiprotocol RAIL because the scheduler assumes that any transmit or receive operation that is started can go on indefinitely based on state transitions and your protocol. RAIL will not allow a lower priority tasks to run until this is called so it can negatively impact performance of those protocols if this is omitted or delayed. It is also possible to call the [RAIL_Idle()](state-transitions#rail-idle-1) API to both terminate the operation and idle the radio. In single protocol RAIL this API does nothing, however, if RAIL Power Manager is initialized, calling [RAIL_YieldRadio()](multiprotocol#rail-yield-radio) after scheduled TX/RX and instantaneous TX completion, is required, to indicate to the Power Manager that the the radio is no longer busy and can be idled for sleeping.

See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio). 

###### RAIL_GetSchedulerStatus

`RAIL_SchedulerStatus_t RAIL_GetSchedulerStatus(RAIL_Handle_t railHandle)`

**Description:** Get the status of the RAIL scheduler.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) status.

This function can only be called from a callback context after the [RAIL_EVENT_SCHEDULER_STATUS](events#rail-event-scheduler-status) event occurs.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status) with additional parameters and a broader set of [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values that can be reported. 

###### RAIL_GetSchedulerStatusAlt

`RAIL_Status_t RAIL_GetSchedulerStatusAlt(RAIL_Handle_t railHandle, RAIL_SchedulerStatus_t *pSchedulerStatus, RAIL_Status_t *pRailStatus)`

**Description:** Get the status of the RAIL scheduler, specific to the radio operation, along with [RAIL_Status_t](general#rail-status-t) returned by RAIL API invoked by the RAIL scheduler.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) *|[out]|pSchedulerStatus|An application-provided pointer to store [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) status. Can be NULL as long as pRailStatus is not NULL.|
|[RAIL_Status_t](general#rail-status-t) *|[out]|pRailStatus|An application-provided pointer to store [RAIL_Status_t](general#rail-status-t) of the RAIL API invoked by the RAIL scheduler. Can be NULL as long as pSchedulerStatus is not NULL.|

**Returns**

- Status code indicating success of the function call.

This function can only be called from a callback context after the [RAIL_EVENT_SCHEDULER_STATUS](events#rail-event-scheduler-status) event occurs.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_scheduler_status()](multiprotocol#sl-rail-get-scheduler-status). 

###### RAIL_SetTaskPriority

`RAIL_Status_t RAIL_SetTaskPriority(RAIL_Handle_t railHandle, uint8_t priority, RAIL_TaskType_t taskType)`

**Description:** Change the priority of a specified task type in multiprotocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|priority|Desired new priority for the railHandle's active task|
|[RAIL_TaskType_t](multiprotocol#rail-task-type-t)|[in]|taskType|Type of task whose priority should be updated|

**Returns**

- Status code indicating success of the function call.

While the application can use this function however it likes, a major use case is being able to increase an infinite receive priority while receiving a packet. In other words, a given [RAIL_Handle_t](general#rail-handle-t) can maintain a very low priority background receive, but upon getting a [RAIL_EVENT_RX_SYNC1_DETECT_SHIFT](events#rail-event-rx-sync1-detect-shift) or [RAIL_EVENT_RX_SYNC2_DETECT_SHIFT](events#rail-event-rx-sync2-detect-shift) event, the app can call this function to increase the background RX priority to lower the risk another protocol might preempt during packet reception.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_task_priority()](multiprotocol#sl-rail-set-task-priority). 

###### RAIL_GetTransitionTime

`RAIL_Time_t RAIL_GetTransitionTime(void)`

**Description:** Get the time needed to switch between protocols.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- [RAIL_Time_t](system-timing#rail-time-t) Approximate time, in microseconds, needed to switch between protocols.

**Note**

- The transition time determines how early the scheduler starts processing a protocol switch relative to a scheduled event. This value is approximate and actual transition time may vary slightly due to system overhead.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_transition_time()](multiprotocol#sl-rail-get-transition-time) with its additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_SetTransitionTime

`void RAIL_SetTransitionTime(RAIL_Time_t transitionTime)`

**Description:** Set the time needed to switch between protocols.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|transitionTime|Time, in microseconds, needed to switch between protocols.|

Call this API only once, before any protocol is initialized via [RAIL_Init()](general#rail-init). Changing this value during normal operation can result in improper scheduling behavior.

**Note**

- The transition time determines how early the scheduler starts processing a protocol switch relative to a scheduled event. This value is approximate and does not account for all system overhead. Setting this value too low may cause scheduling issues or missed events.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_transition_time()](multiprotocol#sl-rail-set-transition-time) with its additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### sl_rail_yield_radio

`sl_rail_status_t sl_rail_yield_radio(sl_rail_handle_t rail_handle)`

**Description:** Yield the radio to other configurations.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function is used to indicate that the previous transmit or scheduled receive operation has completed. It must be used in multiprotocol RAIL because the scheduler assumes that any transmit or receive operation that is started can go on indefinitely based on state transitions and your protocol. RAIL will not allow a lower priority tasks to run until this is called so it can negatively impact performance of those protocols if this is omitted or delayed. It is also possible to call the [sl_rail_idle()](state-transitions#sl-rail-idle-1) API to both terminate the operation and idle the radio. In single protocol RAIL this API does nothing, however, if RAIL Power Manager is initialized, calling [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) after scheduled TX/RX and instantaneous TX completion, is required, to indicate to the Power Manager that the the radio is no longer busy and can be idled for sleeping.

See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_get_scheduler_status

`sl_rail_status_t sl_rail_get_scheduler_status(sl_rail_handle_t rail_handle, sl_rail_scheduler_status_t *p_scheduler_status, sl_rail_status_t *p_rail_status)`

**Description:** Get the status of the RAIL scheduler, specific to the radio operation, along with [sl_rail_status_t](general#sl-rail-status-t) returned by RAIL API invoked by the RAIL scheduler.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) *|[out]|p_scheduler_status|An application-provided pointer to store [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) status. Can be NULL as long as p_rail_status is not NULL.|
|[sl_rail_status_t](general#sl-rail-status-t) *|[out]|p_rail_status|An application-provided pointer to store [sl_rail_status_t](general#sl-rail-status-t) of the RAIL API invoked by the RAIL scheduler. Can be NULL as long as p_scheduler_status is not NULL.|

**Returns**

- Status code indicating success of the function call.

This function can only be called from a callback context after the [SL_RAIL_EVENT_SCHEDULER_STATUS](events#sl-rail-event-scheduler-status) event occurs. 

###### sl_rail_set_task_priority

`sl_rail_status_t sl_rail_set_task_priority(sl_rail_handle_t rail_handle, uint8_t priority, sl_rail_task_type_t task_type)`

**Description:** Change the priority of a specified task type in multiprotocol.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|priority|Desired new priority for the rail_handle's active task|
|[sl_rail_task_type_t](multiprotocol#sl-rail-task-type-t)|[in]|task_type|Type of task whose priority should be updated|

**Returns**

- Status code indicating success of the function call.

While the application can use this function however it likes, a major use case is being able to increase an infinite receive priority while receiving a packet. In other words, a given [sl_rail_handle_t](general#sl-rail-handle-t) can maintain a very low priority background receive, but upon getting a [SL_RAIL_EVENT_RX_SYNC_0_DETECT_SHIFT](events#sl-rail-event-rx-sync-0-detect-shift) or [SL_RAIL_EVENT_RX_SYNC_1_DETECT_SHIFT](events#sl-rail-event-rx-sync-1-detect-shift) event, the app can call this function to increase the background RX priority to lower the risk another protocol might preempt during packet reception. 

###### sl_rail_get_transition_time

`sl_rail_time_t sl_rail_get_transition_time(sl_rail_handle_t radio_handle)`

**Description:** Get the time needed to switch between protocols.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|

**Returns**

- [sl_rail_time_t](system-timing#sl-rail-time-t) Time, in microseconds, needed to switch between protocols.

**Note**

- This API provides an accurate transition time by accounting for system overhead. The transition time determines how early the scheduler starts processing a protocol switch relative to a scheduled event.

###### sl_rail_set_transition_time

`sl_rail_status_t sl_rail_set_transition_time(sl_rail_handle_t radio_handle, sl_rail_time_t transition_time_us)`

**Description:** Set the time needed to switch between protocols.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|transition_time_us|Time, in microseconds, needed to switch between protocols.|

Call this API only once, before any protocol is initialized via [sl_rail_init()](general#sl-rail-init). Changing this value during normal operation can result in improper scheduling behavior.

**Returns**

- Status code indicating success of the function call.

**Note**

- This API provides an accurate transition time by accounting for system overhead. The transition time determines how early the scheduler starts processing a protocol switch relative to a scheduled event. Setting this value too low may cause scheduling issues or missed events.

##### Macros

`#define RAIL_SCHEDULER_STATUS_MASK 0x0FU`

**Description**: Radio Scheduler Status mask within [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) values.

`#define RAIL_SCHEDULER_STATUS_SHIFT 0`

**Description**: Radio Scheduler Status shift within [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) values.

`#define RAIL_SCHEDULER_TASK_MASK 0xF0U`

**Description**: Radio Scheduler Task mask within [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) values.

`#define RAIL_SCHEDULER_TASK_SHIFT 4`

**Description**: Radio Scheduler Task shift within [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) values.

`#define SL_RAIL_SCHEDULER_STATUS_MASK 0x0FU`

**Description**: Radio Scheduler Status mask within [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values.

`#define SL_RAIL_SCHEDULER_STATUS_SHIFT 0`

**Description**: Radio Scheduler Status shift within [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values.

`#define SL_RAIL_SCHEDULER_TASK_MASK 0xF0U`

**Description**: Radio Scheduler Task mask within [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values.

`#define SL_RAIL_SCHEDULER_TASK_SHIFT 4`

**Description**: Radio Scheduler Task shift within [sl_rail_scheduler_status_t](multiprotocol#sl-rail-scheduler-status-t) values.

A structure to hold information used by the scheduler. 

For multiprotocol versions of RAIL, this can be used to control how a receive or transmit operation is run. It's not necessary in single-protocol applications.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t). 

###### Public Attributes

###### priority (heading level 7)

```
uint8_t RAIL_SchedulerInfo_t::priority
```

**Description:** The scheduler priority to use for this operation.

**Details:** This priority is used to preempt a long running lower-priority task to ensure higher-priority operations complete in time. A lower numerical value represents a higher logical priority meaning 0 is the highest priority and 255 is the lowest.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduler_info_t::priority](sl-rail-scheduler-info-t#priority).

###### slipTime (heading level 7)

```
RAIL_Time_t RAIL_SchedulerInfo_t::slipTime
```

**Description:** The amount of time in microseconds that this operation can slip by into the future and still be run.

**Details:** This time is relative to the start time which may be the current time for relative transmits. If the scheduler can't start the operation by this time, it will be considered a failure.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduler_info_t::slip_time](sl-rail-scheduler-info-t#slip-time).

###### transactionTime (heading level 7)

```
RAIL_Time_t RAIL_SchedulerInfo_t::transactionTime
```

**Description:** The transaction time in microseconds for this operation.

**Details:** Since transaction times may not be known exactly, use a minimum or an expected guess for this time. The scheduler will use the value entered here to look for overlaps between low-priority and high-priority tasks and attempt to find a schedule where all tasks get to run.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduler_info_t::transaction_time](sl-rail-scheduler-info-t#transaction-time).

A structure to hold information used by the scheduler. 

For multiprotocol versions of RAIL, this can be used to control how a receive or transmit operation is run. It's not necessary in single-protocol applications. 

###### Public Attributes

###### priority (heading level 7)

```
uint8_t sl_rail_scheduler_info_t::priority
```

**Description:** The scheduler priority to use for this operation.

**Details:** This priority is used to preempt a long running lower-priority task to ensure higher-priority operations complete in time. A lower numerical value represents a higher logical priority meaning 0 is the highest priority and 255 is the lowest.

###### slip_time (heading level 7)

```
sl_rail_time_t sl_rail_scheduler_info_t::slip_time
```

**Description:** The amount of time in microseconds that this operation can slip by into the future and still be run.

**Details:** This time is relative to the start time which may be the current time for relative transmits. If the scheduler can't start the operation by this time, it will be considered a failure.

###### transaction_time (heading level 7)

```
sl_rail_time_t sl_rail_scheduler_info_t::transaction_time
```

**Description:** The transaction time in microseconds for this operation.

**Details:** Since transaction times may not be known exactly, use a minimum or an expected guess for this time. The scheduler will use the value entered here to look for overlaps between low-priority and high-priority tasks and attempt to find a schedule where all tasks get to run.

##### EFR32xG2x

EFR32xG2x-specific multiprotocol support defines. 

###### Macros

`#define TRANSITION_TIME_US 500`

**Description**: Time it takes to take care of protocol switching.

`#define SL_RAIL_TRANSITION_TIME_US 500`

**Description**: Time it takes to take care of protocol switching.

##### SIxx3xx

SIxx3xx-specific multiprotocol support defines. 

###### Macros

`#define TRANSITION_TIME_US 450`

**Description**: Time it takes to take care of protocol switching.

`#define SL_RAIL_TRANSITION_TIME_US 450`

**Description**: Time it takes to take care of protocol switching.

##### Multiprotocol Transition Time

APIs related to [Multi-Protocol Transition Time Utility](sl-rail-util-mp-transition-time) component. 

###### Modules

[sl_rail_util_mp_transition_time_entry_t](sl-rail-util-mp-transition-time-entry-t)

###### Functions

###### sl_rail_util_mp_transition_time_get (heading level 7)

`sl_status_t sl_rail_util_mp_transition_time_get(const sl_rail_util_mp_transition_time_entry_t *p_table, const size_t table_size, sl_rail_time_t *p_transition_time)`

**Description:** Retrieves the transition time for the current system clock frequency.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [sl_rail_util_mp_transition_time_entry_t](sl-rail-util-mp-transition-time-entry-t) *|[in]|p_table|A non-NULL pointer to the transition time table.|
|const size_t|[in]|table_size|Number of entries in the transition time table.|
|[sl_rail_time_t](system-timing#sl-rail-time-t) *|[out]|p_transition_time|A non-NULL pointer to store the resulting transition time (in microseconds).|

Searches the provided transition time table for the entry corresponding to the current system clock frequency. The table must be sorted in descending order of frequency to ensure correct lookups. If the table is not sorted, the lookup process may yield incorrect results.

The transition time table is autogenerated during project generation. For more details, refer to the `sl_rail_util_mp_transition_time.md` file.

**Returns**

- SL_STATUS_OK if a matching entry is found and the transition time is retrieved.
- SL_STATUS_INVALID_PARAMETER if the input parameters are invalid.
- SL_STATUS_NOT_FOUND if no matching entry is found for the current system clock frequency.

###### sl_rail_util_mp_transition_time_init (heading level 7)

`void sl_rail_util_mp_transition_time_init(void)`

**Description:** Initializes the multi-protocol transition time utility.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Determines the appropriate transition time for the current system clock frequency and configures the RAIL library with the calculated transition time. It uses the transition time table defined in the configuration.

The transition time table is autogenerated during project generation. For more details, refer to the `sl_rail_util_mp_transition_time.md` file.

If the transition time cannot be determined, the function does not configure the RAIL library.

Represents an entry in the multi-protocol transition time table. 

This structure maps a minimum system clock frequency to the corresponding transition time required for multi-protocol radio operations.

Each entry specifies a `transition_time_us` that applies to all system clock frequencies greater than or equal to the `minimum_frequency_hz`. The table must be sorted in descending order of frequency to ensure correct lookups. If the table is not sorted, the lookup process may yield incorrect results.

The transition time table is autogenerated during project generation. For more details, refer to the `sl_rail_util_mp_transition_time.md` file. 

###### Public Attributes (heading level 7)

###### minimum_frequency_hz (heading level 8)

```
uint32_t sl_rail_util_mp_transition_time_entry_t::minimum_frequency_hz
```

**Description:** Minimum frequency in Hz for this entry.

###### transition_time_us (heading level 8)

```
sl_rail_time_t sl_rail_util_mp_transition_time_entry_t::transition_time_us
```

**Description:** Transition time in microseconds.

#### PTI Packet Trace

Basic APIs to set up and interact with PTI settings. 

These enumerations and structures are used with RAIL PTI API.

EFR32 supports SPI and UART PTI and is configurable in terms of baud rates and PTI pin locations. 

##### Modules

[RAIL_PtiConfig_t](rail-pti-config-t)

[sl_rail_pti_config_t](sl-rail-pti-config-t)

##### Enumerations

###### RAIL_PtiMode_t

```
enum RAIL_PtiMode_t {
    RAIL_PTI_MODE_DISABLED = 0
    RAIL_PTI_MODE_SPI = 1
    RAIL_PTI_MODE_UART = 2
    RAIL_PTI_MODE_UART_ONEWIRE = 3
}
```

**Description:**

A channel type enumeration.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_pti_mode_t](pti#sl-rail-pti-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_PTI_MODE_DISABLED|Turn PTI off entirely.|
|RAIL_PTI_MODE_SPI|8-bit SPI mode.|
|RAIL_PTI_MODE_UART|8-bit UART mode.|
|RAIL_PTI_MODE_UART_ONEWIRE|9-bit UART mode.|

###### RAIL_PtiProtocol_t

```
enum RAIL_PtiProtocol_t {
    RAIL_PTI_PROTOCOL_CUSTOM = 0
    RAIL_PTI_PROTOCOL_THREAD = 2
    RAIL_PTI_PROTOCOL_BLE = 3
    RAIL_PTI_PROTOCOL_CONNECT = 4
    RAIL_PTI_PROTOCOL_ZIGBEE = 5
    RAIL_PTI_PROTOCOL_ZWAVE = 6
    RAIL_PTI_PROTOCOL_WISUN = 7
    RAIL_PTI_PROTOCOL_802154 = 8
    RAIL_PTI_PROTOCOL_SIDEWALK = 9
    RAIL_PTI_PROTOCOL_BTC = 10
}
```

**Description:**

The protocol that RAIL outputs via the Packet Trace Interface (PTI).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_pti_protocol_t](pti#sl-rail-pti-protocol-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_PTI_PROTOCOL_CUSTOM|PTI output for a custom protocol.|
|RAIL_PTI_PROTOCOL_THREAD|PTI output for the Thread protocol.|
|RAIL_PTI_PROTOCOL_BLE|PTI output for the Bluetooth Smart protocol.|
|RAIL_PTI_PROTOCOL_CONNECT|PTI output for the Connect protocol.|
|RAIL_PTI_PROTOCOL_ZIGBEE|PTI output for the Zigbee protocol.|
|RAIL_PTI_PROTOCOL_ZWAVE|PTI output for the Z-Wave protocol.|
|RAIL_PTI_PROTOCOL_WISUN|PTI output for the Wi-SUN protocol.|
|RAIL_PTI_PROTOCOL_802154|PTI output for a custom protocol using a built-in 802.15.4 radio config.|
|RAIL_PTI_PROTOCOL_SIDEWALK|PTI output for Sidewalk protocol.|
|RAIL_PTI_PROTOCOL_BTC|PTI output for the Bluetooth Classic protocol.|

###### sl_rail_pti_mode_t

```
enum sl_rail_pti_mode_t {
    SL_RAIL_PTI_MODE_DISABLED = 0
    SL_RAIL_PTI_MODE_SPI = 1
    SL_RAIL_PTI_MODE_UART = 2
    SL_RAIL_PTI_MODE_UART_ONEWIRE = 3
}
```

**Description:**

A channel type enumeration.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_PTI_MODE_DISABLED|Turn PTI off entirely.|
|SL_RAIL_PTI_MODE_SPI|8-bit SPI mode.|
|SL_RAIL_PTI_MODE_UART|8-bit UART mode.|
|SL_RAIL_PTI_MODE_UART_ONEWIRE|9-bit UART mode.|

###### sl_rail_pti_protocol_t

```
enum sl_rail_pti_protocol_t {
    SL_RAIL_PTI_PROTOCOL_CUSTOM = 0
    SL_RAIL_PTI_PROTOCOL_THREAD = 2
    SL_RAIL_PTI_PROTOCOL_BLE = 3
    SL_RAIL_PTI_PROTOCOL_CONNECT = 4
    SL_RAIL_PTI_PROTOCOL_ZIGBEE = 5
    SL_RAIL_PTI_PROTOCOL_ZWAVE = 6
    SL_RAIL_PTI_PROTOCOL_WI_SUN = 7
    SL_RAIL_PTI_PROTOCOL_802154 = 8
    SL_RAIL_PTI_PROTOCOL_SIDEWALK = 9
    SL_RAIL_PTI_PROTOCOL_BTC = 10
}
```

**Description:**

The protocol that RAIL outputs via the Packet Trace Interface (PTI).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_PTI_PROTOCOL_CUSTOM|PTI output for a custom protocol.|
|SL_RAIL_PTI_PROTOCOL_THREAD|PTI output for the Thread protocol.|
|SL_RAIL_PTI_PROTOCOL_BLE|PTI output for the Bluetooth Smart protocol.|
|SL_RAIL_PTI_PROTOCOL_CONNECT|PTI output for the Connect protocol.|
|SL_RAIL_PTI_PROTOCOL_ZIGBEE|PTI output for the Zigbee protocol.|
|SL_RAIL_PTI_PROTOCOL_ZWAVE|PTI output for the Z-Wave protocol.|
|SL_RAIL_PTI_PROTOCOL_WI_SUN|PTI output for the Wi-SUN protocol.|
|SL_RAIL_PTI_PROTOCOL_802154|PTI output for a custom protocol using a built-in 802.15.4 radio config.|
|SL_RAIL_PTI_PROTOCOL_SIDEWALK|PTI output for Sidewalk protocol.|
|SL_RAIL_PTI_PROTOCOL_BTC|PTI output for the Bluetooth Classic protocol.|

##### Functions

###### RAIL_ConfigPti

`RAIL_Status_t RAIL_ConfigPti(RAIL_Handle_t railHandle, const RAIL_PtiConfig_t *ptiConfig)`

**Description:** Configure PTI pin locations, serial protocols, and baud rates.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|const [RAIL_PtiConfig_t](rail-pti-config-t) *|[in]|ptiConfig|A non-NULL pointer to the PTI configuration structure to use.|

**Returns**

- Status code indicating success of the function call.

When this function is called prior to the first [RAIL_Init()](general#rail-init) call, the PTI configuration is recorded but activation is deferred to [RAIL_Init()](general#rail-init). When called subsequent to [RAIL_Init()](general#rail-init), the radio should be off (idle) and the PTI configuration is recorded and put into effect immediately unless [RAIL_EnablePti()](pti#rail-enable-pti) had been called just prior to disable PTI, in which case activation is deferred to when [RAIL_EnablePti()](pti#rail-enable-pti) is subsequently called to enable PTI.

Only one PTI configuration that can be active on a radio, regardless of the number of protocols (unless the application updates the configuration upon a protocol switch – RAIL does not save the configuration in a protocol RAIL instance).

**Note**

- On EFR32 platforms GPIO configuration must be unlocked (see GPIO->LOCK register) to configure or use PTI.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_pti()](pti#sl-rail-config-pti). 

###### RAIL_GetPtiConfig

`RAIL_Status_t RAIL_GetPtiConfig(RAIL_Handle_t railHandle, RAIL_PtiConfig_t *ptiConfig)`

**Description:** Get the currently-active PTI configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|[RAIL_PtiConfig_t](rail-pti-config-t) *|[out]|ptiConfig|A non-NULL pointer to the configuration structure to be filled in with the active PTI configuration.|

**Returns**

- RAIL status indicating success of the function call.

Although most combinations of configurations can be set, it is safest to call this method after configuration to confirm which values were actually set. This function always returns the active PTI configuration on the radio regardless of the active protocol.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_pti_config()](pti#sl-rail-get-pti-config). 

###### RAIL_EnablePti

`RAIL_Status_t RAIL_EnablePti(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable Packet Trace Interface (PTI) output of packet data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|bool|[in]|enable|PTI is enabled if true; disabled if false.|

**Returns**

- Status code indicating success of the function call.

Similarly to having only one PTI configuration per radio, PTI can only be enabled or disabled for all protocols. It cannot be individually set to enabled and disabled per protocol (unless the application switches it when the protocol switches – RAIL does not save this state in a protocol RAIL instance).

PTI should be enabled or disabled only when the radio is off (idle).

**Note**

- The first call to [RAIL_Init()](general#rail-init) implicitly enables PTI, but it won't take effect unless or until [RAIL_ConfigPti()](pti#rail-config-pti) has been called with a mode other than the default [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled).

**Warnings**

- On EFR32 platforms GPIO configuration must be unlocked (see GPIO->LOCK register) to configure or use PTI, otherwise a fault or assert might occur. If GPIO configuration locking is desired, PTI must be disabled beforehand either with this function or with [RAIL_ConfigPti()](pti#rail-config-pti) using [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled).
- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_pti()](pti#sl-rail-enable-pti). 

###### RAIL_SetPtiProtocol

`RAIL_Status_t RAIL_SetPtiProtocol(RAIL_Handle_t railHandle, RAIL_PtiProtocol_t protocol)`

**Description:** Set a protocol that RAIL outputs on PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_PtiProtocol_t](pti#rail-pti-protocol-t)|[in]|protocol|The enumeration representing which protocol the app is using.|

**Returns**

- Status code indicating success of the function call.

The protocol is output via PTI for each packet. Before any protocol is set, the default value is [RAIL_PTI_PROTOCOL_CUSTOM](pti#rail-pti-protocol-custom). Use one of the enumeration values so that the Network Analyzer can decode the packet.

**Note**

- This function cannot be called unless the radio is currently in the [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle) or [RAIL_RF_STATE_INACTIVE](state-transitions#rail-rf-state-inactive) states. For this reason, call this function early on before starting radio operations and not changed later.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_pti_protocol()](pti#sl-rail-set-pti-protocol). 

###### RAIL_GetPtiProtocol

`RAIL_PtiProtocol_t RAIL_GetPtiProtocol(RAIL_Handle_t railHandle)`

**Description:** Get the protocol that RAIL outputs on PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- PTI protocol in use.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_pti_protocol()](pti#sl-rail-get-pti-protocol). 

###### sl_rail_config_pti

`sl_rail_status_t sl_rail_config_pti(sl_rail_handle_t rail_handle, const sl_rail_pti_config_t *p_pti_config)`

**Description:** Configure PTI pin locations, serial protocols, and baud rates.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|const [sl_rail_pti_config_t](sl-rail-pti-config-t) *|[in]|p_pti_config|A non-NULL pointer to the PTI configuration structure to use.|

**Returns**

- Status code indicating success of the function call.

When this function is called prior to the first [sl_rail_init()](general#sl-rail-init) call, the PTI configuration is recorded but activation is deferred to [sl_rail_init()](general#sl-rail-init). When called subsequent to [sl_rail_init()](general#sl-rail-init), the radio should be off (idle) and the PTI configuration is recorded and put into effect immediately unless [sl_rail_enable_pti()](pti#sl-rail-enable-pti) had been called just prior to disable PTI, in which case activation is deferred to when [sl_rail_enable_pti()](pti#sl-rail-enable-pti) is subsequently called to enable PTI.

Only one PTI configuration can be active on a radio, regardless of the number of protocols (unless the application updates the configuration upon a protocol switch – RAIL does not save the configuration in a protocol RAIL instance).

**Note**

- On EFR32 platforms GPIO configuration must be unlocked (see GPIO->LOCK register) to configure or use PTI.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_get_pti_config

`sl_rail_status_t sl_rail_get_pti_config(sl_rail_handle_t rail_handle, sl_rail_pti_config_t *p_pti_config)`

**Description:** Get the currently-active PTI configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_pti_config_t](sl-rail-pti-config-t) *|[out]|p_pti_config|A non-NULL pointer to the configuration structure to be filled in with the active PTI configuration on the radio.|

**Returns**

- Status code indicating success of the function call.

Although most combinations of configurations can be set, it is safest to call this method after configuration to confirm which values were actually set. This function always returns the active PTI configuration on the radio regardless of the active protocol. 

###### sl_rail_enable_pti

`sl_rail_status_t sl_rail_enable_pti(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable Packet Trace Interface (PTI) output of packet data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|bool|[in]|enable|PTI is enabled if true; disabled if false.|

**Returns**

- Status code indicating success of the function call.

Similarly to having only one PTI configuration per radio, PTI can only be enabled or disabled for all protocols. It cannot be individually set to enabled and disabled per protocol (unless the application switches it when the protocol switches – RAIL does not save this state in a protocol RAIL instance).

PTI should be enabled or disabled only when the radio is off (idle).

**Note**

- The first call to [sl_rail_init()](general#sl-rail-init) implicitly enables PTI, but it won't take effect unless or until [sl_rail_config_pti()](pti#sl-rail-config-pti) has been called with a mode other than the default [SL_RAIL_PTI_MODE_DISABLED](pti#sl-rail-pti-mode-disabled).

**Warnings**

- On EFR32 platforms GPIO configuration must be unlocked (see GPIO->LOCK register) to configure or use PTI, otherwise a fault or assert might occur. If GPIO configuration locking is desired, PTI must be disabled beforehand either with this function or with [sl_rail_config_pti()](pti#sl-rail-config-pti) using [SL_RAIL_PTI_MODE_DISABLED](pti#sl-rail-pti-mode-disabled).
- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_set_pti_protocol

`sl_rail_status_t sl_rail_set_pti_protocol(sl_rail_handle_t rail_handle, sl_rail_pti_protocol_t protocol)`

**Description:** Set a protocol that RAIL outputs on PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_pti_protocol_t](pti#sl-rail-pti-protocol-t)|[in]|protocol|The enumeration representing which protocol the app is using.|

**Returns**

- Status code indicating success of the function call.

The protocol is output via PTI for each packet. Before any protocol is set, the default value is [SL_RAIL_PTI_PROTOCOL_CUSTOM](pti#sl-rail-pti-protocol-custom). Use one of the enumeration values so that the Network Analyzer can decode the packet.

**Note**

- This function cannot be called unless the radio is currently in the [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle) or [SL_RAIL_RF_STATE_INACTIVE](state-transitions#sl-rail-rf-state-inactive) states. For this reason, call this function early on before starting radio operations and not changed later.

###### sl_rail_get_pti_protocol

`sl_rail_pti_protocol_t sl_rail_get_pti_protocol(sl_rail_handle_t rail_handle)`

**Description:** Get the protocol that RAIL outputs on PTI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- PTI protocol in use.

A configuration for PTI. 

**Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t](sl-rail-pti-config-t). 

###### Public Attributes

###### mode (heading level 7)

```
RAIL_PtiMode_t RAIL_PtiConfig_t::mode
```

**Description:** Packet Trace mode (UART or SPI).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::mode](sl-rail-pti-config-t#mode).

###### baud (heading level 7)

```
uint32_t RAIL_PtiConfig_t::baud
```

**Description:** Output baudrate for PTI in Hz.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::baud](sl-rail-pti-config-t#baud).

###### doutLoc (heading level 7)

```
uint8_t RAIL_PtiConfig_t::doutLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_pti_config_t::reserved_0](sl-rail-pti-config-t#reserved-0).

###### doutPort (heading level 7)

```
uint8_t RAIL_PtiConfig_t::doutPort
```

**Description:** Data output (DOUT) GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dout_port](sl-rail-pti-config-t#dout-port).

###### doutPin (heading level 7)

```
uint8_t RAIL_PtiConfig_t::doutPin
```

**Description:** Data output (DOUT) GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dout_pin](sl-rail-pti-config-t#dout-pin).

###### dclkLoc (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dclkLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_pti_config_t::reserved_1](sl-rail-pti-config-t#reserved-1).

###### dclkPort (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dclkPort
```

**Description:** Data clock (DCLK) GPIO port.

**Details:** Only used in SPI mode.

**Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dclk_port](sl-rail-pti-config-t#dclk-port).

###### dclkPin (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dclkPin
```

**Description:** Data clock (DCLK) GPIO pin.

**Details:** Only used in SPI mode.

**Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dclk_pin](sl-rail-pti-config-t#dclk-pin).

###### dframeLoc (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dframeLoc
```

**Details:** **Deprecated**No longer used (ignored); see [sl_rail_pti_config_t::reserved_2](sl-rail-pti-config-t#reserved-2).

###### dframePort (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dframePort
```

**Description:** Data frame (DFRAME) GPIO port.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dframe_port](sl-rail-pti-config-t#dframe-port).

###### dframePin (heading level 7)

```
uint8_t RAIL_PtiConfig_t::dframePin
```

**Description:** Data frame (DFRAME) GPIO pin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_pti_config_t::dframe_pin](sl-rail-pti-config-t#dframe-pin).

A configuration for PTI. 

###### Public Attributes

###### mode (heading level 7)

```
sl_rail_pti_mode_t sl_rail_pti_config_t::mode
```

**Description:** Packet Trace mode (UART or SPI).

###### baud (heading level 7)

```
uint32_t sl_rail_pti_config_t::baud
```

**Description:** Output baudrate for PTI in Hz.

###### reserved_0 (heading level 7)

```
uint8_t sl_rail_pti_config_t::reserved_0
```

**Description:** Reserved for future use.

###### dout_port (heading level 7)

```
uint8_t sl_rail_pti_config_t::dout_port
```

**Description:** Data output (DOUT) GPIO port.

###### dout_pin (heading level 7)

```
uint8_t sl_rail_pti_config_t::dout_pin
```

**Description:** Data output (DOUT) GPIO pin.

###### reserved_1 (heading level 7)

```
uint8_t sl_rail_pti_config_t::reserved_1
```

**Description:** Reserved for future use.

###### dclk_port (heading level 7)

```
uint8_t sl_rail_pti_config_t::dclk_port
```

**Description:** Data clock (DCLK) GPIO port.

**Details:** Only used in SPI mode.

###### dclk_pin (heading level 7)

```
uint8_t sl_rail_pti_config_t::dclk_pin
```

**Description:** Data clock (DCLK) GPIO pin.

**Details:** Only used in SPI mode.

###### reserved_2 (heading level 7)

```
uint8_t sl_rail_pti_config_t::reserved_2
```

**Description:** Reserved for future use.

###### dframe_port (heading level 7)

```
uint8_t sl_rail_pti_config_t::dframe_port
```

**Description:** Data frame (DFRAME) GPIO port.

###### dframe_pin (heading level 7)

```
uint8_t sl_rail_pti_config_t::dframe_pin
```

**Description:** Data frame (DFRAME) GPIO pin.

#### Protocol-specific

Protocol-Specific RAIL APIs. 

##### Modules

[BLE](ble)

[IEEE 802.15.4](ieee802-15-4)

[Multi-Level Frequency Modulation](mfm)

[Sidewalk Radio Configurations](sidewalk-phy)

[Wireless M-Bus](wmbus)

[Z-Wave](z-wave)

##### Sidewalk Radio Configurations

Radio configurations for the RAIL Sidewalk Accelerator. 

These radio configurations are used to configure Sidewalk when a function such as [RAIL_Sidewalk_ConfigPhy2GFSK50kbps()](sidewalk-phy#rail-sidewalk-config-phy2-gfsk50kbps) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overriden to account for those settings.

These radio configurations are used to configure Sidewalk when a function such as [sl_rail_sidewalk_config_phy_2gfsk_50_kbps()](sidewalk-phy#sl-rail-sidewalk-config-phy-2gfsk-50-kbps) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overriden to account for those settings. 

###### Enumerations

###### sl_rail_sidewalk_phy_t (heading level 7)

```
enum sl_rail_sidewalk_phy_t {
    SL_RAIL_SIDEWALK_PHY_2GFSK_50_KBPS = 0u
}
```

**Description:**

The Sidewalk PHY identifier (aka PTI radio configuration id).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_SIDEWALK_PHY_2GFSK_50_KBPS|Use the 2GFSK 50 kbps Sidewalk PHY.|

###### Variables

###### RAIL_Sidewalk_Phy2GFSK50kbps (heading level 7)

```
const RAIL_ChannelConfig_t* const RAIL_Sidewalk_Phy2GFSK50kbps
```

**Description:** Default PHY to use for Sidewalk 2GFSK 50kbps.

**Details:** Will be NULL if [RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#rail-supports-protocol-sidewalk-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_sidewalk_phy_2gfsk_50_kbps](sidewalk-phy#sl-rail-sidewalk-phy-2gfsk-50-kbps).

###### sl_rail_sidewalk_phy_2gfsk_50_kbps (heading level 7)

```
const sl_rail_channel_config_t* const sl_rail_sidewalk_phy_2gfsk_50_kbps
```

**Description:** Default PHY to use for Sidewalk 2GFSK 50kbps.

**Details:** Will be NULL if [SL_RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#sl-rail-supports-protocol-sidewalk-1) is 0.

###### Functions

###### RAIL_Sidewalk_ConfigPhy2GFSK50kbps (heading level 7)

`RAIL_Status_t RAIL_Sidewalk_ConfigPhy2GFSK50kbps(RAIL_Handle_t railHandle)`

**Description:** Switch to the 2GFSK 50 kbps Sidewalk PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch to the 2GFSK 50 kbps Sidewalk PHY.

**Note**

- The Sidewalk PHY is supported only on some parts. The preprocessor symbol [RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#rail-supports-protocol-sidewalk-1) and the runtime function [RAIL_SupportsProtocolSidewalk()](features#rail-supports-protocol-sidewalk) may be used to test for support of the Sidewalk PHY.

**Deprecated**RAIL 2.x synonym of [sl_rail_sidewalk_config_phy_2gfsk_50_kbps()](sidewalk-phy#sl-rail-sidewalk-config-phy-2gfsk-50-kbps). 

###### sl_rail_sidewalk_config_phy_2gfsk_50_kbps (heading level 7)

`sl_rail_status_t sl_rail_sidewalk_config_phy_2gfsk_50_kbps(sl_rail_handle_t rail_handle)`

**Description:** Switch to the 2GFSK 50 kbps Sidewalk PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch to the 2GFSK 50 kbps Sidewalk PHY.

**Note**

- The Sidewalk PHY is supported only on some parts. The preprocessor symbol [SL_RAIL_SUPPORTS_PROTOCOL_SIDEWALK](features#sl-rail-supports-protocol-sidewalk-1) and the runtime function [sl_rail_supports_protocol_sidewalk()](features#sl-rail-supports-protocol-sidewalk) may be used to test for support of the Sidewalk PHY.

##### Wireless M-Bus

Wireless M-Bus (WMBUS) configuration. 

###### Enumerations

###### RAIL_WMBUS_Phy_t (heading level 7)

```
enum RAIL_WMBUS_Phy_t {
    RAIL_WMBUS_ModeTFrameA = 0U
    RAIL_WMBUS_ModeCFrameA = 2U
    RAIL_WMBUS_ModeCFrameB = 3U
}
```

**Description:**

The RX variant of the WMBUS T+C PHY.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_wmbus_phy_t](wmbus#sl-rail-wmbus-phy-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_WMBUS_ModeTFrameA|[RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) indicating a mode T frame A packet.|
|RAIL_WMBUS_ModeCFrameA|[RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) indicating a mode C frame A packet.|
|RAIL_WMBUS_ModeCFrameB|[RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) indicating a mode C frame B packet.|

###### sl_rail_wmbus_phy_t (heading level 7)

```
enum sl_rail_wmbus_phy_t {
    SL_RAIL_WMBUS_MODE_T_FRAME_A = 0U
    SL_RAIL_WMBUS_MODE_C_FRAME_A = 2U
    SL_RAIL_WMBUS_MODE_C_FRAME_B = 3U
}
```

**Description:**

The RX variant of the WMBUS T+C PHY.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_WMBUS_MODE_T_FRAME_A|[sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) indicating a mode T frame A packet.|
|SL_RAIL_WMBUS_MODE_C_FRAME_A|[sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) indicating a mode C frame A packet.|
|SL_RAIL_WMBUS_MODE_C_FRAME_B|[sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) indicating a mode C frame B packet.|

###### Functions

###### RAIL_WMBUS_Config (heading level 7)

`RAIL_Status_t RAIL_WMBUS_Config(RAIL_Handle_t railHandle, bool enableSimultaneousTCRx)`

**Description:** Configure WMBUS simultaneous M2O RX of T and C modes feature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enableSimultaneousTCRx|true to enable WMBUS simultaneous M2O RX of T and C modes.|

**Returns**

- Status code indicating success of the function call.

If simultaneous M2O RX of T and C modes is enabled, when PHY_wMbus_ModeTC_M2O_100k_frameA is loaded, mode T Frame A and mode C frame A/B can be received. The mode and frame type of the last received packet is available in [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id).

**Note**

- This WMBUS feature is supported only on some parts. The preprocessor symbol [RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#rail-wmbus-supports-simultaneous-t-c-rx) and the runtime function [RAIL_WMBUS_SupportsSimultaneousTCRx()](features#rail-wmbus-supports-simultaneous-tc-rx) may be used to test for support.

**Deprecated**RAIL 2.x synonym of [sl_rail_wmbus_config()](wmbus#sl-rail-wmbus-config). 

###### sl_rail_wmbus_config (heading level 7)

`sl_rail_status_t sl_rail_wmbus_config(sl_rail_handle_t rail_handle, bool enable_simultaneous_t_c_rx)`

**Description:** Configure WMBUS simultaneous M2O RX of T and C modes feature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable_simultaneous_t_c_rx|true to enable WMBUS simultaneous M2O RX of T and C modes.|

**Returns**

- Status code indicating success of the function call.

If simultaneous M2O RX of T and C modes is enabled, when PHY_wMbus_ModeTC_M2O_100k_frameA is loaded, mode T Frame A and mode C frame A/B can be received. The mode and frame type of the last received packet is available in [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id).

**Note**

- This WMBUS feature is supported only on some parts. The preprocessor symbol [SL_RAIL_WMBUS_SUPPORTS_SIMULTANEOUS_T_C_RX](features#sl-rail-wmbus-supports-simultaneous-t-c-rx-1) and the runtime function [sl_rail_wmbus_supports_simultaneous_t_c_rx()](features#sl-rail-wmbus-supports-simultaneous-t-c-rx) may be used to test for support.

##### BLE

Accelerator routines for Bluetooth Low Energy (BLE). 

The APIs in this module configure the radio for BLE operation and provide additional helper routines necessary for normal BLE send/receive that aren't available directly in RAIL. RAIL APIs should be used to set up the application. However, [RAIL_ConfigChannels()](radio-configuration#rail-config-channels) should not be called to set up the PHY. Instead, RAIL_BLE_Config* APIs should be used to set up the 1 Mbps, 2 Mbps, or Coded PHY configurations needed by the application. These APIs will configure the hardware and also configure the set of valid BLE channels.

To implement a standard BLE link layer, you will also need to handle tight turnaround times and send packets at specific instants. This can all be managed through general RAIL functions, such as [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx), [RAIL_ScheduleRx()](receive#rail-schedule-rx), and [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing). See RAIL APIs for more useful functions.

A simple example to set up the application to be in BLE mode is shown below. Note that this will put the radio on the first advertising channel with the advertising Access Address. In any full-featured BLE application you will need to use the [RAIL_BLE_ConfigChannelRadioParams()](ble#rail-ble-config-channel-radio-params) function to change the sync word and other parameters as needed based on your connection. 

```c
// RAIL handle set at initialization time.
static RAIL_Handle_t gRailHandle = NULL;

static void radioEventHandler(RAIL_Handle_t railHandle,
                              RAIL_Events_t events)
{
  // ... handle RAIL events, e.g., receive and transmit completion
}

// Set the radio to receive on the first BLE advertising channel.
void bleAdvertiseEnable(void)
{
  RAIL_Config_t railCfg = {
    .eventsCallback = &radioEventHandler,
  };

  // Initializes the RAIL library and any internal state it requires.
  gRailHandle = RAIL_Init(&railCfg, NULL);

  // Calls the BLE initialization function to load the right radio configuration.
  RAIL_BLE_Init(gRailHandle);

  // Always choose the Viterbi PHY configuration if available on your chip
  // for performance reasons.
  RAIL_BLE_ConfigPhy1MbpsViterbi(gRailHandle);

  // Configures us for the first advertising channel (Physical: 0, Logical: 37).
  // The CRC init value and Access Address come from the BLE specification.
  RAIL_BLE_ConfigChannelRadioParams(gRailHandle,
                                    0x555555,
                                    0x8E89BED6,
                                    37,
                                    false);

  // Starts receiving on physical channel 0 (logical channel 37).
  RAIL_StartRx(gRailHandle, 0, NULL);
 }

```

The APIs in this module configure the radio for BLE operation and provide additional helper routines necessary for normal BLE send/receive that aren't available directly in RAIL. RAIL APIs should be used to set up the application. However, [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) should not be called to set up the PHY. Instead, sl_rail_ble_coding* APIs should be used to set up the 1 Mbps, 2 Mbps, or Coded PHY configurations needed by the application. These APIs will configure the hardware and also configure the set of valid BLE channels.

To implement a standard BLE link layer, you will also need to handle tight turnaround times and send packets at specific instants. This can all be managed through general RAIL functions, such as [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx), [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx), and [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing). See RAIL APIs for more useful functions.

A simple example to set up the application to be in BLE mode is shown below. Note that this will put the radio on the first advertising channel with the advertising Access Address. In any full-featured BLE application you will need to use the [sl_rail_ble_config_channel_radio_params()](ble#sl-rail-ble-config-channel-radio-params) function to change the sync word and other parameters as needed based on your connection. 

```c
// RAIL handle set at initialization time.
static sl_rail_handle_t g_rail_handle = SL_RAIL_EFR32_HANDLE;

#define BLE_RX_PACKET_QUEUE_ENTRIES 16
#define BLE_FIFO_BYTES 512 // Handle max-sized BLE packets, AoX

static sl_rail_packet_queue_t g_rx_packet_queue[BLE_RX_PACKET_QUEUE_ENTRIES];
static SL_RAIL_DECLARE_FIFO_BUFFER(g_rx_fifo_buffer, BLE_FIFO_BYTES);
static SL_RAIL_DECLARE_FIFO_BUFFER(g_tx_fifo_buffer, BLE_FIFO_BYTES);

static void radio_event_handler(sl_rail_handle_t rail_handle,
                                sl_rail_events_t events)
{
  // ... handle RAIL events, e.g., receive and transmit completion
}

// Set the radio to receive on the first BLE advertising channel.
void ble_advertise_enable(void)
{
  sl_rail_config_t rail_config = {
    .events_callback         = &radio_event_handler,
    .rx_packet_queue_entries = BLE_RX_PACKET_QUEUE_ENTRIES,
    .rx_fifo_bytes           = sizeof(g_rx_fifo_buffer),
    .tx_fifo_bytes           = sizeof(g_tx_fifo_buffer),
    .tx_fifo_init_bytes      = 0,
    .rx_packet_queue         = g_rx_packet_queue,
    .rx_fifo_buffer          = g_rx_fifo_buffer,
    .tx_fifo_buffer          = g_tx_fifo_buffer,
  };
  sl_rail_status_t status;

  // Initializes the RAIL library and any internal state it requires.
  status = sl_rail_init(&g_rail_handle, &rail_config, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Calls the BLE initialization function to load the right radio configuration.
  status = sl_rail_ble_init(g_rail_handle);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  status = sl_rail_ble_config_phy_1_mbps(g_rail_handle);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Configures us for the first advertising channel (Physical: 0, Logical: 37).
  // The CRC init value and Access Address come from the BLE specification.
  sl_rail_ble_state_t ble_params = {
    .crc_init = 0x555555,
    .access_address = 0x0x8E89BED6,
    .logical_channel = 37,
    .disable_whitening = false,
  };
  status = sl_rail_ble_config_channel_radio_params(g_rail_handle, &ble_params);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Starts receiving on physical channel 0 (logical channel 37).
  status = sl_rail_start_rx(g_rail_handle, 0, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
 }

```

###### Modules

[RAIL_BLE_State_t](rail-ble-state-t)

[sl_rail_ble_state_t](sl-rail-ble-state-t)

[Angle of Arrival/Departure](ao-x)

[BLE Radio Configurations](ble-phy)

[BLE TX Channel Hopping](bletx2-tx)

###### Enumerations

###### RAIL_BLE_Coding_t (heading level 7)

```
enum RAIL_BLE_Coding_t {
    RAIL_BLE_Coding_125kbps = 0
    RAIL_BLE_Coding_125kbps_DSA = 1
    RAIL_BLE_Coding_500kbps = 2
    RAIL_BLE_Coding_500kbps_DSA = 3
}
```

**Description:**

The variant of the BLE Coded PHY.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_coding_t](ble#sl-rail-ble-coding-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_BLE_Coding_125kbps|Enables the 125 kbps variant of the BLE Coded PHY.|
|RAIL_BLE_Coding_125kbps_DSA|**Deprecated**This deprecated RAIL 2.x enum value has been eliminated in RAIL 3.|
|RAIL_BLE_Coding_500kbps|Enables the 500 kbps variant of the BLE Coded PHY.|
|RAIL_BLE_Coding_500kbps_DSA|**Deprecated**This deprecated RAIL 2.x enum value has been eliminated in RAIL 3.|

###### RAIL_BLE_Phy_t (heading level 7)

```
enum RAIL_BLE_Phy_t {
    RAIL_BLE_1Mbps = 0U
    RAIL_BLE_2Mbps = 1U
    RAIL_BLE_Coded125kbps = 2U
    RAIL_BLE_Coded500kbps = 3U
    RAIL_BLE_Simulscan = 4U
    RAIL_BLE_AOX2mbps = 5U
    RAIL_BLE_Quuppa1Mbps = 6U
    RAIL_BLE_CS1Mbps = 7U
    RAIL_BLE_CS2Mbps = 8U
}
```

**Description:**

The variant of the BLE PHY.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_t](ble#sl-rail-ble-phy-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_BLE_1Mbps|BLE 1 Mbps PHY.|
|RAIL_BLE_2Mbps|BLE 2 Mbps PHY.|
|RAIL_BLE_Coded125kbps|BLE 125 kbps coded PHY.|
|RAIL_BLE_Coded500kbps|BLE 500 kbps coded PHY.|
|RAIL_BLE_Simulscan|BLE Simulscan PHY.|
|RAIL_BLE_AOX2mbps|BLE 2 Mbps PHY with AoX functionality.|
|RAIL_BLE_Quuppa1Mbps|BLE 1 Mbps Quuppa PHY.|
|RAIL_BLE_CS1Mbps|BLE 1 Mbps PHY with CS.|
|RAIL_BLE_CS2Mbps|BLE 2 Mbps PHY with CS.|

###### RAIL_BLE_SignalIdentifierMode_t (heading level 7)

```
enum RAIL_BLE_SignalIdentifierMode_t {
    RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE = 0
    RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1MBPS = 1
    RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2MBPS = 2
}
```

**Description:**

Available Signal Identifier modes.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_signal_identifier_mode_t](ble#sl-rail-ble-signal-identifier-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE|Disable signal detection mode.|
|RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1MBPS|BLE 1 Mbps (GFSK) detection mode.|
|RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2MBPS|BLE 2 Mbps (GFSK) detection mode.|

###### sl_rail_ble_coding_t (heading level 7)

```
enum sl_rail_ble_coding_t {
    SL_RAIL_BLE_CODING_125_KBPS = 0u
    SL_RAIL_BLE_CODING_500_KBPS = 2u
}
```

**Description:**

The variant of the BLE Coded PHY.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_BLE_CODING_125_KBPS|Enables the 125 kbps variant of the BLE Coded PHY.|
|SL_RAIL_BLE_CODING_500_KBPS|Enables the 500 kbps variant of the BLE Coded PHY.|

###### sl_rail_ble_phy_t (heading level 7)

```
enum sl_rail_ble_phy_t {
    SL_RAIL_BLE_PHY_1_MBPS = 0u
    SL_RAIL_BLE_PHY_2_MBPS = 1u
    SL_RAIL_BLE_PHY_CODED_125_KBPS = 2u
    SL_RAIL_BLE_PHY_CODED_500_KBPS = 3u
    SL_RAIL_BLE_PHY_SIMULSCAN = 4u
    SL_RAIL_BLE_PHY_AOX_2_MBPS = 5u
    SL_RAIL_BLE_PHY_QUUPPA_1_MBPS = 6u
    SL_RAIL_BLE_PHY_CS_1_MBPS = 7u
    SL_RAIL_BLE_PHY_CS_2_MBPS = 8u
    SL_RAIL_BLE_PHY_UNDEFINED = 0xFFu
}
```

**Description:**

The BLE PHY identifier (aka PTI radio configuration id).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_BLE_PHY_1_MBPS|BLE 1 Mbps PHY.|
|SL_RAIL_BLE_PHY_2_MBPS|BLE 2 Mbps PHY.|
|SL_RAIL_BLE_PHY_CODED_125_KBPS|BLE 125 kbps coded PHY.|
|SL_RAIL_BLE_PHY_CODED_500_KBPS|BLE 500 kbps coded PHY.|
|SL_RAIL_BLE_PHY_SIMULSCAN|BLE Simulscan PHY.|
|SL_RAIL_BLE_PHY_AOX_2_MBPS|BLE 2 Mbps PHY with AoX functionality.|
|SL_RAIL_BLE_PHY_QUUPPA_1_MBPS|BLE 1 Mbps Quuppa PHY.|
|SL_RAIL_BLE_PHY_CS_1_MBPS|BLE 1 Mbps PHY with CS.|
|SL_RAIL_BLE_PHY_CS_2_MBPS|BLE 2 Mbps PHY with CS.|
|SL_RAIL_BLE_PHY_UNDEFINED|BLE PHY undefined.|

###### sl_rail_ble_signal_identifier_mode_t (heading level 7)

```
enum sl_rail_ble_signal_identifier_mode_t {
    SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE = 0u
    SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1_MBPS = 1u
    SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2_MBPS = 2u
    SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1_MBPS_WITH_AGC_RESET = 3u
    SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2_MBPS_WITH_AGC_RESET = 4u
}
```

**Description:**

Available Signal Identifier modes.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_DISABLE|Disable signal detection mode.|
|SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1_MBPS|BLE 1 Mbps (GFSK) detection mode with SI block reset on GPIO falling edge (via PRS).|
|SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2_MBPS|BLE 2 Mbps (GFSK) detection mode with SI block reset on GPIO falling edge (via PRS).|
|SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_1_MBPS_WITH_AGC_RESET|BLE 1 Mbps (GFSK) detection mode with SI block reset on AGC negative step.|
|SL_RAIL_BLE_SIGNAL_IDENTIFIER_MODE_2_MBPS_WITH_AGC_RESET|BLE 2 Mbps (GFSK) detection mod with SI block reset on AGC negative step.|

###### Functions

###### RAIL_BLE_Init (heading level 7)

`RAIL_Status_t RAIL_BLE_Init(RAIL_Handle_t railHandle)`

**Description:** Configure RAIL to run in BLE mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

This function changes your radio, channel configuration, and other parameters to match what is needed for BLE, initially establishing the BLE 1 Mbps PHY. To switch back to a default RAIL mode, call [RAIL_BLE_Deinit()](ble#rail-ble-deinit) first. This function will configure the protocol output on PTI to [RAIL_PTI_PROTOCOL_BLE](pti#rail-pti-protocol-ble).

**Note**

- BLE may not be enabled while Auto-ACKing is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_init()](ble#sl-rail-ble-init). 

###### RAIL_BLE_Deinit (heading level 7)

`RAIL_Status_t RAIL_BLE_Deinit(RAIL_Handle_t railHandle)`

**Description:** Take RAIL out of BLE mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

This function will undo some of the configuration that happens when you call [RAIL_BLE_Init()](ble#rail-ble-init). After this you can safely run your normal radio initialization code to use a non-BLE configuration. This function does **not** change back your radio or channel configurations so you must do this by manually reinitializing. This also resets the protocol output on PTI to [RAIL_PTI_PROTOCOL_CUSTOM](pti#rail-pti-protocol-custom).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_deinit()](ble#sl-rail-ble-deinit). 

###### RAIL_BLE_IsEnabled (heading level 7)

`bool RAIL_BLE_IsEnabled(RAIL_Handle_t railHandle)`

**Description:** Determine whether BLE mode is enabled or not.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- true if BLE mode is enabled and false otherwise.

This function returns the current status of RAIL's BLE mode. It is enabled by a call to [RAIL_BLE_Init()](ble#rail-ble-init) and disabled by a call to [RAIL_BLE_Deinit()](ble#rail-ble-deinit).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_is_enabled()](ble#sl-rail-ble-is-enabled). 

###### RAIL_BLE_ConfigPhyQuuppa (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhyQuuppa(RAIL_Handle_t railHandle)`

**Description:** Switch to the 1 Mbps Quuppa PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

You can use this function to switch to the Quuppa PHY.

**Note**

- Not all chips support the 1 Mbps Quuppa PHY. This API should return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if unsupported by the hardware we're building for.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_phy_quuppa()](ble#sl-rail-ble-config-phy-quuppa). 

###### RAIL_BLE_ConfigPhy1MbpsViterbi (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhy1MbpsViterbi(RAIL_Handle_t railHandle)`

**Description:** Switch to the Viterbi 1 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to the default BLE 1 Mbps PHY if you have switched to the 2 Mbps or another configuration. You may only call this function after initializing BLE and while the radio is idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_phy_1_mbps()](ble#sl-rail-ble-config-phy-1-mbps). 

###### RAIL_BLE_ConfigPhy1Mbps (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhy1Mbps(RAIL_Handle_t railHandle)`

**Description:** Switch to the legacy non-Viterbi 1 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to the legacy BLE 1 Mbps PHY if you have switched to the 2 Mbps or another configuration. You may only call this function after initializing BLE and while the radio is idle.

**Deprecated**BLE non-Viterbi PHYs are no longer supported. Use [sl_rail_ble_config_phy_1_mbps()](ble#sl-rail-ble-config-phy-1-mbps) instead. 

###### RAIL_BLE_ConfigPhy2MbpsViterbi (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhy2MbpsViterbi(RAIL_Handle_t railHandle)`

**Description:** Switch to the Viterbi 2 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to the BLE 2 Mbps PHY from the default 1 Mbps option. You may only call this function after initializing BLE and while the radio is idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_phy_2_mbps()](ble#sl-rail-ble-config-phy-2-mbps). 

###### RAIL_BLE_ConfigPhy2Mbps (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhy2Mbps(RAIL_Handle_t railHandle)`

**Description:** Switch to the legacy non-Viterbi 2 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to legacy BLE 2 Mbps PHY from the default 1 Mbps option. You may only call this function after initializing BLE and while the radio is idle.

**Deprecated**BLE non-Viterbi PHYs are no longer supported. Use [sl_rail_ble_config_phy_2_mbps()](ble#sl-rail-ble-config-phy-2-mbps) instead. 

###### RAIL_BLE_ConfigPhyCoded (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhyCoded(RAIL_Handle_t railHandle, RAIL_BLE_Coding_t bleCoding)`

**Description:** Switch to the BLE Coded PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|
|[RAIL_BLE_Coding_t](ble#rail-ble-coding-t)|[in]|bleCoding|The [RAIL_BLE_Coding_t](ble#rail-ble-coding-t) to use|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to BLE Coded PHY from the default 1 Mbps option. You may only call this function after initializing BLE and while the radio is idle. When using a BLE Coded PHY, the [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) marks the coding of the received packet. A subPhyId of 0 marks a 500 kbps packet, and a subPhyId of 1 marks a 125 kbps packet.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_phy_coded()](ble#sl-rail-ble-config-phy-coded). 

###### RAIL_BLE_ConfigPhySimulscan (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigPhySimulscan(RAIL_Handle_t railHandle)`

**Description:** Switch to the Simulscan PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch to the BLE Simulscan PHY. You may only call this function after initializing BLE and while the radio is idle. When using Simulscan PHY, the [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) marks the coding of the received packet. A subPhyId of 0 marks a 500 kbps packet, a subPhyId of 1 marks a 125 kbps packet, and a subPhyId of 2 marks a 1 Mbps packet.

**Note**

- : The Simulscan PHY is supported only on some parts. The preprocessor symbol [RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#rail-ble-supports-simulscan-phy-1) and the runtime function [RAIL_BLE_SupportsSimulscanPhy()](features#rail-ble-supports-simulscan-phy) may be used to test for support of the Simulscan PHY.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_phy_simulscan()](ble#sl-rail-ble-config-phy-simulscan). 

###### RAIL_BLE_ConfigChannelRadioParams (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigChannelRadioParams(RAIL_Handle_t railHandle, uint32_t crcInit, uint32_t accessAddress, uint16_t channel, bool disableWhitening)`

**Description:** Change BLE radio parameters.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|
|uint32_t|[in]|crcInit|The value to use for CRC initialization.|
|uint32_t|[in]|accessAddress|The access address to use for the connection. The bits of this parameter are transmitted or received LSB first.|
|uint16_t|[in]|channel|The logical channel that you're changing to, which initializes the whitener if used.|
|bool|[in]|disableWhitening|This can turn off the whitening engine and is useful for sending BLE test mode packets that don't have this turned on.|

**Returns**

- Status code indicating success of the function call.

This function can be used to switch radio parameters on every connection and/or channel change. It is BLE-aware and will set the access address, preamble, CRC initialization value, and whitening configuration without requiring you to load a new radio configuration. This function should be called after switching to a particular BLE phy (1 Mbps, 2 Mbps, etc.) and not while the radio is active.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_config_channel_radio_params()](ble#sl-rail-ble-config-channel-radio-params) with different parameters. 

###### RAIL_BLE_PhySwitchToRx (heading level 7)

`RAIL_Status_t RAIL_BLE_PhySwitchToRx(RAIL_Handle_t railHandle, RAIL_BLE_Phy_t phy, uint16_t railChannel, RAIL_Time_t startRxTime, uint32_t crcInit, uint32_t accessAddress, uint16_t logicalChannel, bool disableWhitening)`

**Description:** Change the current BLE PHY and go into receive.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|
|[RAIL_BLE_Phy_t](ble#rail-ble-phy-t)|[in]|phy|Indicates which PHY to receive on.|
|uint16_t|[in]|railChannel|Which channel of the given PHY to receive on.|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|startRxTime|Absolute near-future RAIL time to enter RX.|
|uint32_t|[in]|crcInit|The value to use for CRC initialization.|
|uint32_t|[in]|accessAddress|The access address to use for the connection. The bits of this parameter are transmitted or received LSB first.|
|uint16_t|[in]|logicalChannel|The logical channel that you're changing to, which initializes the whitener if used.|
|bool|[in]|disableWhitening|This can turn off the whitening engine and is useful for sending BLE test mode packets that don't have this turned on.|

**Returns**

- Status code indicating success of the function call.

This function is used to implement auxiliary packet reception, as defined in the BLE specification. The radio will be put into IDLE, the PHY and channel will be changed, and then receive will be entered at the start time given. The new receive will have a timeout of 30 us, which means that this function should only be called if the offset unit is 30 us.

This function is extremely time-sensitive, and may only be called within the interrupt context of a [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) event.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_ble_phy_switch_to_rx()](ble#sl-rail-ble-phy-switch-to-rx) with different parameters. 

###### RAIL_BLE_ConfigSignalIdentifier (heading level 7)

`RAIL_Status_t RAIL_BLE_ConfigSignalIdentifier(RAIL_Handle_t railHandle, RAIL_BLE_SignalIdentifierMode_t signalIdentifierMode)`

**Description:** Configure and enable signal identifier for BLE signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_BLE_SignalIdentifierMode_t](ble#rail-ble-signal-identifier-mode-t)|[in]|signalIdentifierMode|Mode of signal identifier operation.|

**Returns**

- Status code indicating success of the function call.

This features allows detection of BLE signal on air based on the mode. This function must be called once before [RAIL_BLE_EnableSignalDetection](ble#rail-ble-enable-signal-detection) to configure and enable signal identifier.

To enable event for signal detection [RAIL_ConfigEvents()](events#rail-config-events) must be called for enabling [RAIL_EVENT_SIGNAL_DETECTED](events#rail-event-signal-detected).

This function is only supported by chips where [RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ble-supports-signal-identifier-1) and [RAIL_BLE_SupportsSignalIdentifier()](features#rail-ble-supports-signal-identifier) are true.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_signal_identifier()](ble#sl-rail-ble-config-signal-identifier). 

###### RAIL_BLE_EnableSignalDetection (heading level 7)

`RAIL_Status_t RAIL_BLE_EnableSignalDetection(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable or disable signal identifier interrupt for BLE signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Signal detection is enabled if true, disabled if false.|

**Returns**

- Status code indicating success of the function call.

[RAIL_BLE_ConfigSignalIdentifier()](ble#rail-ble-config-signal-identifier) must be called once before calling this function to configure and enable signal identifier. Once a signal is detected signal detection will be turned off and this function should be called to re-enable the signal detection without needing to call [RAIL_BLE_ConfigSignalIdentifier()](ble#rail-ble-config-signal-identifier) if the signal identifier is already configured and enabled.

This function is only supported by chips where [RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ble-supports-signal-identifier-1) and [RAIL_BLE_SupportsSignalIdentifier()](features#rail-ble-supports-signal-identifier) are true.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_enable_signal_detection()](ble#sl-rail-ble-enable-signal-detection). 

###### sl_rail_ble_init (heading level 7)

`sl_rail_status_t sl_rail_ble_init(sl_rail_handle_t rail_handle)`

**Description:** Configure RAIL to run in BLE mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function changes your radio, channel configuration, and other parameters to match what is needed for BLE, initially establishing the BLE 1 Mbps PHY. To switch back to a default RAIL mode, call [sl_rail_ble_deinit()](ble#sl-rail-ble-deinit) first. This function will configure the protocol output on PTI to [SL_RAIL_PTI_PROTOCOL_BLE](pti#sl-rail-pti-protocol-ble).

**Note**

- BLE may not be enabled while Auto-ACKing is enabled.

###### sl_rail_ble_deinit (heading level 7)

`sl_rail_status_t sl_rail_ble_deinit(sl_rail_handle_t rail_handle)`

**Description:** Take RAIL out of BLE mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function will undo some of the configuration that happens when you call [sl_rail_ble_init()](ble#sl-rail-ble-init). After this you can safely run your normal radio initialization code to use a non-BLE configuration. This function does **not** change back your radio or channel configurations so you must do this by manually reinitializing. This also resets the protocol output on PTI to [SL_RAIL_PTI_PROTOCOL_CUSTOM](pti#sl-rail-pti-protocol-custom). 

###### sl_rail_ble_is_enabled (heading level 7)

`bool sl_rail_ble_is_enabled(sl_rail_handle_t rail_handle)`

**Description:** Determine whether BLE mode is enabled or not.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if BLE mode is enabled and false otherwise.

This function returns the current status of RAIL's BLE mode. It is enabled by a call to [sl_rail_ble_init()](ble#sl-rail-ble-init) and disabled by a call to [sl_rail_ble_deinit()](ble#sl-rail-ble-deinit). 

###### sl_rail_ble_config_channels (heading level 7)

`sl_rail_status_t sl_rail_ble_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_channel_config, sl_rail_ble_phy_t phy_id)`

**Description:** Load BLE channel config.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_channel_config_t](sl-rail-channel-config-t) *|[in]|p_channel_config|A pointer to the channel configuration structure.|
|[sl_rail_ble_phy_t](ble#sl-rail-ble-phy-t)|[in]|phy_id|The PHY ID to configure.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_ble_config_phy_quuppa (heading level 7)

`sl_rail_status_t sl_rail_ble_config_phy_quuppa(sl_rail_handle_t rail_handle)`

**Description:** Switch to the 1 Mbps Quuppa PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

You can use this function to switch to the Quuppa PHY.

**Note**

- Not all chips support the 1 Mbps Quuppa PHY. This API should return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if unsupported by the hardware we're building for.

###### sl_rail_ble_config_phy_1_mbps (heading level 7)

`sl_rail_status_t sl_rail_ble_config_phy_1_mbps(sl_rail_handle_t rail_handle)`

**Description:** Switch to the 1 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to the default BLE 1 Mbps PHY if you have switched to the 2 Mbps or another configuration. You may only call this function after initializing BLE and while the radio is idle. 

###### sl_rail_ble_config_phy_2_mbps (heading level 7)

`sl_rail_status_t sl_rail_ble_config_phy_2_mbps(sl_rail_handle_t rail_handle)`

**Description:** Switch to the 2 Mbps BLE PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to the BLE 2 Mbps PHY from the default 1 Mbps option. You may only call this function after initializing BLE and while the radio is idle. 

###### sl_rail_ble_config_phy_coded (heading level 7)

`sl_rail_status_t sl_rail_ble_config_phy_coded(sl_rail_handle_t rail_handle, sl_rail_ble_coding_t ble_coding)`

**Description:** Switch to the BLE Coded PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ble_coding_t](ble#sl-rail-ble-coding-t)|[in]|ble_coding|The [sl_rail_ble_coding_t](ble#sl-rail-ble-coding-t) to use.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch back to BLE Coded PHY from the default 1 Mbps option. You may only call this function after initializing BLE and while the radio is idle. When using a BLE Coded PHY, the [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) marks the coding of the received packet. A sub_phy_id of 0 marks a 500 kbps packet, and a sub_phy_id of 1 marks a 125 kbps packet. 

###### sl_rail_ble_config_phy_simulscan (heading level 7)

`sl_rail_status_t sl_rail_ble_config_phy_simulscan(sl_rail_handle_t rail_handle)`

**Description:** Switch to the Simulscan PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Use this function to switch to the BLE Simulscan PHY. You may only call this function after initializing BLE and while the radio is idle. When using Simulscan PHY, the [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) marks the coding of the received packet. A sub_phy_id of 0 marks a 500 kbps packet, a sub_phy_id of 1 marks a 125 kbps packet, and a sub_phy_id of 2 marks a 1 Mbps packet.

**Note**

- : The Simulscan PHY is supported only on some parts. The preprocessor symbol [SL_RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#sl-rail-ble-supports-simulscan-phy-1) and the runtime function [sl_rail_ble_supports_simulscan_phy()](features#sl-rail-ble-supports-simulscan-phy) may be used to test for support of the Simulscan PHY.

###### sl_rail_ble_config_channel_radio_params (heading level 7)

`sl_rail_status_t sl_rail_ble_config_channel_radio_params(sl_rail_handle_t rail_handle, const sl_rail_ble_state_t *p_params)`

**Description:** Change BLE radio parameters.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ble_state_t](sl-rail-ble-state-t) *|[in]|p_params|A non-NULL pointer to a [sl_rail_ble_state_t](sl-rail-ble-state-t) structure specifying the BLE radio state parameters to use.|

**Returns**

- Status code indicating success of the function call.

This function can be used to switch radio parameters on every connection and/or channel change. It is BLE-aware and will set the access address, preamble, CRC initialization value, and whitening configuration without requiring you to load a new radio configuration. This function should be called after switching to a particular BLE phy (1 Mbps, 2 Mbps, etc.) and not while the radio is active. 

###### sl_rail_ble_phy_switch_to_rx (heading level 7)

`sl_rail_status_t sl_rail_ble_phy_switch_to_rx(sl_rail_handle_t rail_handle, sl_rail_ble_phy_t phy, uint16_t rail_channel, sl_rail_time_t start_rx_time, const sl_rail_ble_state_t *p_params)`

**Description:** Change the current BLE PHY and go into receive.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ble_phy_t](ble#sl-rail-ble-phy-t)|[in]|phy|Indicates which PHY to receive on.|
|uint16_t|[in]|rail_channel|Which channel of the given PHY to receive on.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|start_rx_time|Absolute near-future RAIL time to enter RX.|
|const [sl_rail_ble_state_t](sl-rail-ble-state-t) *|[in]|p_params|A non-NULL pointer to the parameters for this operation. [sl_rail_ble_state_t::logical_channel](sl-rail-ble-state-t#logical-channel) should be the logical channel that you're changing to, which initializes the whitener if used.|

**Returns**

- Status code indicating success of the function call.

This function is used to implement auxiliary packet reception, as defined in the BLE specification. The radio will be put into IDLE, the PHY and channel will be changed, and then receive will be entered at the start time given. The new receive will have a timeout of 30 us, which means that this function should only be called if the offset unit is 30 us.

This function is extremely time-sensitive, and may only be called within the interrupt context of a [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) event. 

###### sl_rail_ble_config_signal_identifier (heading level 7)

`sl_rail_status_t sl_rail_ble_config_signal_identifier(sl_rail_handle_t rail_handle, sl_rail_ble_signal_identifier_mode_t signal_identifier_mode)`

**Description:** Configure and enable signal identifier for BLE signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ble_signal_identifier_mode_t](ble#sl-rail-ble-signal-identifier-mode-t)|[in]|signal_identifier_mode|Mode of signal identifier operation.|

**Returns**

- Status code indicating success of the function call.

This features allows detection of BLE signal on air based on the mode. This function must be called once before [sl_rail_ble_enable_signal_detection](ble#sl-rail-ble-enable-signal-detection) to configure and enable signal identifier.

To enable event for signal detection [sl_rail_config_events()](events#sl-rail-config-events) must be called for enabling [SL_RAIL_EVENT_SIGNAL_DETECTED](events#sl-rail-event-signal-detected).

This function is only supported by chips where [SL_RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ble-supports-signal-identifier-1) and [sl_rail_ble_supports_signal_identifier()](features#sl-rail-ble-supports-signal-identifier) are true. 

###### sl_rail_ble_enable_signal_detection (heading level 7)

`sl_rail_status_t sl_rail_ble_enable_signal_detection(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable or disable signal identifier interrupt for BLE signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Signal detection is enabled if true, disabled if false.|

**Returns**

- Status code indicating success of the function call.

[sl_rail_ble_config_signal_identifier()](ble#sl-rail-ble-config-signal-identifier) must be called once before calling this function to configure and enable signal identifier. Once a signal is detected signal detection will be turned off and this function should be called to re-enable the signal detection without needing to call [sl_rail_ble_config_signal_identifier()](ble#sl-rail-ble-config-signal-identifier) if the signal identifier is already configured and enabled.

This function is only supported by chips where [SL_RAIL_BLE_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ble-supports-signal-identifier-1) and [sl_rail_ble_supports_signal_identifier()](features#sl-rail-ble-supports-signal-identifier) are true. 

###### Macros

`#define RAIL_BLE_RX_SUBPHY_ID_500K (0U)`

**Description**: [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) indicating a 500 kbps packet.

`#define RAIL_BLE_RX_SUBPHY_ID_125K (1U)`

**Description**: [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) indicating a 125 kbps packet.

`#define RAIL_BLE_RX_SUBPHY_ID_1M (2U)`

**Description**: [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) value indicating a 1 Mbps packet.

`#define RAIL_BLE_RX_SUBPHY_ID_INVALID (3U)`

**Description**: [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) invalid value.

`#define RAIL_BLE_RX_SUBPHY_COUNT (4U)`

**Description**: The total count of BLE subPhyId's.

`#define RAIL_BLE_EnableSignalIdentifier RAIL_BLE_EnableSignalDetection`

**Description**: Backward compatible name for the [RAIL_BLE_EnableSignalDetection](ble#rail-ble-enable-signal-detection) API.

`#define SL_RAIL_BLE_RX_SUBPHY_ID_500_KBPS (0U)`

**Description**: [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) indicating a 500 kbps packet.

`#define SL_RAIL_BLE_RX_SUBPHY_ID_125_KBPS (1U)`

**Description**: [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) indicating a 125 kbps packet.

`#define SL_RAIL_BLE_RX_SUBPHY_ID_1_MBPS (2U)`

**Description**: [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) value indicating a 1 Mbps packet.

`#define SL_RAIL_BLE_RX_SUBPHY_ID_INVALID (3U)`

**Description**: [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id) invalid value.

`#define SL_RAIL_BLE_RX_SUBPHY_COUNT (4U)`

**Description**: The total count of BLE sub_phy_id's.

A structure for BLE radio state parameters. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t](sl-rail-ble-state-t). 

###### Public Attributes (heading level 7)

###### crcInit (heading level 8)

```
uint32_t RAIL_BLE_State_t::crcInit
```

**Description:** The value used to initialize the CRC algorithm.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t::crc_init](sl-rail-ble-state-t#crc-init).

###### accessAddress (heading level 8)

```
uint32_t RAIL_BLE_State_t::accessAddress
```

**Description:** The access address used for the connection.

**Details:** It is transmitted or received least-significant bit first.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t::access_address](sl-rail-ble-state-t#access-address).

###### channel (heading level 8)

```
uint16_t RAIL_BLE_State_t::channel
```

**Description:** The logical channel used.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t::logical_channel](sl-rail-ble-state-t#logical-channel).

###### disableWhitening (heading level 8)

```
bool RAIL_BLE_State_t::disableWhitening
```

**Description:** Indicates whether the whitening engine should be off (generally used for testing only).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t::disable_whitening](sl-rail-ble-state-t#disable-whitening).

###### whiteInit (heading level 8)

```
uint16_t RAIL_BLE_State_t::whiteInit
```

**Description:** Reserved for future use; specify 0.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_state_t::white_init](sl-rail-ble-state-t#white-init).

A structure for BLE radio state parameters. 

###### Public Attributes (heading level 7)

###### crc_init (heading level 8)

```
uint32_t sl_rail_ble_state_t::crc_init
```

**Description:** The value used to initialize the CRC algorithm.

###### access_address (heading level 8)

```
uint32_t sl_rail_ble_state_t::access_address
```

**Description:** The access address used for the connection.

**Details:** It is transmitted or received least-significant bit first.

###### logical_channel (heading level 8)

```
uint16_t sl_rail_ble_state_t::logical_channel
```

**Description:** The logical channel used.

###### disable_whitening (heading level 8)

```
bool sl_rail_ble_state_t::disable_whitening
```

**Description:** Indicates whether the whitening engine should be off (generally used for testing only).

###### white_init (heading level 8)

```
uint16_t sl_rail_ble_state_t::white_init
```

**Description:** Reserved for future use; specify 0.

###### BLE Radio Configurations

Radio configurations for the RAIL BLE Accelerator. 

These radio configurations are used to configure BLE when a function such as [RAIL_BLE_ConfigPhy1MbpsViterbi()](ble#rail-ble-config-phy1-mbps-viterbi) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overriden to account for those settings.

These radio configurations are used to configure BLE when a function such as [sl_rail_ble_config_phy_1_mbps()](ble#sl-rail-ble-config-phy-1-mbps) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overriden to account for those settings. 

###### Variables (heading level 7)

###### RAIL_BLE_Phy1Mbps (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy1Mbps
```

**Description:** Default PHY to use for BLE 1 Mbps non-Viterbi.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_1MBPS_NON_VITERBI](features#rail-ble-supports-1-mbps-non-viterbi) is 0.

**Deprecated**BLE non-Viterbi PHYs are no longer supported.

###### RAIL_BLE_Phy2Mbps (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy2Mbps
```

**Description:** Default PHY to use for BLE 2 Mbps non-Viterbi.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_2MBPS_NON_VITERBI](features#rail-ble-supports-2-mbps-non-viterbi) is 0.

**Deprecated**BLE non-Viterbi PHYs are no longer supported.

###### RAIL_BLE_Phy1MbpsViterbi (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy1MbpsViterbi
```

**Description:** Default PHY to use for BLE 1 Mbps Viterbi.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_1MBPS_VITERBI](features#rail-ble-supports-1-mbps-viterbi) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_1_mbps](ble-phy#sl-rail-ble-phy-1-mbps).

###### RAIL_BLE_Phy2MbpsViterbi (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy2MbpsViterbi
```

**Description:** Default PHY to use for BLE 2 Mbps Viterbi.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_2MBPS_VITERBI](features#rail-ble-supports-2-mbps-viterbi) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_2_mbps](ble-phy#sl-rail-ble-phy-2-mbps).

###### RAIL_BLE_Phy2MbpsAox (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy2MbpsAox
```

**Description:** PHY to use for BLE 2 Mbps with AoX functionality.

**Details:** Will be NULL if either [RAIL_BLE_SUPPORTS_2MBPS_VITERBI](features#rail-ble-supports-2-mbps-viterbi) or [RAIL_BLE_SUPPORTS_AOX](features#rail-ble-supports-aox) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_2_mbps_aox](ble-phy#sl-rail-ble-phy-2-mbps-aox).

###### RAIL_BLE_Phy125kbps (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy125kbps
```

**Description:** Default PHY to use for BLE Coded 125 kbps.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_CODED_PHY](features#rail-ble-supports-coded-phy-1) is 0. This PHY can receive on both 125 kbps and 500 kbps BLE Coded, but will only transmit at 125 kbps.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_125_kbps](ble-phy#sl-rail-ble-phy-125-kbps).

###### RAIL_BLE_Phy500kbps (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_Phy500kbps
```

**Description:** Default PHY to use for BLE Coded 500 kbps.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_CODED_PHY](features#rail-ble-supports-coded-phy-1) is 0. This PHY can receive on both 125 kbps and 500 kbps BLE Coded, but will only transmit at 125 kbps.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_500_kbps](ble-phy#sl-rail-ble-phy-500-kbps).

###### RAIL_BLE_PhySimulscan (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_PhySimulscan
```

**Description:** Default PHY to use for BLE Simulscan.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#rail-ble-supports-simulscan-phy-1) is 0. This PHY can receive on 1 Mbps as well as 125 kbps and 500 kbps BLE Coded, but will only transmit at 1 Mbps.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_simulscan](ble-phy#sl-rail-ble-phy-simulscan).

###### RAIL_BLE_PhyQuuppa (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_BLE_PhyQuuppa
```

**Description:** Default 1 Mbps Quuppa PHY.

**Details:** Will be NULL if [RAIL_BLE_SUPPORTS_QUUPPA](features#rail-ble-supports-quuppa-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_phy_quuppa](ble-phy#sl-rail-ble-phy-quuppa).

###### sl_rail_ble_phy_1_mbps (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_1_mbps
```

**Description:** Default PHY to use for BLE 1 Mbps.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_1_MBPS](features#sl-rail-ble-supports-1-mbps-1) is 0.

###### sl_rail_ble_phy_2_mbps (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_2_mbps
```

**Description:** Default PHY to use for BLE 2 Mbps.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1) is 0.

###### sl_rail_ble_phy_2_mbps_aox (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_2_mbps_aox
```

**Description:** PHY to use for BLE 2 Mbps with AoX functionality.

**Details:** Will be NULL if either [SL_RAIL_BLE_SUPPORTS_2_MBPS](features#sl-rail-ble-supports-2-mbps-1) or [SL_RAIL_BLE_SUPPORTS_AOX](features#sl-rail-ble-supports-aox) is 0.

###### sl_rail_ble_phy_125_kbps (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_125_kbps
```

**Description:** Default PHY to use for BLE Coded 125 kbps.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_CODED_PHY](features#sl-rail-ble-supports-coded-phy-1) is 0. This PHY can receive on both 125 kbps and 500 kbps BLE Coded, but will only transmit at 125 kbps.

###### sl_rail_ble_phy_500_kbps (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_500_kbps
```

**Description:** Default PHY to use for BLE Coded 500 kbps.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_CODED_PHY](features#sl-rail-ble-supports-coded-phy-1) is 0. This PHY can receive on both 125 kbps and 500 kbps BLE Coded, but will only transmit at 125 kbps.

###### sl_rail_ble_phy_simulscan (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_simulscan
```

**Description:** Default PHY to use for BLE Simulscan.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_SIMULSCAN_PHY](features#sl-rail-ble-supports-simulscan-phy-1) is 0. This PHY can receive on 1 Mbps as well as 125 kbps and 500 kbps BLE Coded, but will only transmit at 1 Mbps.

###### sl_rail_ble_phy_quuppa (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ble_phy_quuppa
```

**Description:** Default 1 Mbps Quuppa PHY.

**Details:** Will be NULL if [SL_RAIL_BLE_SUPPORTS_QUUPPA](features#sl-rail-ble-supports-quuppa-1) is 0.

###### Angle of Arrival/Departure

These APIs are to a stack implementing BLE's angle of arrival and angle of departure functionality. 

They are designed for use by the Silicon Labs BLE stack only at this time and may cause problems if accessed directly. 

###### Modules (heading level 7)

[RAIL_BLE_AoxConfig_t](rail-ble-aox-config-t)

[RAIL_BLE_AoxAntennaPortPins_t](rail-ble-aox-antenna-port-pins-t)

[RAIL_BLE_AoxAntennaConfig_t](rail-ble-aox-antenna-config-t)

[sl_rail_ble_aox_config_t](sl-rail-ble-aox-config-t)

[sl_rail_ble_aox_antenna_port_pins_t](sl-rail-ble-aox-antenna-port-pins-t)

[sl_rail_ble_aox_antenna_config_t](sl-rail-ble-aox-antenna-config-t)

###### Enumerations (heading level 7)

###### RAIL_BLE_AoxOptions_t (heading level 8)

```
enum RAIL_BLE_AoxOptions_t {
    RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT = 0
    RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT = 1
    RAIL_BLE_AOX_OPTIONS_CONN_SHIFT = 2
    RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT = 3
}
```

**Description:**

Angle of Arrival/Departure options bit fields.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_options_t](ao-x#sl-rail-ble-aox-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT|Shift position of [RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE](ao-x#rail-ble-aox-options-sample-mode) bit.|
|RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT|Shift position of [RAIL_BLE_AOX_OPTIONS_CONNLESS](ao-x#rail-ble-aox-options-connless) bit.|
|RAIL_BLE_AOX_OPTIONS_CONN_SHIFT|Shift position of [RAIL_BLE_AOX_OPTIONS_CONN](ao-x#rail-ble-aox-options-conn) bit.|
|RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT|Shift position of [RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK](ao-x#rail-ble-aox-options-disable-buffer-lock) bit.|

###### sl_rail_ble_aox_options_t (heading level 8)

```
enum sl_rail_ble_aox_options_t {
    SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT = 0
    SL_RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT = 1
    SL_RAIL_BLE_AOX_OPTIONS_CONN_SHIFT = 2
    SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT = 3
}
```

**Description:**

Angle of Arrival/Departure options bit fields.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT|Shift position of [SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE](ao-x#sl-rail-ble-aox-options-sample-mode) bit.|
|SL_RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT|Shift position of [SL_RAIL_BLE_AOX_OPTIONS_CONNLESS](ao-x#sl-rail-ble-aox-options-connless) bit.|
|SL_RAIL_BLE_AOX_OPTIONS_CONN_SHIFT|Shift position of [SL_RAIL_BLE_AOX_OPTIONS_CONN](ao-x#sl-rail-ble-aox-options-conn) bit.|
|SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT|Shift position of [SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK](ao-x#sl-rail-ble-aox-options-disable-buffer-lock) bit.|

###### Functions (heading level 7)

###### RAIL_BLE_LockCteBuffer (heading level 8)

`bool RAIL_BLE_LockCteBuffer(RAIL_Handle_t railHandle, bool lock)`

**Description:** Lock/unlock the CTE buffer from the application's perspective.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|lock|Lock the CTE buffer if true and unlock it if false.|

The radio will write to the buffer only if the bit is NOT set at the beginning of the sampling period. The radio will set the bit once the sampling period starts to indicate that some CTE data has been collected, which will not be overwritten during the next sampling period, unless the buffer is unlocked by the application.

**Returns**

- true if the CTE buffer is locked after the call, otherwise false.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_lock_cte_buffer()](ao-x#sl-rail-ble-lock-cte-buffer). 

###### RAIL_BLE_CteBufferIsLocked (heading level 8)

`bool RAIL_BLE_CteBufferIsLocked(RAIL_Handle_t railHandle)`

**Description:** Determine whether the CTE buffer is currently locked or not.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- true if CTE buffer is locked and false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_cte_buffer_is_locked()](ao-x#sl-rail-ble-cte-buffer-is-locked). 

###### RAIL_BLE_GetCteSampleOffset (heading level 8)

`uint8_t RAIL_BLE_GetCteSampleOffset(RAIL_Handle_t railHandle)`

**Description:** Get the offset into CTE sample of CTE data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- The offset of CTE data in a CTE sample in bytes. On unsupported platforms this returns 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_get_cte_sample_offset()](ao-x#sl-rail-ble-get-cte-sample-offset). 

###### RAIL_BLE_GetCteSampleRate (heading level 8)

`uint32_t RAIL_BLE_GetCteSampleRate(RAIL_Handle_t railHandle)`

**Description:** Get the effective sample rate used by the ADC to capture the CTE samples.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- The actual sample rate used to capture the CTE in samples per second. On unsupported platforms this returns 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_get_cte_sample_rate()](ao-x#sl-rail-ble-get-cte-sample-rate). 

###### RAIL_BLE_ConfigAox (heading level 8)

`RAIL_Status_t RAIL_BLE_ConfigAox(RAIL_Handle_t railHandle, const RAIL_BLE_AoxConfig_t *aoxConfig)`

**Description:** Configure Angle of Arrival/Departure (AoX) functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_BLE_AoxConfig_t](rail-ble-aox-config-t) *|[in]|aoxConfig|Configuration options for AoX|

**Returns**

- Status code indicating success of the function call.

AoX is a method of radio localization which infers angle of arrival/departure of the signal based on different phases of the raw I/Q signal from different antennas by controlling external RF switch during the continuous tone extension (CTE). Connection based AoX packets are different than normal BLE packets in that they have 3 header bytes instead of 2 and they have CTE appended after the payload's CRC. 3rd byte or CTE info contains CTE length. Connectionless AoX packets have 2 header bytes and CTE info is part of the payload.

**Note**

- Calling [RAIL_GetRadioEntropy()](general#rail-get-radio-entropy) during AoX reception may break packet reception.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_aox()](ao-x#sl-rail-ble-config-aox). 

###### RAIL_BLE_InitCte (heading level 8)

`RAIL_Status_t RAIL_BLE_InitCte(RAIL_Handle_t railHandle)`

**Description:** Perform one time initialization of AoX registers.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

This function must be called before [RAIL_BLE_ConfigAox()](ao-x#rail-ble-config-aox) and before configuring the BLE PHY.

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_init_cte()](ao-x#sl-rail-ble-init-cte). 

###### RAIL_BLE_ConfigAoxAntenna (heading level 8)

`RAIL_Status_t RAIL_BLE_ConfigAoxAntenna(RAIL_Handle_t railHandle, const RAIL_BLE_AoxAntennaConfig_t *antennaConfig)`

**Description:** Perform initialization of AoX antenna GPIO pins.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_BLE_AoxAntennaConfig_t](rail-ble-aox-antenna-config-t) *|[in]|antennaConfig|A pointer to the antenna configuration structure to hold the set of GPIO ports and pins for AoX antenna switching.|

This function must be called before calls to [RAIL_BLE_InitCte()](ao-x#rail-ble-init-cte) and [RAIL_BLE_ConfigAox()](ao-x#rail-ble-config-aox), and before configuring the BLE PHY, else a [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) is returned.

If user configures more pins in [RAIL_BLE_AoxAntennaConfig_t::antCount](rail-ble-aox-antenna-config-t#ant-count) than allowed by [RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#rail-ble-aox-antenna-pin-count), then the API returns [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).

If user configures lesser than or equal to number of pins allowed by [RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#rail-ble-aox-antenna-pin-count), then the requested number of pins are configured and [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) is returned.

If AoX antenna switching is inactive, non-AoX transmits and receives will occur on the first antenna specified by the antenna pattern or on the default antenna if no antenna pattern is provided.

**Note**

- This function must only be called while channel sounding is disabled. If channel sounding has been enabled [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) will be returned.

**Returns**

- Status code indicating success of the function call.

**Note**

- Use the compile time symbol [RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#rail-ble-supports-antenna-switching-1) or the runtime call [RAIL_BLE_SupportsAntennaSwitching()](features#rail-ble-supports-antenna-switching) to check whether the platform supports this feature.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_config_aox_antenna()](ao-x#sl-rail-ble-config-aox-antenna). 

###### sl_rail_ble_lock_cte_buffer (heading level 8)

`bool sl_rail_ble_lock_cte_buffer(sl_rail_handle_t rail_handle, bool lock)`

**Description:** Lock/unlock the CTE buffer from the application's perspective.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|lock|Lock the CTE buffer if true and unlock it if false.|

The radio will write to the buffer only if the bit is NOT set at the beginning of the sampling period. The radio will set the bit once the sampling period starts to indicate that some CTE data has been collected, which will not be overwritten during the next sampling period, unless the buffer is unlocked by the application.

**Returns**

- true if the CTE buffer is locked after the call, otherwise false.

###### sl_rail_ble_cte_buffer_is_locked (heading level 8)

`bool sl_rail_ble_cte_buffer_is_locked(sl_rail_handle_t rail_handle)`

**Description:** Determine whether the CTE buffer is currently locked or not.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if CTE buffer is locked and false otherwise.

###### sl_rail_ble_get_cte_sample_offset (heading level 8)

`uint8_t sl_rail_ble_get_cte_sample_offset(sl_rail_handle_t rail_handle)`

**Description:** Get the offset into CTE sample of CTE data.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The offset of CTE data in a CTE sample in bytes. On unsupported platforms this returns 0.

###### sl_rail_ble_get_cte_sample_rate (heading level 8)

`uint32_t sl_rail_ble_get_cte_sample_rate(sl_rail_handle_t rail_handle)`

**Description:** Get the effective sample rate used by the ADC to capture the CTE samples.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The actual sample rate used to capture the CTE in samples per second. On unsupported platforms this returns 0.

###### sl_rail_ble_config_aox (heading level 8)

`sl_rail_status_t sl_rail_ble_config_aox(sl_rail_handle_t rail_handle, const sl_rail_ble_aox_config_t *p_aox_config)`

**Description:** Configure Angle of Arrival/Departure (AoX) functionality.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ble_aox_config_t](sl-rail-ble-aox-config-t) *|[in]|p_aox_config|A pointer to AoX configuration settings.|

**Returns**

- Status code indicating success of the function call.

AoX is a method of radio localization which infers angle of arrival/departure of the signal based on different phases of the raw I/Q signal from different antennas by controlling external RF switch during the continuous tone extension (CTE). Connection based AoX packets are different than normal BLE packets in that they have 3 header bytes instead of 2 and they have CTE appended after the payload's CRC. 3rd byte or CTE info contains CTE length. Connectionless AoX packets have 2 header bytes and CTE info is part of the payload.

**Note**

- Calling [sl_rail_get_radio_entropy()](general#sl-rail-get-radio-entropy) during AoX reception may break packet reception.

###### sl_rail_ble_init_cte (heading level 8)

`sl_rail_status_t sl_rail_ble_init_cte(sl_rail_handle_t rail_handle)`

**Description:** Perform one time initialization of AoX registers.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

This function must be called before [sl_rail_ble_config_aox()](ao-x#sl-rail-ble-config-aox) and before configuring the BLE PHY.

**Returns**

- Status code indicating success of the function call.

###### sl_rail_ble_config_aox_antenna (heading level 8)

`sl_rail_status_t sl_rail_ble_config_aox_antenna(sl_rail_handle_t rail_handle, const sl_rail_ble_aox_antenna_config_t *p_antenna_config)`

**Description:** Perform initialization of AoX antenna GPIO pins.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ble_aox_antenna_config_t](sl-rail-ble-aox-antenna-config-t) *|[in]|p_antenna_config|A pointer to the antenna configuration structure to hold the set of GPIO ports and pins for AoX antenna switching.|

This function must be called before calls to [sl_rail_ble_init_cte()](ao-x#sl-rail-ble-init-cte) and [sl_rail_ble_config_aox()](ao-x#sl-rail-ble-config-aox), and before configuring the BLE PHY, else a [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) is returned.

If user configures more pins in [sl_rail_ble_aox_antenna_config_t::antenna_count](sl-rail-ble-aox-antenna-config-t#antenna-count) than allowed by [SL_RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#sl-rail-ble-aox-antenna-pin-count), then the API returns [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).

If user configures lesser than or equal to number of pins allowed by [SL_RAIL_BLE_AOX_ANTENNA_PIN_COUNT](ao-x#sl-rail-ble-aox-antenna-pin-count), then the requested number of pins are configured and [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) is returned.

If AoX antenna switching is inactive, non-AoX transmits and receives will occur on the first antenna specified by the antenna pattern or on the default antenna if no antenna pattern is provided.

**Note**

- This function must only be called while channel sounding is disabled. If channel sounding has been enabled [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) will be returned.

**Returns**

- Status code indicating success of the function call.

**Note**

- Use the compile time symbol [SL_RAIL_BLE_SUPPORTS_ANTENNA_SWITCHING](features#sl-rail-ble-supports-antenna-switching-1) or the runtime call [sl_rail_ble_supports_antenna_switching()](features#sl-rail-ble-supports-antenna-switching) to check whether the platform supports this feature.

**Warnings**

- As this function relies on GPIO access and RAIL is meant to run in TrustZone non-secure world, it is not supported if GPIO is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### Macros (heading level 7)

`#define RAIL_BLE_AOX_ANTENNA_PIN_COUNT (6U)`

**Description**: The maximum number of GPIO pins used for AoX Antenna switching.

`#define RAIL_BLE_AOX_OPTIONS_DO_SWITCH (0U)`

**Description**: **Deprecated**Obsolete AOX option.

`#define RAIL_BLE_AOX_OPTIONS_TX_ENABLED (0U)`

**Description**: **Deprecated**Obsolete AOX option.

`#define RAIL_BLE_AOX_OPTIONS_RX_ENABLED (0U)`

**Description**: **Deprecated**Obsolete AOX option.

`#define RAIL_BLE_AOX_OPTIONS_LOCK_CTE_BUFFER_SHIFT RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT`

**Description**: **Deprecated**Use [SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT](ao-x#sl-rail-ble-aox-options-disable-buffer-lock-shift) instead.

`#define RAIL_BLE_AOX_OPTIONS_DISABLED (0U)`

**Description**: Disable the AoX feature.

`#define RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE (1U << RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT)`

**Description**: Sets one of the two AoX sampling/switching modes: 1 us or 2 us window.

`#define RAIL_BLE_AOX_OPTIONS_CONNLESS (1U << RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT)`

**Description**: Enables connectionless AoX Rx packets.

`#define RAIL_BLE_AOX_OPTIONS_CONN (1U << RAIL_BLE_AOX_OPTIONS_CONN_SHIFT)`

**Description**: Enables connection based AoX Rx packets.

`#define RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK (1U << RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT)`

**Description**: Disables CTE buffer lock.

`#define RAIL_BLE_AOX_OPTIONS_ENABLED (RAIL_BLE_AOX_OPTIONS_CONN | RAIL_BLE_AOX_OPTIONS_CONNLESS)`

**Description**: Enables connection based or connectionless AoX Rx packets.

`#define SL_RAIL_BLE_AOX_ANTENNA_PIN_COUNT (6U)`

**Description**: The maximum number of GPIO pins used for AoX Antenna switching.

`#define SL_RAIL_BLE_AOX_OPTIONS_DISABLED (0U)`

**Description**: Disable the AoX feature.

`#define SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE (1U << SL_RAIL_BLE_AOX_OPTIONS_SAMPLE_MODE_SHIFT)`

**Description**: Sets one of the two AoX sampling/switching modes: 1 us or 2 us window.

`#define SL_RAIL_BLE_AOX_OPTIONS_CONNLESS (1U << SL_RAIL_BLE_AOX_OPTIONS_CONNLESS_SHIFT)`

**Description**: Enables connectionless AoX Rx packets.

`#define SL_RAIL_BLE_AOX_OPTIONS_CONN (1U << SL_RAIL_BLE_AOX_OPTIONS_CONN_SHIFT)`

**Description**: Enables connection based AoX Rx packets.

`#define SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK (1U << SL_RAIL_BLE_AOX_OPTIONS_DISABLE_BUFFER_LOCK_SHIFT)`

**Description**: Disables CTE buffer lock.

`#define SL_RAIL_BLE_AOX_OPTIONS_ENABLED (SL_RAIL_BLE_AOX_OPTIONS_CONN | SL_RAIL_BLE_AOX_OPTIONS_CONNLESS)`

**Description**: Enables connection based or connectionless AoX Rx packets.

Contains arguments for [RAIL_BLE_ConfigAox()](ao-x#rail-ble-config-aox) function. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t](sl-rail-ble-aox-config-t). 

###### Public Attributes (heading level 8)

###### aoxOptions (heading level 9)

```
RAIL_BLE_AoxOptions_t RAIL_BLE_AoxConfig_t::aoxOptions
```

**Description:** AoX options.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t::aox_options](sl-rail-ble-aox-config-t#aox-options).

###### cteBuffSize (heading level 9)

```
uint16_t RAIL_BLE_AoxConfig_t::cteBuffSize
```

**Description:** Size of the raw AoX CTE (continuous tone extension) data capture buffer in bytes.

**Details:** Note this value should be a multiple of 4 as each IQ sample requires 4 bytes.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t::cte_buffer_bytes](sl-rail-ble-aox-config-t#cte-buffer-bytes).

###### cteBuffAddr (heading level 9)

```
uint32_t* RAIL_BLE_AoxConfig_t::cteBuffAddr
```

**Description:** Address to where the received CTE is written.

**Details:** Buffer must be 32-bit aligned.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t::p_cte_buffer](sl-rail-ble-aox-config-t#p-cte-buffer).

###### antArrayAddr (heading level 9)

```
uint8_t* RAIL_BLE_AoxConfig_t::antArrayAddr
```

**Description:** Address to first element of antenna pattern array.

**Details:** Array must be in RAM. Each element of the array contains an antenna number. The switching pattern is defined by the order of antennas in this array.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t::p_antenna_array](sl-rail-ble-aox-config-t#p-antenna-array).

###### antArraySize (heading level 9)

```
uint8_t RAIL_BLE_AoxConfig_t::antArraySize
```

**Description:** Number of entries in the antenna pattern array.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_config_t::antenna_array_entries](sl-rail-ble-aox-config-t#antenna-array-entries).

Contains elements of [RAIL_BLE_AoxAntennaConfig_t](rail-ble-aox-antenna-config-t) struct. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t](sl-rail-ble-aox-antenna-port-pins-t). 

###### Public Attributes (heading level 8)

###### antPort (heading level 9)

```
uint8_t RAIL_BLE_AoxAntennaPortPins_t::antPort
```

**Description:** The port which is used for AoX antenna switching.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t::antenna_port](sl-rail-ble-aox-antenna-port-pins-t#antenna-port).

###### antPin (heading level 9)

```
uint8_t RAIL_BLE_AoxAntennaPortPins_t::antPin
```

**Description:** The pin which is used for AoX antenna switching.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_port_pins_t::antenna_pin](sl-rail-ble-aox-antenna-port-pins-t#antenna-pin).

Contains arguments for [RAIL_BLE_ConfigAoxAntenna()](ao-x#rail-ble-config-aox-antenna) function. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t](sl-rail-ble-aox-antenna-config-t). 

###### Public Attributes (heading level 8)

###### antPortPin (heading level 9)

```
RAIL_BLE_AoxAntennaPortPins_t* RAIL_BLE_AoxAntennaConfig_t::antPortPin
```

**Description:** A pointer to an array containing struct of port and pin used for AoX antenna switching.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t::p_antenna_port_pin](sl-rail-ble-aox-antenna-config-t#p-antenna-port-pin).

###### antCount (heading level 9)

```
uint8_t RAIL_BLE_AoxAntennaConfig_t::antCount
```

**Description:** Number of antenna pins to be configured.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_aox_antenna_config_t::antenna_count](sl-rail-ble-aox-antenna-config-t#antenna-count).

Contains arguments for [sl_rail_ble_config_aox()](ao-x#sl-rail-ble-config-aox) function. 

###### Public Attributes (heading level 8)

###### aox_options (heading level 9)

```
sl_rail_ble_aox_options_t sl_rail_ble_aox_config_t::aox_options
```

**Description:** AoX options.

###### cte_buffer_bytes (heading level 9)

```
uint16_t sl_rail_ble_aox_config_t::cte_buffer_bytes
```

**Description:** Size of the raw AoX CTE (continuous tone extension) data capture buffer in bytes.

**Details:** Note this value should be a multiple of 4 as each IQ sample requires 4 bytes.

###### p_cte_buffer (heading level 9)

```
uint32_t* sl_rail_ble_aox_config_t::p_cte_buffer
```

**Description:** Address to where the received CTE is written.

**Details:** Buffer must be 32-bit aligned.

###### p_antenna_array (heading level 9)

```
uint8_t* sl_rail_ble_aox_config_t::p_antenna_array
```

**Description:** Address to first element of antenna pattern array.

**Details:** Array must be in RAM. Each element of the array contains an antenna number. The switching pattern is defined by the order of antennas in this array.

###### antenna_array_entries (heading level 9)

```
uint8_t sl_rail_ble_aox_config_t::antenna_array_entries
```

**Description:** Number of entries in the antenna pattern array.

Contains elements of [sl_rail_ble_aox_antenna_config_t](sl-rail-ble-aox-antenna-config-t) struct. 

###### Public Attributes (heading level 8)

###### antenna_port (heading level 9)

```
uint8_t sl_rail_ble_aox_antenna_port_pins_t::antenna_port
```

**Description:** The port which is used for AoX antenna switching.

###### antenna_pin (heading level 9)

```
uint8_t sl_rail_ble_aox_antenna_port_pins_t::antenna_pin
```

**Description:** The pin which is used for AoX antenna switching.

Contains arguments for [sl_rail_ble_config_aox_antenna()](ao-x#sl-rail-ble-config-aox-antenna) function. 

###### Public Attributes (heading level 8)

###### p_antenna_port_pin (heading level 9)

```
sl_rail_ble_aox_antenna_port_pins_t* sl_rail_ble_aox_antenna_config_t::p_antenna_port_pin
```

**Description:** A pointer to an array containing struct of port and pin used for AoX antenna switching.

###### antenna_count (heading level 9)

```
uint8_t sl_rail_ble_aox_antenna_config_t::antenna_count
```

**Description:** Number of antenna pins to be configured.

###### BLE TX Channel Hopping

```c
// Configuration to send one additional packet
static RAIL_BLE_TxChannelHoppingConfigEntry_t entry[1];
static uint32_t buffer[BUFFER_SIZE];
static RAIL_BLE_TxRepeatConfig_t repeat = {
  .iterations = 1,
  .repeatOptions = RAIL_TX_REPEAT_OPTION_HOP,
  .delayOrHop.channelHopping = {
    .buffer = buffer,
    .bufferLength = BUFFER_SIZE,
    .numberOfChannels = 1,
    .entries = &entry[0],
  },
};

// Send a normal packet on the current channel, then a packet on a new channel
void bleSendThenAdvertise(uint8_t *firstPacket, uint8_t *secondPacket)
{
  // Load both packets into the FIFO
  RAIL_WriteTxFifo(railHandle, firstPacket, FIRST_PACKET_LEN, true);
  RAIL_WriteTxFifo(railHandle, secondPacket, SECOND_PACKET_LEN, false);

  // Configure a 300 us turnaround between transmits
  entry[0].delayMode = RAIL_CHANNEL_HOPPING_DELAY_MODE_STATIC;
  entry[0].delay = 300; // microseconds

  // Use default advertising parameters
  entry[0].disableWhitening = false;
  entry[0].crcInit = 0x00555555;
  entry[0].accessAddress = 0x8E89BED6;

  // Transmit the repeated packet on the first advertising channel
  entry[0].phy = RAIL_BLE_1Mbps;
  entry[0].railChannel = 0;
  entry[0].logicalChannel = 37;

 // Configure repeated transmit in RAIL, then transmit, sending both packets
 RAIL_BLE_SetNextTxRepeat(railHandle, &repeat);
 RAIL_StartTx(railHandle, currentChannel, RAIL_TX_OPTIONS_DEFAULT, NULL);
}

```

```c
// Configuration to send one additional packet
static sl_rail_ble_tx_channel_hopping_config_entry_t entry[1];
static uint32_t buffer[BUFFER_WORDS];
static sl_rail_ble_tx_repeat_config_t tx_repeat_config = {
  .iterations = 1,
  .repeat_options = SL_RAIL_TX_REPEAT_OPTION_HOP,
  .delay_or_hop.channel_hopping = {
    .p_buffer = buffer,
    .buffer_words = BUFFER_WORDS,
    .number_of_channels = 1,
    .entries = &entry[0],
  },
};

// Send a normal packet on the current channel, then a packet on a new channel
void ble_send_then_advertise(uint8_t *p_first_packet,
                             uint8_t first_packet_bytes,
                             uint8_t *p_second_packet,
                             uint8_t second_packet_bytes)
{
  // Load both packets into the FIFO
  sl_rail_write_tx_fifo(rail_handle, p_first_packet, first_packet_bytes, true);
  sl_rail_write_tx_fifo(rail_handle, p_second_packet, second_packet_bytes, false);

  // Configure a 300 us turnaround between transmits
  entry[0].delay_mode = SL_RAIL_CHANNEL_HOPPING_DELAY_MODE_STATIC;
  entry[0].delay = 300; // microseconds

  // Use default advertising parameters
  entry[0].disable_whitening = false;
  entry[0].crc_init = 0x00555555;
  entry[0].access_address = 0x8E89BED6;

  // Transmit the repeated packet on the first advertising channel
  entry[0].phy = sl_rail_ble_1_mbps;
  entry[0].rail_channel = 0;
  entry[0].logical_channel = 37;

 // Configure repeated transmit in RAIL, then transmit, sending both packets
 sl_rail_ble_set_next_tx_repeat(rail_handle, &tx_repeat_config);
 sl_rail_start_tx(rail_handle, current_channel, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);
}

```

###### Modules (heading level 7)

[RAIL_BLE_TxChannelHoppingConfigEntry_t](rail-ble-tx-channel-hopping-config-entry-t)

[RAIL_BLE_TxChannelHoppingConfig_t](rail-ble-tx-channel-hopping-config-t)

[RAIL_BLE_TxRepeatConfig_t](rail-ble-tx-repeat-config-t)

[sl_rail_ble_tx_channel_hopping_config_entry_t](sl-rail-ble-tx-channel-hopping-config-entry-t)

[sl_rail_ble_tx_channel_hopping_config_t](sl-rail-ble-tx-channel-hopping-config-t)

[sl_rail_ble_tx_repeat_config_t](sl-rail-ble-tx-repeat-config-t)

###### Functions (heading level 7)

###### RAIL_BLE_SetNextTxRepeat (heading level 8)

`RAIL_Status_t RAIL_BLE_SetNextTxRepeat(RAIL_Handle_t railHandle, const RAIL_BLE_TxRepeatConfig_t *repeatConfig)`

**Description:** Set up automatic repeated transmits after the next transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_BLE_TxRepeatConfig_t](rail-ble-tx-repeat-config-t) *|[in]|repeatConfig|A non-NULL pointer to the configuration structure for repeated transmits.|

**Returns**

- Status code indicating a success of the function call.

Repeated transmits will occur after an application-initiated transmit caused by calling one of the [Packet Transmit](packet-tx) APIs. The repetition will only occur after the first application-initiated transmit after this function is called. Future repeated transmits must be requested by calling this function again.

Each repeated transmit that occurs will have full [PTI Packet Trace](pti) information and will receive events such as [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) as normal.

If a TX error occurs during the repetition, the process will abort and the TX error transition from [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will be used. If the repetition completes successfully, the TX success transition from [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will be used.

Any call to [RAIL_Idle()](state-transitions#rail-idle-1), [RAIL_StopTx()](transmit#rail-stop-tx), or [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will clear the pending repeated transmits. The state will also be cleared by another call to this function. To clear the repeated transmits before they've started without stopping other radio actions, call this function with a [RAIL_BLE_TxRepeatConfig_t::iterations](rail-ble-tx-repeat-config-t#iterations) count of 0. A DMP switch will clear this state only if the initial transmit triggering the repeated transmits has started.

The application is responsible for populating the transmit data to be used by the repeated transmits via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo). Data will be transmitted from the TX FIFO. If the TX FIFO does not have sufficient data to transmit, a TX error and a [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) will occur. To avoid an underflow, the application should queue data to be transmitted as early as possible.

This function will fail to configure the repetition if a transmit of any kind is ongoing, including during the time between an initial transmit and the end of a previously-configured repetition.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_TX_TO_TX](features#rail-supports-tx-to-tx-1) or the runtime call [RAIL_SupportsTxToTx()](features#rail-supports-tx-to-tx) to check whether the platform supports this feature.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_set_next_tx_repeat()](bletx2-tx#sl-rail-ble-set-next-tx-repeat). 

###### sl_rail_ble_set_next_tx_repeat (heading level 8)

`sl_rail_status_t sl_rail_ble_set_next_tx_repeat(sl_rail_handle_t rail_handle, const sl_rail_ble_tx_repeat_config_t *p_repeat_config)`

**Description:** Set up automatic repeated transmits after the next transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ble_tx_repeat_config_t](sl-rail-ble-tx-repeat-config-t) *|[in]|p_repeat_config|A non-NULL pointer to the configuration structure for repeated transmits.|

**Returns**

- Status code indicating a success of the function call.

Repeated transmits will occur after an application-initiated transmit caused by calling one of the [Packet Transmit](packet-tx) APIs. The repetition will only occur after the first application-initiated transmit after this function is called. Future repeated transmits must be requested by calling this function again.

Each repeated transmit that occurs will have full [PTI Packet Trace](pti) information and will receive events such as [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) as normal.

If a TX error occurs during the repetition, the process will abort and the TX error transition from [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will be used. If the repetition completes successfully, the TX success transition from [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will be used.

Any call to [sl_rail_idle()](state-transitions#sl-rail-idle-1), [sl_rail_stop_tx()](transmit#sl-rail-stop-tx), or [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will clear the pending repeated transmits. The state will also be cleared by another call to this function. To clear the repeated transmits before they've started without stopping other radio actions, call this function with a [sl_rail_ble_tx_repeat_config_t::iterations](sl-rail-ble-tx-repeat-config-t#iterations) count of 0. A DMP switch will clear this state only if the initial transmit triggering the repeated transmits has started.

The application is responsible for populating the transmit data to be used by the repeated transmits via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). Data will be transmitted from the TX FIFO. If the TX FIFO does not have sufficient data to transmit, a TX error and a [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) will occur. To avoid an underflow, the application should queue data to be transmitted as early as possible.

This function will fail to configure the repetition if a transmit of any kind is ongoing, including during the time between an initial transmit and the end of a previously-configured repetition.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_TX_TO_TX](features#sl-rail-supports-tx-to-tx-1) or the runtime call [sl_rail_supports_tx_to_tx()](features#sl-rail-supports-tx-to-tx) to check whether the platform supports this feature.

Structure that represents one of the channels that is part of a [RAIL_BLE_TxChannelHoppingConfig_t](rail-ble-tx-channel-hopping-config-t) sequence of channels used in channel hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t](sl-rail-ble-tx-channel-hopping-config-entry-t). 

###### Public Attributes (heading level 8)

###### delay (heading level 9)

```
uint32_t RAIL_BLE_TxChannelHoppingConfigEntry_t::delay
```

**Description:** Idle time in microseconds to wait before hopping into the channel indicated by this entry.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::delay_us](sl-rail-ble-tx-channel-hopping-config-entry-t#delay-us).

###### phy (heading level 9)

```
RAIL_BLE_Phy_t RAIL_BLE_TxChannelHoppingConfigEntry_t::phy
```

**Description:** The BLE PHY to use for this hop's transmit.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::phy](sl-rail-ble-tx-channel-hopping-config-entry-t#phy).

###### logicalChannel (heading level 9)

```
uint8_t RAIL_BLE_TxChannelHoppingConfigEntry_t::logicalChannel
```

**Description:** The logical channel to use for this hop's transmit.

**Details:** The whitener will be reinitialized if used.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::logical_channel](sl-rail-ble-tx-channel-hopping-config-entry-t#logical-channel).

###### railChannel (heading level 9)

```
uint8_t RAIL_BLE_TxChannelHoppingConfigEntry_t::railChannel
```

**Description:** The channel number to be used for this hop's transmit.

**Details:** If this is an invalid channel for the chosen PHY, the call to [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) will fail.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::rail_channel](sl-rail-ble-tx-channel-hopping-config-entry-t#rail-channel).

###### disableWhitening (heading level 9)

```
bool RAIL_BLE_TxChannelHoppingConfigEntry_t::disableWhitening
```

**Description:** This can turn off the whitening engine and is useful for sending BLE test mode packets that don't have this turned on.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::disable_whitening](sl-rail-ble-tx-channel-hopping-config-entry-t#disable-whitening).

###### crcInit (heading level 9)

```
uint32_t RAIL_BLE_TxChannelHoppingConfigEntry_t::crcInit
```

**Description:** The value to use for CRC initialization.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::crc_init](sl-rail-ble-tx-channel-hopping-config-entry-t#crc-init).

###### accessAddress (heading level 9)

```
uint32_t RAIL_BLE_TxChannelHoppingConfigEntry_t::accessAddress
```

**Description:** The access address to use for the connection.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_entry_t::access_address](sl-rail-ble-tx-channel-hopping-config-entry-t#access-address).

Wrapper struct that will contain the sequence of [RAIL_BLE_TxChannelHoppingConfigEntry_t](rail-ble-tx-channel-hopping-config-entry-t) that represents the channel sequence to use during TX Channel Hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t](sl-rail-ble-tx-channel-hopping-config-t). 

###### Public Attributes (heading level 8)

###### buffer (heading level 9)

```
uint32_t* RAIL_BLE_TxChannelHoppingConfig_t::buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::p_buffer](sl-rail-ble-tx-channel-hopping-config-t#p-buffer).

###### bufferLength (heading level 9)

```
uint16_t RAIL_BLE_TxChannelHoppingConfig_t::bufferLength
```

**Description:** This parameter must be set to the length of the buffer array.

**Details:** This way, during configuration, the software can confirm it's writing within the range of the buffer. The configuration API will return an error if bufferLength is insufficient.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::buffer_words](sl-rail-ble-tx-channel-hopping-config-t#buffer-words).

###### numberOfChannels (heading level 9)

```
uint8_t RAIL_BLE_TxChannelHoppingConfig_t::numberOfChannels
```

**Description:** The number of channels that is in the channel hopping sequence.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::number_of_channels](sl-rail-ble-tx-channel-hopping-config-t#number-of-channels).

###### reserved (heading level 9)

```
uint8_t RAIL_BLE_TxChannelHoppingConfig_t::reserved
```

**Description:** Pad bytes reserved for future use and currently ignored.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::reserved](sl-rail-ble-tx-channel-hopping-config-t#reserved).

###### entries (heading level 9)

```
RAIL_BLE_TxChannelHoppingConfigEntry_t* RAIL_BLE_TxChannelHoppingConfig_t::entries
```

**Description:** A pointer to the first element of an array of [RAIL_BLE_TxChannelHoppingConfigEntry_t](rail-ble-tx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** The number of entries in this array must be numberOfChannels.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_channel_hopping_config_t::p_entries](sl-rail-ble-tx-channel-hopping-config-t#p-entries).

A configuration structure for repeated transmits. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t](sl-rail-ble-tx-repeat-config-t). 

###### Public Attributes (heading level 8)

###### iterations (heading level 9)

```
uint16_t RAIL_BLE_TxRepeatConfig_t::iterations
```

**Description:** The number of repeated transmits to run.

**Details:** A total of (iterations + 1) transmits will go on-air in the absence of errors.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::iterations](sl-rail-ble-tx-repeat-config-t#iterations).

###### repeatOptions (heading level 9)

```
RAIL_TxRepeatOptions_t RAIL_BLE_TxRepeatConfig_t::repeatOptions
```

**Description:** Repeat option(s) to apply.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::repeat_options](sl-rail-ble-tx-repeat-config-t#repeat-options).

###### delay (heading level 9)

```
RAIL_TransitionTime_t RAIL_BLE_TxRepeatConfig_t::delay
```

**Description:** When [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) is not set, this specifies the delay time between each repeated transmit.

**Details:** Specify [RAIL_TRANSITION_TIME_KEEP](state-transitions#rail-transition-time-keep) to use the current [RAIL_StateTiming_t::txToTx](rail-state-timing-t#tx-to-tx) transition time setting.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::delay_us](sl-rail-ble-tx-repeat-config-t#delay-us).

###### channelHopping (heading level 9)

```
RAIL_BLE_TxChannelHoppingConfig_t RAIL_BLE_TxRepeatConfig_t::channelHopping
```

**Description:** When [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) is set, this specifies the channel hopping configuration to use when hopping between repeated transmits.

**Details:** Per-hop delays are configured within each [RAIL_BLE_TxChannelHoppingConfigEntry_t::delay](rail-ble-tx-channel-hopping-config-entry-t#delay) rather than this union's delay field.

**Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::channel_hopping](sl-rail-ble-tx-repeat-config-t#channel-hopping).

###### delayOrHop (heading level 9)

```
union RAIL_BLE_TxRepeatConfig_t::@2 RAIL_BLE_TxRepeatConfig_t::delayOrHop
```

**Description:** Per-repeat delay or hopping configuration, depending on repeatOptions.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ble_tx_repeat_config_t::delay_or_hop](sl-rail-ble-tx-repeat-config-t#delay-or-hop).

Structure that represents one of the channels that is part of a [sl_rail_ble_tx_channel_hopping_config_t](sl-rail-ble-tx-channel-hopping-config-t) sequence of channels used in channel hopping. 

###### Public Attributes (heading level 8)

###### delay_us (heading level 9)

```
uint32_t sl_rail_ble_tx_channel_hopping_config_entry_t::delay_us
```

**Description:** Idle time in microseconds to wait before hopping into the channel indicated by this entry.

###### phy (heading level 9)

```
sl_rail_ble_phy_t sl_rail_ble_tx_channel_hopping_config_entry_t::phy
```

**Description:** The BLE PHY to use for this hop's transmit.

###### logical_channel (heading level 9)

```
uint8_t sl_rail_ble_tx_channel_hopping_config_entry_t::logical_channel
```

**Description:** The logical channel to use for this hop's transmit.

**Details:** The whitener will be reinitialized if used.

###### rail_channel (heading level 9)

```
uint8_t sl_rail_ble_tx_channel_hopping_config_entry_t::rail_channel
```

**Description:** The channel number to be used for this hop's transmit.

**Details:** If this is an invalid channel for the chosen PHY, the call to [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat) will fail.

###### disable_whitening (heading level 9)

```
bool sl_rail_ble_tx_channel_hopping_config_entry_t::disable_whitening
```

**Description:** This can turn off the whitening engine and is useful for sending BLE test mode packets that don't have this turned on.

###### crc_init (heading level 9)

```
uint32_t sl_rail_ble_tx_channel_hopping_config_entry_t::crc_init
```

**Description:** The value to use for CRC initialization.

###### access_address (heading level 9)

```
uint32_t sl_rail_ble_tx_channel_hopping_config_entry_t::access_address
```

**Description:** The access address to use for the connection.

Wrapper struct that will contain the sequence of [sl_rail_ble_tx_channel_hopping_config_entry_t](sl-rail-ble-tx-channel-hopping-config-entry-t) that represents the channel sequence to use during TX Channel Hopping. 

###### Public Attributes (heading level 8)

###### p_buffer (heading level 9)

```
uint32_t* sl_rail_ble_tx_channel_hopping_config_t::p_buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

###### buffer_words (heading level 9)

```
uint16_t sl_rail_ble_tx_channel_hopping_config_t::buffer_words
```

**Description:** This parameter must be set to the length of the buffer array.

**Details:** This way, during configuration, the software can confirm it's writing within the range of the buffer. The configuration API will return an error if buffer_words is insufficient.

###### number_of_channels (heading level 9)

```
uint8_t sl_rail_ble_tx_channel_hopping_config_t::number_of_channels
```

**Description:** The number of channels that is in the channel hopping sequence.

###### reserved (heading level 9)

```
uint8_t sl_rail_ble_tx_channel_hopping_config_t::reserved
```

**Description:** Pad bytes reserved for future use and currently ignored.

###### p_entries (heading level 9)

```
sl_rail_ble_tx_channel_hopping_config_entry_t* sl_rail_ble_tx_channel_hopping_config_t::p_entries
```

**Description:** A pointer to the first element of an array of [sl_rail_ble_tx_channel_hopping_config_entry_t](sl-rail-ble-tx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** The number of entries in this array must be number_of_channels.

A configuration structure for repeated transmits. 

###### Public Attributes (heading level 8)

###### iterations (heading level 9)

```
uint16_t sl_rail_ble_tx_repeat_config_t::iterations
```

**Description:** The number of repeated transmits to run.

**Details:** A total of (iterations + 1) transmits will go on-air in the absence of errors.

###### repeat_options (heading level 9)

```
sl_rail_tx_repeat_options_t sl_rail_ble_tx_repeat_config_t::repeat_options
```

**Description:** Repeat option(s) to apply.

###### delay_us (heading level 9)

```
sl_rail_transition_time_t sl_rail_ble_tx_repeat_config_t::delay_us
```

**Description:** When [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop) is not set, this specifies the delay time between each repeated transmit.

**Details:** Specify [SL_RAIL_TRANSITION_TIME_KEEP](state-transitions#sl-rail-transition-time-keep) to use the current [sl_rail_state_timing_t::tx_to_tx](sl-rail-state-timing-t#tx-to-tx) transition time setting.

###### channel_hopping (heading level 9)

```
sl_rail_ble_tx_channel_hopping_config_t sl_rail_ble_tx_repeat_config_t::channel_hopping
```

**Description:** When [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop) is set, this specifies the channel hopping configuration to use when hopping between repeated transmits.

**Details:** Per-hop delays are configured within each [sl_rail_ble_tx_channel_hopping_config_entry_t::delay_us](sl-rail-ble-tx-channel-hopping-config-entry-t#delay-us) rather than this union's delay_us field.

###### delay_or_hop (heading level 9)

```
union sl_rail_ble_tx_repeat_config_t::@6 sl_rail_ble_tx_repeat_config_t::delay_or_hop
```

**Description:** Per-repeat delay or hopping configuration, depending on repeat_options.

##### IEEE 802.15.4

IEEE 802.15.4 configuration routines. 

The functions in this group configure RAIL IEEE 802.15.4 hardware acceleration which includes IEEE 802.15.4 format filtering, address filtering, Acking, and filtering based on the frame type.

To configure IEEE 802.15.4 functionality, the application must first set up a RAIL instance with [RAIL_Init()](general#rail-init) and other setup functions. Instead of [RAIL_ConfigChannels()](radio-configuration#rail-config-channels), however, an application may use [RAIL_IEEE802154_Config2p4GHzRadio()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio) to set up the official IEEE 2.4 GHz 802.15.4 PHY. This configuration is shown below.

802.15.4 defines its macAckWaitDuration from the end of the transmitted packet to complete reception of the Ack. RAIL's ackTimeout only covers sync word detection of the Ack. Therefore, subtract the Ack's PHY header and payload time to get RAIL's ackTimeout setting. For 2.4 GHz OQPSK, macAckWaitDuration is specified as 54 symbols; subtracting 2-symbol PHY header and 10-symbol payload yields a RAIL ackTimeout of 42 symbols or 672 microseconds at 16 microseconds/symbol. 

```c
static RAIL_Handle_t railHandle = NULL; // Initialized somewhere else.

static const RAIL_IEEE802154_Config_t rail154Config = {
  .addresses = NULL,
  .ackConfig = {
    .enable = true,     // Turn on auto Ack for IEEE 802.15.4.
    .ackTimeout = 672,  // See note above: 54-12 sym * 16 us/sym = 672 us.
    .rxTransitions = {
      .success = RAIL_RF_STATE_RX,  // Return to RX after Ack processing
      .error = RAIL_RF_STATE_RX,    // Ignored
    },
    .txTransitions = {
      .success = RAIL_RF_STATE_RX,  // Return to RX after Ack processing
      .error = RAIL_RF_STATE_RX,    // Ignored
    },
  },
  .timings = {
    .idleToRx = 100,
    .idleToTx = 100,
    .rxToTx = 192,    // 12 symbols * 16 us/symbol = 192 us
    .txToRx = 192,    // 12 symbols * 16 us/symbol = 192 us
    .rxSearchTimeout = 0, // Not used
    .txToRxSearchTimeout = 0, // Not used
  },
  .framesMask = RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES,
  .promiscuousMode = false,  // Enable format and address filtering.
  .isPanCoordinator = false,
  .defaultFramePendingInOutgoingAcks = false,
};

void config154(void)
{
  // Configure the radio and channels for 2.4 GHz IEEE 802.15.4.
  RAIL_IEEE802154_Config2p4GHzRadio(railHandle);
  // Initialize the IEEE 802.15.4 configuration using the static configuration above.
  RAIL_IEEE802154_Init(railHandle, &rail154Config);
}

```

To configure address filtering, call [RAIL_IEEE802154_SetAddresses()](ieee802-15-4#rail-ieee802154-set-addresses) with a structure containing all addresses or call the individual [RAIL_IEEE802154_SetPanId()](ieee802-15-4#rail-ieee802154-set-pan-id), [RAIL_IEEE802154_SetShortAddress()](ieee802-15-4#rail-ieee802154-set-short-address), and [RAIL_IEEE802154_SetLongAddress()](ieee802-15-4#rail-ieee802154-set-long-address) APIs. RAIL supports [RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#rail-ieee802154-max-addresses) number of address pairs to receive packets from multiple IEEE 802.15.4 networks at the same time. Broadcast addresses are supported by default without any additional configuration so they do not consume one of these slots. If the application does not require all address pairs, be sure to set unused ones to the proper disabled value for each type. These can be found in the [RAIL_IEEE802154_AddrConfig_t](rail-ieee802154-addr-config-t) documentation. Below is an example of setting filtering for one set of addresses. 

```c
// PAN Id over-the-air value of 0x34 0x12.
// Short Address over-the-air byte order of 0x78 0x56.
// Long address with over-the-air byte order of 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88.

// Set up all addresses simultaneously.
RAIL_Status_t setup1(void)
{
  RAIL_IEEE802154_AddrConfig_t nodeAddress = {
    { 0x1234, 0xFFFF, 0xFFFF },
    { 0x5678, 0xFFFF, 0xFFFF },
    { { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 },
      { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
      { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
  };
  return RAIL_IEEE802154_SetAddresses(railHandle, &nodeAddress);
}

// Alternatively, the addresses can be set up individually as follows:
void setup2(void)
{
  RAIL_Status_t status;
  const uint8_t longAddress[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };

  status = RAIL_IEEE802154_SetPanId(railHandle, 0x1234, 0);
  assert(status == RAIL_STATUS_NO_ERROR);
  status = RAIL_IEEE802154_SetShortAddress(railHandle, 0x5678, 0);
  assert(status == RAIL_STATUS_NO_ERROR);
  status = RAIL_IEEE802154_SetLongAddress(railHandle, longAddress, 0);
  assert(status == RAIL_STATUS_NO_ERROR);
}

```

Address filtering will be enabled except when in promiscuous mode, which can be set with [RAIL_IEEE802154_SetPromiscuousMode()](ieee802-15-4#rail-ieee802154-set-promiscuous-mode). The addresses may be changed at runtime. However, if you are receiving a packet while reconfiguring the address filters, you may get undesired behavior so it's safest to do this while not in receive.

Auto Ack is controlled by the [RAIL_IEEE802154_Config_t::ackConfig](rail-ieee802154-config-t#ack-config) and [RAIL_IEEE802154_Config_t::timings](rail-ieee802154-config-t#timings) fields passed to [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init). After initialization, they may be controlled using the normal [Auto-Ack](auto-ack) and [State Transitions](state-transitions) APIs. When in IEEE 802.15.4 mode, the Ack will generally have a 5 byte length, its Frame Type will be Ack, its Frame Version 0 (2003), and its Frame Pending bit will be false unless the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) event is triggered in which case it will default to the [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks) setting. If the default Frame Pending setting is incorrect, the app must call [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending) (formerly [RAIL_IEEE802154_SetFramePending()](ieee802-15-4#rail-ieee802154-set-frame-pending)) while handling the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) event.

This event must be turned on by the user and will fire whenever a data request is being received so that the stack can determine if there is pending data. Note that if the default Frame Pending bit needs to be changed, it must be done quickly. Otherwise, the Ack may already have been transmitted with the default setting. Check the return code of [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending) to be sure that the bit was changed in time.

Transmit and receive operations are done using the standard RAIL APIs in IEEE 802.15.4 mode. To send packets using the correct CSMA configuration, use [RAIL_CSMA_CONFIG_802_15_4_2003_2p4_GHz_OQPSK_CSMA](transmit#rail-csma-config-802-15-4-2003-2p4-g-hz-oqpsk-csma) define that can initialize the csmaConfig structure passed to [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx).

The functions in this group configure RAIL IEEE 802.15.4 hardware acceleration which includes IEEE 802.15.4 format filtering, address filtering, Acking, and filtering based on the frame type.

To configure IEEE 802.15.4 functionality, the application must first set up a RAIL instance with [sl_rail_init()](general#sl-rail-init) and other setup functions. Instead of [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels), however, an application may use [sl_rail_ieee802154_config_2p4_ghz_radio()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio) to set up the official IEEE 2.4 GHz 802.15.4 PHY. This configuration is shown below.

802.15.4 defines its macAckWaitDuration from the end of the transmitted packet to complete reception of the Ack. RAIL's ack_timeout_us only covers sync word detection of the Ack. Therefore, subtract the Ack's PHY header and payload time to get RAIL's ack_timeout_us setting. For 2.4 GHz OQPSK, macAckWaitDuration is specified as 54 symbols; subtracting 2-symbol PHY header and 10-symbol payload yields a RAIL ack_timeout_us of 42 symbols or 672 microseconds at 16 microseconds/symbol. 

```c
static sl_rail_handle_t rail_handle = NULL; // Initialized somewhere else.

static const sl_rail_ieee802154_config_t rail_154_config = {
  .p_addresses = NULL,
  .ack_config = {
    .enable = true,        // Turn on auto Ack for IEEE 802.15.4.
    .ack_timeout_us = 672, // See note above: 54-12 sym * 16 us/sym = 672 us.
    .rx_transitions = {
      .success = SL_RAIL_RF_STATE_RX,  // Return to RX after Ack processing
      .error = SL_RAIL_RF_STATE_RX,    // Ignored
    },
    .tx_transitions = {
      .success = SL_RAIL_RF_STATE_RX,  // Return to RX after Ack processing
      .error = SL_RAIL_RF_STATE_RX,    // Ignored
    },
  },
  .timings = {
    .idle_to_rx = 100,
    .idle_to_tx = 100,
    .rx_to_tx = 192,    // 12 symbols * 16 us/symbol = 192 us
    .tx_to_rx = 192,    // 12 symbols * 16 us/symbol = 192 us
    .rxsearch_timeout = 0, // Not used
    .tx_to_rxsearch_timeout = 0, // Not used
  },
  .frames_mask = SL_RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES,
  .promiscuous_mode = false,  // Enable format and address filtering.
  .is_pan_coordinator = false,
  .default_frame_pending_in_outgoing_acks = false,
};

void config154(void)
{
  // Configure the radio and channels for 2.4 GHz IEEE 802.15.4.
  sl_rail_ieee802154_config_2p4_ghz_radio(rail_handle);
  // Initialize the IEEE 802.15.4 configuration using the static configuration above.
  sl_rail_ieee802154_init(rail_handle, &rail_154_config);
}

```

To configure address filtering, call [sl_rail_ieee802154_set_addresses()](ieee802-15-4#sl-rail-ieee802154-set-addresses) with a structure containing all addresses or call the individual [sl_rail_ieee802154_set_pan_id()](ieee802-15-4#sl-rail-ieee802154-set-pan-id), [sl_rail_ieee802154_set_short_address()](ieee802-15-4#sl-rail-ieee802154-set-short-address), and [sl_rail_ieee802154_set_long_address()](ieee802-15-4#sl-rail-ieee802154-set-long-address) APIs. RAIL supports [SL_RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#sl-rail-ieee802154-max-addresses) number of address pairs to receive packets from multiple IEEE 802.15.4 networks at the same time. Broadcast addresses are supported by default without any additional configuration so they do not consume one of these slots. If the application does not require all address pairs, be sure to set unused ones to the proper disabled value for each type. These can be found in the [sl_rail_ieee802154_addr_config_t](sl-rail-ieee802154-addr-config-t) documentation. Below is an example of setting filtering for one set of addresses. 

```c
// PAN Id over-the-air value of 0x34 0x12.
// Short Address over-the-air byte order of 0x78 0x56.
// Long address with over-the-air byte order of 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88.

// Set up all addresses simultaneously.
sl_rail_status_t setup_1(void)
{
  sl_rail_ieee802154_addr_config_t node_addresses = {
    .pan_id     = { 0x1234, 0xFFFF, 0xFFFF },
    .short_addr = { 0x5678, 0xFFFF, 0xFFFF },
    .long_addr  = { { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 },
                    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
                    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }
  };
  return sl_rail_ieee802154_set_addresses(rail_handle, &node_addresses);
}

// Alternatively, the addresses can be set up individually as follows:
void setup_2(void)
{
  sl_rail_status_t status;
  const uint8_t long_address[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 };

  status = sl_rail_ieee802154_set_pan_id(rail_handle, 0x1234, 0);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_ieee802154_set_short_address(rail_handle, 0x5678, 0);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_ieee802154_set_long_address(rail_handle, long_address, 0);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

```

Address filtering will be enabled except when in promiscuous mode, which can be set with [sl_rail_ieee802154_set_promiscuous_mode()](ieee802-15-4#sl-rail-ieee802154-set-promiscuous-mode). The addresses may be changed at runtime. However, if you are receiving a packet while reconfiguring the address filters, you may get undesired behavior so it's safest to do this while not in receive.

Auto Ack is controlled by the [sl_rail_ieee802154_config_t::ack_config](sl-rail-ieee802154-config-t#ack-config) and [sl_rail_ieee802154_config_t::timings](sl-rail-ieee802154-config-t#timings) fields passed to [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init). After initialization, they may be controlled using the normal [Auto-Ack](auto-ack) and [State Transitions](state-transitions) APIs. When in IEEE 802.15.4 mode, the Ack will generally have a 5 byte length, its Frame Type will be Ack, its Frame Version 0 (2003), and its Frame Pending bit will be false unless the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) event is triggered in which case it will default to the [sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks](sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks) setting. If the default Frame Pending setting is incorrect, the app must call [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending) while handling the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) event.

This event must be turned on by the user and will fire whenever a data request is being received so that the stack can determine if there is pending data. Note that if the default Frame Pending bit needs to be changed, it must be done quickly. Otherwise, the Ack may already have been transmitted with the default setting. Check the return code of [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending) to be sure that the bit was changed in time.

Transmit and receive operations are done using the standard RAIL APIs in IEEE 802.15.4 mode. To send packets using the correct CSMA configuration, use [SL_RAIL_CSMA_CONFIG_802_15_4_2003_2P4_GHZ_OQPSK_CSMA](transmit#sl-rail-csma-config-802-15-4-2003-2-p4-ghz-oqpsk-csma) define that can initialize the csma_config structure passed to [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx). 

###### Modules

[RAIL_IEEE802154_Address_t](rail-ieee802154-address-t)

[RAIL_IEEE802154_AddrConfig_t](rail-ieee802154-addr-config-t)

[RAIL_IEEE802154_Config_t](rail-ieee802154-config-t)

[RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t)

[RAIL_IEEE802154_ModeSwitchPhr_t](rail-ieee802154-mode-switch-phr-t)

[sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t)

[sl_rail_ieee802154_addr_config_t](sl-rail-ieee802154-addr-config-t)

[sl_rail_ieee802154_config_t](sl-rail-ieee802154-config-t)

[sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t)

[sl_rail_ieee802154_mode_switch_phr_t](sl-rail-ieee802154-mode-switch-phr-t)

[IEEE 802.15.4 Duty Cycling](ieee802154-rx-duty-cycling-api)

[IEEE 802.15.4 Fast Channel Switching](ieee802154-fast-channel-switching-api)

[IEEE 802.15.4 High Speed](ieee802154-high-speed-api)

[IEEE 802.15.4 Radio Configurations](ieee802154-phy)

###### Enumerations

###### RAIL_IEEE802154_AddressLength_t (heading level 7)

```
enum RAIL_IEEE802154_AddressLength_t {
    RAIL_IEEE802154_ShortAddress = 2
    RAIL_IEEE802154_LongAddress = 3
}
```

**Description:**

Different lengths that an 802.15.4 address can have.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_length_t](ieee802-15-4#sl-rail-ieee802154-address-length-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_ShortAddress|2 byte short address.|
|RAIL_IEEE802154_LongAddress|8 byte extended address.|

###### RAIL_IEEE802154_PtiRadioConfig_t (heading level 7)

```
enum RAIL_IEEE802154_PtiRadioConfig_t {
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ = 0x00U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV = 0x01U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_COEX = 0x02U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV_COEX = 0x03U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM = 0x08U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV = 0x09U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_COEX = 0x0AU
    RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV_COEX = 0x0BU
    RAIL_IEEE802154_PTI_RADIO_CONFIG_863MHZ_GB868 = 0x85U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_GB868 = 0x86U
    RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_R23_NA_EXT = 0x97U
}
```

**Description:**

802.15.4 PTI radio configuration mode

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_t](ieee802-15-4#sl-rail-ieee802154-phy-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ|Built-in 2.4 GHz 802.15.4 radio configuration.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_COEX|Built-in 2.4 GHz 802.15.4 radio configuration optimized for radio coexistence.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_ANTDIV_COEX|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for radio coexistence.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM|Built-in 2.4 GHz 802.15.4 radio configuration optimized for front end modules.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for front end modules.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_COEX|Built-in 2.4 GHz 802.15.4 radio configuration optimized for radio coexistence and front end modules.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_2P4GHZ_FEM_ANTDIV_COEX|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for radio coexistence and front end modules.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_863MHZ_GB868|Built-in 863 MHz GB868 802.15.4 radio configuration.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_GB868|Built-in 915 MHz GB868 802.15.4 radio configuration.|
|RAIL_IEEE802154_PTI_RADIO_CONFIG_915MHZ_R23_NA_EXT|External 915 MHz Zigbee R23 802.15.4 NA radio configuration.|

###### RAIL_IEEE802154_EOptions_t (heading level 7)

```
enum RAIL_IEEE802154_EOptions_t {
    RAIL_IEEE802154_E_OPTION_GB868_SHIFT = 0
    RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT
    RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT
}
```

**Description:**

802.15.4E-2012 options, in reality a bitmask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_e_options_t](ieee802-15-4#sl-rail-ieee802154-e-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_E_OPTION_GB868_SHIFT|Shift position of [RAIL_IEEE802154_E_OPTION_GB868](ieee802-15-4#rail-ieee802154-e-option-gb868) bit.|
|RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT|Shift position of [RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#rail-ieee802154-e-option-enh-ack) bit.|
|RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT|Shift position of [RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST](ieee802-15-4#rail-ieee802154-e-option-implicit-broadcast) bit.|

###### RAIL_IEEE802154_GOptions_t (heading level 7)

```
enum RAIL_IEEE802154_GOptions_t {
    RAIL_IEEE802154_G_OPTION_GB868_SHIFT = 0
    RAIL_IEEE802154_G_OPTION_DYNFEC_SHIFT
    RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH_SHIFT
}
```

**Description:**

802.15.4G-2012 options, in reality a bitmask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_G_OPTION_GB868_SHIFT|Shift position of [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868) bit.|
|RAIL_IEEE802154_G_OPTION_DYNFEC_SHIFT|Shift position of [RAIL_IEEE802154_G_OPTION_DYNFEC](ieee802-15-4#rail-ieee802154-g-option-dynfec) bit.|
|RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH_SHIFT|Shift position of [RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH](ieee802-15-4#rail-ieee802154-g-option-wisun-modeswitch) bit.|

###### RAIL_IEEE802154_CcaMode_t (heading level 7)

```
enum RAIL_IEEE802154_CcaMode_t {
    RAIL_IEEE802154_CCA_MODE_RSSI = 0
    RAIL_IEEE802154_CCA_MODE_SIGNAL
    RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI
    RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI
    RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT
    RAIL_IEEE802154_CCA_MODE_COUNT
}
```

**Description:**

Available CCA modes.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_cca_mode_t](ieee802-15-4#sl-rail-ieee802154-cca-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_CCA_MODE_RSSI|RSSI-based CCA.|
|RAIL_IEEE802154_CCA_MODE_SIGNAL|Signal Identifier-based CCA.|
|RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI|RSSI or signal identifier-based CCA.|
|RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI|RSSI and signal identifier-based CCA.|
|RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT|ALOHA.|
|RAIL_IEEE802154_CCA_MODE_COUNT|Number of CCA modes.|

###### RAIL_IEEE802154_SignalIdentifierMode_t (heading level 7)

```
enum RAIL_IEEE802154_SignalIdentifierMode_t {
    RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE = 0
    RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154
}
```

**Description:**

Available Signal identifier modes.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_signal_identifier_mode_t](ieee802-15-4#sl-rail-ieee802154-signal-identifier-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE|Disable signal detection mode.|
|RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154|2.4 GHz 802.15.4 signal detection mode.|

###### sl_rail_ieee802154_address_length_t (heading level 7)

```
enum sl_rail_ieee802154_address_length_t {
    SL_RAIL_IEEE802154_SHORT_ADDRESS = 2
    SL_RAIL_IEEE802154_LONG_ADDRESS = 3
}
```

**Description:**

Different lengths that an 802.15.4 address can have.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_SHORT_ADDRESS|2 byte short address.|
|SL_RAIL_IEEE802154_LONG_ADDRESS|8 byte extended address.|

###### sl_rail_ieee802154_phy_t (heading level 7)

```
enum sl_rail_ieee802154_phy_t {
    SL_RAIL_IEEE802154_PHY_2P4_GHZ = 0x00u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV = 0x01u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_COEX = 0x02u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV_COEX = 0x03u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM = 0x08u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV = 0x09u
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_COEX = 0x0Au
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV_COEX = 0x0Bu
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_2_MBPS = 0x0Du
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_RX_CH_SWITCHING = 0x0Eu
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_1_MBPS_FEC = 0x0Fu
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FCS_2_MBPS = 0x10U
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_FCS_1_MBPS_FEC = 0x11U
    SL_RAIL_IEEE802154_PHY_2P4_GHZ_RX_DUTY_CYCLING = 0x12U
    SL_RAIL_IEEE802154_PHY_863_MHZ_GB868 = 0x85u
    SL_RAIL_IEEE802154_PHY_915_MHZ_GB868 = 0x86u
}
```

**Description:**

The 802.15.4 PHY identifier (aka PTI radio configuration id).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ|Built-in 2.4 GHz 802.15.4 radio configuration.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_COEX|Built-in 2.4 GHz 802.15.4 radio configuration optimized for radio coexistence.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_ANT_DIV_COEX|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for radio coexistence.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM|Built-in 2.4 GHz 802.15.4 radio configuration optimized for front end modules.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for front end modules.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_COEX|Built-in 2.4 GHz 802.15.4 radio configuration optimized for radio coexistence and front end modules.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FEM_ANT_DIV_COEX|Built-in 2.4 GHz 802.15.4 radio configuration with RX antenna diversity support optimized for radio coexistence and front end modules.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_2_MBPS|2Mbps 2.4 GHz operation (1-byte PHR).|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_RX_CH_SWITCHING|Built-in 2.4 GHz 802.15.4 radio configuration with RX channel switching support optimized.|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_1_MBPS_FEC|Built-in 2.4 GHz 802.15.4 radio configuration with mode switch to 1Mbps 2.4 GHz operation with forward error correction (1-byte PHR).|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FCS_2_MBPS|Built-in 2.4 GHz 802.15.4 radio configuration with RX channel switching and 2Mbps 2.4 GHz operation (1-byte PHR).|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_FCS_1_MBPS_FEC|Built-in 2.4 GHz 802.15.4 radio configuration with RX channel switching and 1Mbps 2.4 GHz operation with forward error correction (1-byte PHR).|
|SL_RAIL_IEEE802154_PHY_2P4_GHZ_RX_DUTY_CYCLING|Built-in 2.4 GHz 802.15.4 radio configuration with duty cycling.|
|SL_RAIL_IEEE802154_PHY_863_MHZ_GB868|Built-in 863 MHz GB868 802.15.4 radio configuration.|
|SL_RAIL_IEEE802154_PHY_915_MHZ_GB868|Built-in 915 MHz GB868 802.15.4 radio configuration.|

###### sl_rail_ieee802154_e_options_t (heading level 7)

```
enum sl_rail_ieee802154_e_options_t {
    SL_RAIL_IEEE802154_E_OPTION_GB868_SHIFT = 0
    SL_RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT = 1
    SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT = 2
}
```

**Description:**

802.15.4E-2012 options, in reality a bitmask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_E_OPTION_GB868_SHIFT|Shift position of [SL_RAIL_IEEE802154_E_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-e-option-gb868) bit.|
|SL_RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT|Shift position of [SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack) bit.|
|SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT|Shift position of [SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST](ieee802-15-4#sl-rail-ieee802154-e-option-implicit-broadcast) bit.|

###### sl_rail_ieee802154_g_options_t (heading level 7)

```
enum sl_rail_ieee802154_g_options_t {
    SL_RAIL_IEEE802154_G_OPTION_GB868_SHIFT = 0
    SL_RAIL_IEEE802154_G_OPTION_DYN_FEC_SHIFT = 1
    SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH_SHIFT = 2
}
```

**Description:**

802.15.4G-2012 options, in reality a bitmask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_G_OPTION_GB868_SHIFT|Shift position of [SL_RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-g-option-gb868) bit.|
|SL_RAIL_IEEE802154_G_OPTION_DYN_FEC_SHIFT|Shift position of [SL_RAIL_IEEE802154_G_OPTION_DYN_FEC](ieee802-15-4#sl-rail-ieee802154-g-option-dyn-fec) bit.|
|SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH_SHIFT|Shift position of [SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH](ieee802-15-4#sl-rail-ieee802154-g-option-wi-sun-mode-switch) bit.|

###### sl_rail_ieee802154_cca_mode_t (heading level 7)

```
enum sl_rail_ieee802154_cca_mode_t {
    SL_RAIL_IEEE802154_CCA_MODE_RSSI = 0u
    SL_RAIL_IEEE802154_CCA_MODE_SIGNAL = 1u
    SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI = 2u
    SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI = 3u
    SL_RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT = 4u
    SL_RAIL_IEEE802154_CCA_MODE_COUNT
}
```

**Description:**

Available CCA modes.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_CCA_MODE_RSSI|RSSI-based CCA.|
|SL_RAIL_IEEE802154_CCA_MODE_SIGNAL|Signal Identifier-based CCA.|
|SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI|RSSI or signal identifier-based CCA.|
|SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI|RSSI and signal identifier-based CCA.|
|SL_RAIL_IEEE802154_CCA_MODE_ALWAYS_TRANSMIT|ALOHA.|
|SL_RAIL_IEEE802154_CCA_MODE_COUNT|Number of CCA modes.|

###### sl_rail_ieee802154_signal_identifier_mode_t (heading level 7)

```
enum sl_rail_ieee802154_signal_identifier_mode_t {
    SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE = 0u
    SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154 = 1u
    SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154_WITH_AGC_RESET = 2u
}
```

**Description:**

Available Signal identifier modes.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_DISABLE|Disable signal detection mode.|
|SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154|2.4 GHz 802.15.4 signal detection mode with SI block reset on GPIO falling edge (via PRS).|
|SL_RAIL_IEEE802154_SIGNAL_IDENTIFIER_MODE_154_WITH_AGC_RESET|2.4 GHz 802.15.4 signal detection mode with SI block reset on AGC negative step.|

###### Typedefs

###### sl_rail_ieee802154_phy_features_t (heading level 7)

`sl_rail_ieee802154_phy_features_t`

**Description:**

The 802.15.4 PHY feature bitmask.

###### Functions

###### RAIL_IEEE802154_Init (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Init(RAIL_Handle_t railHandle, const RAIL_IEEE802154_Config_t *config)`

**Description:** Initialize RAIL for IEEE802.15.4 features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_IEEE802154_Config_t](rail-ieee802154-config-t) *|[in]|config|A non-NULL pointer to an IEEE802154 configuration structure.|

**Returns**

- Status code indicating success of the function call.

This function calls the following RAIL functions to configure the radio for IEEE802.15.4 features.

Initializes the following:

- Enables IEEE802154 hardware acceleration
- Configures RAIL Auto Ack functionality
- Configures RAIL Address Filter for 802.15.4 address filtering

It saves having to call the following functions individually:

- [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack)
- [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions)
- [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions)
- [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo)
- [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing)
- [RAIL_ConfigAddressFilter()](address-filtering#rail-config-address-filter)
- [RAIL_EnableAddressFilter()](address-filtering#rail-enable-address-filter)

It must be called before most of the RAIL_IEEE802154_* functions.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init). 

###### RAIL_IEEE802154_Config2p4GHzRadio (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadio(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio). 

###### RAIL_IEEE802154_Config2p4GHzRadioAntDiv (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioAntDiv(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div). 

###### RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for radio coexistence.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity optimized for radio coexistence. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex). 

###### RAIL_IEEE802154_Config2p4GHzRadioCoex (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioCoex(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation optimized for radio coexistence.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports radio coexistence. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_coex()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex). 

###### RAIL_IEEE802154_Config2p4GHzRadioFem (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioFem(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports a front end module. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-fem). 

###### RAIL_IEEE802154_Config2p4GHzRadioAntDivFem (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioAntDivFem(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity and a front end module. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-fem). 

###### RAIL_IEEE802154_Config2p4GHzRadioCoexFem (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioCoexFem(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation optimized for radio coexistence and a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports radio coexistence and a front end module. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex-fem). 

###### RAIL_IEEE802154_Config2p4GHzRadioAntDivCoexFem (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioAntDivCoexFem(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for radio coexistence and a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity, radio coexistence and a front end module. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex-fem). 

###### RAIL_IEEE802154_Config2p4GHzRadioCustom1 (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Config2p4GHzRadioCustom1(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with custom settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

It enables better interoperability with some proprietary PHYs, but doesn't guarantee data sheet performance.

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation with custom settings. It replaces needing to call [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). Do not call this function unless instructed by Silicon Labs.

**Note**

- This feature is only available on platforms where [RAIL_IEEE802154_SUPPORTS_CUSTOM1_PHY](features#rail-ieee802154-supports-custom1-phy-1) is true.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3; it is no longer supported. 

###### RAIL_IEEE802154_ConfigGB863MHzRadio (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigGB863MHzRadio(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for Sub-GHz GB868 863 MHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for Sub-GHz GB868 863 MHz operation. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, GB868 channels in the 863 MHz band (channel pages 28, 29, and 30 – logical channels 0x80..0x9A, 0xA0..0xA8, 0xC0..0xDA, respectively) will be available, as defined by Rev 22 of the Zigbee Specification, 2017 document 05-3474-22, section D.10.2.1.3.2.

**Note**

- This call implicitly enables [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_gb863_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb863-mhz-radio). 

###### RAIL_IEEE802154_ConfigGB915MHzRadio (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigGB915MHzRadio(RAIL_Handle_t railHandle)`

**Description:** Configure the radio for Sub-GHz GB868 915 MHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for Sub-GHz GB868 915 MHz operation. It takes the place of calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels). After this call, GB868 channels in the 915 MHz band (channel page 31 – logical channels 0xE0..0xFA) will be available, as defined by Rev 22 of the Zigbee Specification, 2017 document 05-3474-22, section D.10.2.1.3.2.

**Note**

- This call implicitly enables [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_gb915_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb915-mhz-radio). 

###### RAIL_IEEE802154_Deinit (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_Deinit(RAIL_Handle_t railHandle)`

**Description:** De-initialize IEEE802.15.4 hardware acceleration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Disables and resets all IEE802.15.4 hardware acceleration features. This function should only be called when the radio is IDLE. This calls the following:

- [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing), to reset all timings to 100 us
- [RAIL_EnableAddressFilter()](address-filtering#rail-enable-address-filter) passing false for its enable parameter
- [RAIL_ResetAddressFilter()](address-filtering#rail-reset-address-filter)  
  **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_deinit()](ieee802-15-4#sl-rail-ieee802154-deinit).

###### RAIL_IEEE802154_IsEnabled (heading level 7)

`bool RAIL_IEEE802154_IsEnabled(RAIL_Handle_t railHandle)`

**Description:** Return whether IEEE802.15.4 hardware acceleration is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if IEEE802.15.4 hardware acceleration was enabled to start with and false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_is_enabled()](ieee802-15-4#sl-rail-ieee802154-is-enabled). 

###### RAIL_IEEE802154_GetPtiRadioConfig (heading level 7)

`RAIL_IEEE802154_PtiRadioConfig_t RAIL_IEEE802154_GetPtiRadioConfig(RAIL_Handle_t railHandle)`

**Description:** Return IEEE802.15.4 PTI radio config.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- PTI (Packet Trace Information) radio config Id.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_get_phy_id()](ieee802-15-4#sl-rail-ieee802154-get-phy-id). 

###### RAIL_IEEE802154_SetAddresses (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetAddresses(RAIL_Handle_t railHandle, const RAIL_IEEE802154_AddrConfig_t *addresses)`

**Description:** Configure the RAIL Address Filter for 802.15.4 filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_IEEE802154_AddrConfig_t](rail-ieee802154-addr-config-t) *|[in]|addresses|A pointer to the address information that should be used.|

**Returns**

- Status code indicating success of the function call. If this returns an error, the 802.15.4 address filter is in an undefined state.

Set up the 802.15.4 address filter to accept messages to the given addresses. This will return false if any of the addresses failed to be set. If NULL is passed in for addresses, all addresses will be set to their reset value.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_addresses()](ieee802-15-4#sl-rail-ieee802154-set-addresses). 

###### RAIL_IEEE802154_SetPanId (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetPanId(RAIL_Handle_t railHandle, uint16_t panId, uint8_t index)`

**Description:** Set a PAN Id for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|panId|The 16-bit PAN Id information. This will be matched against the destination PAN Id of incoming messages. The PAN Id is sent little endian over the air, meaning panId[7:0] is first in the payload followed by panId[15:8]. Set to 0xFFFF to disable for this index.|
|uint8_t|[in]|index|Indicates which PAN Id to set. Must be below [RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given PAN Id.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_pan_id()](ieee802-15-4#sl-rail-ieee802154-set-pan-id). 

###### RAIL_IEEE802154_SetShortAddress (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetShortAddress(RAIL_Handle_t railHandle, uint16_t shortAddr, uint8_t index)`

**Description:** Set a short address for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle of RAIL instance|
|uint16_t|[in]|shortAddr|16 bit short address value. This will be matched against the destination short address of incoming messages. The short address is sent little endian over the air meaning shortAddr[7:0] is first in the payload followed by shortAddr[15:8]. Set to 0xFFFF to disable for this index.|
|uint8_t|[in]|index|Which short address to set. Must be below [RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given short address.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_short_address()](ieee802-15-4#sl-rail-ieee802154-set-short-address). 

###### RAIL_IEEE802154_SetLongAddress (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetLongAddress(RAIL_Handle_t railHandle, const uint8_t *longAddr, uint8_t index)`

**Description:** Set a long address for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const uint8_t *|[in]|longAddr|A pointer to an 8-byte array containing the long address information. The long address must be in over-the-air byte order. This will be matched against the destination long address of incoming messages. Set to 0x00 00 00 00 00 00 00 00 to disable for this index.|
|uint8_t|[in]|index|Indicates which long address to set. Must be below [RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given long address.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_long_address()](ieee802-15-4#sl-rail-ieee802154-set-long-address). 

###### RAIL_IEEE802154_SetPanCoordinator (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetPanCoordinator(RAIL_Handle_t railHandle, bool isPanCoordinator)`

**Description:** Set whether the current node is a PAN coordinator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|isPanCoordinator|true if this device is a PAN coordinator.|

**Returns**

- Status code indicating success of the function call.

If the device is a PAN Coordinator, it will accept data and command frames with no destination address. This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_pan_coordinator()](ieee802-15-4#sl-rail-ieee802154-set-pan-coordinator). 

###### RAIL_IEEE802154_SetPromiscuousMode (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetPromiscuousMode(RAIL_Handle_t railHandle, bool enable)`

**Description:** Set whether to enable 802.15.4 promiscuous mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|true if all frames and addresses should be accepted.|

**Returns**

- Status code indicating success of the function call.

If promiscuous mode is enabled, no frame or address filtering steps will be performed other than checking the CRC. This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_promiscuous_mode()](ieee802-15-4#sl-rail-ieee802154-set-promiscuous-mode). 

###### RAIL_IEEE802154_ConfigEOptions (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigEOptions(RAIL_Handle_t railHandle, RAIL_IEEE802154_EOptions_t mask, RAIL_IEEE802154_EOptions_t options)`

**Description:** Configure certain 802.15.4E-2012 / 802.15.4-2015 Frame Version 2 features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t)|[in]|options|A bitmask containing desired options settings. Bit positions for each option are found in the [RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t).|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) or the platform does not support the feature(s). These settings may be changed at any time when 802.15.4 hardware acceleration is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_e_options()](ieee802-15-4#sl-rail-ieee802154-config-e-options). 

###### RAIL_IEEE802154_ConfigGOptions (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigGOptions(RAIL_Handle_t railHandle, RAIL_IEEE802154_GOptions_t mask, RAIL_IEEE802154_GOptions_t options)`

**Description:** Configure certain 802.15.4G-2012 / 802.15.4-2015 SUN PHY features (only for radio configurations designed accordingly).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t)|[in]|options|A bitmask containing desired options settings. Bit positions for each option are found in the [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t).|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init), the platform does not support the feature(s), the radio configuration is not appropriate, or the radio is not idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_g_options()](ieee802-15-4#sl-rail-ieee802154-config-g-options). 

###### RAIL_IEEE802154_ComputeChannelFromPhyModeId (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ComputeChannelFromPhyModeId(RAIL_Handle_t railHandle, uint8_t newPhyModeId, uint16_t *pChannel)`

**Description:** Compute channel to switch to given a targeted PHY Mode Id in the context of Wi-SUN mode switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|newPhyModeId|A targeted PHY Mode Id.|
|uint16_t *|[out]|pChannel|A pointer to the channel to switch to.|

**Returns**

- Status code indicating success of the function call.

This function will fail if:

- the targeted PHY Mode Id is the same as the current PHY Mode Id
- called on a platform that lacks [RAIL_IEEE802154_SUPPORTS_G_MODESWITCH](features#rail-ieee802154-supports-g-modeswitch)
- called on a platform that doesn't have 802154G options enabled by [RAIL_IEEE802154_ConfigGOptions()](ieee802-15-4#rail-ieee802154-config-g-options). For newPhyModeId associated with a FSK FEC_off PHY, if dynamic FEC is activated (see [RAIL_IEEE802154_G_OPTION_DYNFEC](ieee802-15-4#rail-ieee802154-g-option-dynfec)), the returned channel can correspond to the associated FSK FEC_on PHY corresponding then to PHY Mode Id = newPhyModeId + 16  
  **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_compute_channel_from_phy_mode_id()](ieee802-15-4#sl-rail-ieee802154-compute-channel-from-phy-mode-id).

###### RAILCb_IEEE802154_IsModeSwitchNewChannelValid (heading level 7)

`RAIL_Status_t RAILCb_IEEE802154_IsModeSwitchNewChannelValid(uint32_t currentBaseFreq, uint8_t newPhyModeId, const RAIL_ChannelConfigEntry_t *configEntryNewPhyModeId, uint16_t *pChannel)`

**Description:** Manage forbidden channels during mode switch.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint32_t|[in]|currentBaseFreq|The current frequency of the base channel.|
|uint8_t|[in]|newPhyModeId|A targeted PHY Mode Id.|
|const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *|[in]|configEntryNewPhyModeId|A pointer to [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) structure corresponding to the new PHY configEntry.|
|uint16_t *|[inout]|pChannel|A pointer to the channel to switch to. If channel is valid, the function must just return. If channel is forbidden, the function must update it with the closest valid channel. The highest channel must be selected in case of two valid channels being equidistant to a forbidden channel.|

**Returns**

- Status code indicating success of the function call. It must return [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) for failure or [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) for success.

This function must fail if no valid channel has been found. If so, RAIL will abort the mode switch.

**Note**

- This callback will only be called on platforms where [RAIL_IEEE802154_SUPPORTS_G_MODESWITCH](features#rail-ieee802154-supports-g-modeswitch) is true, [RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH](ieee802-15-4#rail-ieee802154-g-option-wisun-modeswitch) was successfully enabled, and a valid mode switch PHY header is received.

**Deprecated**RAIL 2.x synonym of [sl_railcb_ieee802154_is_mode_switch_new_channel_valid()](ieee802-15-4#sl-railcb-ieee802154-is-mode-switch-new-channel-valid). 

###### RAIL_IEEE802154_AcceptFrames (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_AcceptFrames(RAIL_Handle_t railHandle, uint8_t framesMask)`

**Description:** Set which 802.15.4 frame types to accept.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|framesMask|A mask containing which 802.15.4 frame types to receive.|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) or framesMask requests an unsupported frame type. This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. Only Beacon, Data, Ack, Command, and Multipurpose frames may be received. The RAIL_IEEE802154_ACCEPT_*_FRAMES defines may be combined to create a bitmask to pass into this function.

[RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#rail-ieee802154-accept-ack-frames) behaves slightly different than the other defines. If [RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#rail-ieee802154-accept-ack-frames) is set, the radio will accept an Ack frame during normal packet reception, but only a truly expected Ack will have its [RAIL_RxPacketDetails_t::isAck](rail-rx-packet-details-t#is-ack) true. If [RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#rail-ieee802154-accept-ack-frames) is not set, Ack frames will be filtered unless they're expected when the radio is waiting for an Ack.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_accept_frames()](ieee802-15-4#sl-rail-ieee802154-accept-frames). 

###### RAIL_IEEE802154_EnableEarlyFramePending (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_EnableEarlyFramePending(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable early Frame Pending lookup event notification ([RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command)).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|true to enable, false to disable.|

**Returns**

- Status code indicating success of the function call.

Normally, [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) is triggered after receiving the entire MAC header and MAC command byte for an Ack-requesting MAC command frame. Version 0/1 frames also require that command to be a Data Request for this event to occur. Enabling this feature causes this event to be triggered earlier to allow for more time to determine the type of Ack needed (Immediate or Enhanced) and/or perform frame pending lookup to influence the outgoing Ack by using [RAIL_IEEE802154_WriteEnhAck()](ieee802-15-4#rail-ieee802154-write-enh-ack) or [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending).

For Frame Version 0/1 packets and for Frame Version 2 packets when [RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#rail-ieee802154-e-option-enh-ack) is not in use, "early" means right after receiving the source address information in the MAC header.

For Frame Version 2 packets when [RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#rail-ieee802154-e-option-enh-ack) is in use, "early" means right after receiving any Auxiliary Security header which follows the source address information in the MAC header.

This feature is useful when the protocol knows an Ack-requesting MAC Command must be a data poll without needing to receive the MAC Command byte, giving it a bit more time to adjust Frame Pending or generate an Enhanced Ack.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init), or on platforms that do not support this feature. This setting may be changed at any time when 802.15.4 hardware acceleration is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_enable_early_frame_pending()](ieee802-15-4#sl-rail-ieee802154-enable-early-frame-pending). 

###### RAIL_IEEE802154_EnableDataFramePending (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_EnableDataFramePending(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable Frame Pending lookup event notification ([RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command)) for MAC Data frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|true to enable, false to disable.|

**Returns**

- Status code indicating success of the function call.

Normally [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) is triggered only for Ack-requesting MAC command frames. Enabling this feature causes this event to also be triggered for MAC data frames, at the same point in the packet as [RAIL_IEEE802154_EnableEarlyFramePending()](ieee802-15-4#rail-ieee802154-enable-early-frame-pending) would trigger. This feature is necessary to support the Thread Basil-Hayden Enhanced Frame Pending feature in Version 0/1 frames, and to support Version 2 Data frames which require an Enhanced Ack.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_enable_data_frame_pending()](ieee802-15-4#sl-rail-ieee802154-enable-data-frame-pending). 

###### RAIL_IEEE802154_SetFramePending (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetFramePending(RAIL_Handle_t railHandle)`

**Description:** Change the Frame Pending bit on the outgoing legacy Immediate Ack from the default specified by [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle of RAIL instance|

**Returns**

- Status code indicating success of the function call.

This function must only be called while processing the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) if the Ack for this packet should go out with its Frame Pending bit set differently than what was specified by [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).

It's intended only for use with 802.15.4 legacy immediate Acks and not 802.15.4E enhanced Acks. This will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is too late to modify the outgoing Immediate Ack.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending). 

###### RAIL_IEEE802154_GetAddress (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_GetAddress(RAIL_Handle_t railHandle, RAIL_IEEE802154_Address_t *pAddress)`

**Description:** Get the source address of the incoming data request.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IEEE802154_Address_t](rail-ieee802154-address-t) *|[out]|pAddress|A pointer to [RAIL_IEEE802154_Address_t](rail-ieee802154-address-t) structure to populate with source address information.|

**Returns**

- Status code indicating success of the function call.

This function must only be called when handling the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) event. This will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if the address information is stale (i.e., it is too late to affect the outgoing Ack).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_get_address()](ieee802-15-4#sl-rail-ieee802154-get-address). 

###### RAIL_IEEE802154_WriteEnhAck (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_WriteEnhAck(RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)`

**Description:** Write the Auto-Ack FIFO for the next outgoing 802.15.4E Enhanced Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const uint8_t *|[in]|ackData|A pointer to Ack data to transmit This may be NULL, in which case it's assumed the data has already been emplaced into the Ack buffer and RAIL just needs to be told how many bytes are there. Use [RAIL_GetAutoAckFifo()](auto-ack#rail-get-auto-ack-fifo) to get the address of RAIL's Auto-Ack buffer in RAM and its size.|
|uint16_t|[in]|ackDataLen|Length of Ack data, in bytes. If this exceeds [RAIL_AUTOACK_MAX_LENGTH](auto-ack#rail-autoack-max-length) the function will return [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).|

**Returns**

- Status code indicating success of the function call.

This function sets the Auto-Ack data to use in acknowledging the frame being received. It must only be called while processing the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command), and is intended for use when packet information from [RAIL_GetRxIncomingPacketInfo()](packet-information#rail-get-rx-incoming-packet-info) indicates an 802.15.4E Enhanced Ack must be sent instead of a legacy Immediate Ack. [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending) should not be called for an Enhanced Ack; instead the Enhanced Ack's Frame Control Field should have the Frame Pending bit set appropriately in its ackData. This will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is too late to write the outgoing Ack – a situation that will likely trigger a [RAIL_EVENT_TXACK_UNDERFLOW](events#rail-event-txack-underflow) event. When successful, the Enhanced ackData will only be sent once. Subsequent packets needing an Enhanced Ack will each need to call this function to write their Ack information.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_write_enh_ack()](ieee802-15-4#sl-rail-ieee802154-write-enh-ack). 

###### RAIL_IEEE802154_SetRxToEnhAckTx (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_SetRxToEnhAckTx(RAIL_Handle_t railHandle, RAIL_TransitionTime_t *pRxToEnhAckTx)`

**Description:** Set a separate RX packet to TX state transition turnaround time for sending an Enhanced Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TransitionTime_t](state-transitions#rail-transition-time-t) *|[inout]|pRxToEnhAckTx|A pointer to the turnaround transition requested for Enhanced Acks. It will be updated with the actual time set. Requesting a time of 0 will sync the Enhanced Ack turnaround time with that used for immediate Acks (and output 0). Requesting a time of [RAIL_TRANSITION_TIME_KEEP](state-transitions#rail-transition-time-keep) will output the current Enhanced Ack timing parameter (0 if it is the same as that used for Immediate Acks).|

**Returns**

- Status code indicating a success of the function call. An error will not update the pRxToEnhAckTx output parameter.

Normally Immediate and Enhanced Acks are both sent using the [RAIL_IEEE802154_Config_t::timings](rail-ieee802154-config-t#timings) rxToTx turnaround time. If the stack needs more time to prepare an Enhanced Ack, it can call this function after [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) to set a longer turnaround time used just for Enhanced Ack transmits.

This function will fail on platforms that lack [RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#rail-ieee802154-supports-e-enhanced-ack-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_set_rx_to_enh_ack_tx()](ieee802-15-4#sl-rail-ieee802154-set-rx-to-enh-ack-tx). 

###### RAIL_IEEE802154_ConvertRssiToLqi (heading level 7)

`uint8_t RAIL_IEEE802154_ConvertRssiToLqi(uint8_t origLqi, int8_t rssiDbm)`

**Description:** Convert RSSI into 802.15.4 Link Quality Indication (LQI) metric compatible with the Silicon Labs Zigbee stack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|origLqi|The original LQI, for example from [RAIL_RxPacketDetails_t::lqi](rail-rx-packet-details-t#lqi). This parameter is not currently used but may be used in the future.|
|int8_t|[in]|rssiDbm|The RSSI in dBm, for example from [RAIL_RxPacketDetails_t::rssi](rail-rx-packet-details-t#rssi).|

**Returns**

- An LQI value (range 0..255 but not all intermediate values are possible) based on the rssiDbm and the chip's RSSI sensitivity range.

This function is compatible with [RAIL_ConvertLqiCallback_t()](receive#rail-convert-lqi-callback-t) and is suitable to pass to [RAIL_ConvertLqi()](receive#rail-convert-lqi).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_convert_rssi_to_lqi()](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-lqi). 

###### RAIL_IEEE802154_ConvertRssiToEd (heading level 7)

`uint8_t RAIL_IEEE802154_ConvertRssiToEd(int8_t rssiDbm)`

**Description:** Convert RSSI into 802.15.4 Energy Detection (ED) metric compatible with the Silicon Labs Zigbee stack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|int8_t|[in]|rssiDbm|The RSSI in dBm, for example from [RAIL_RxPacketDetails_t::rssi](rail-rx-packet-details-t#rssi).|

**Returns**

- An Energy Detect value (range 0..255 but not all intermediate values are possible) based on the rssiDbm and the chip's RSSI sensitivity range.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_convert_rssi_to_ed()](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-ed). 

###### RAIL_IEEE802154_ConfigSignalIdentifier (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigSignalIdentifier(RAIL_Handle_t railHandle, RAIL_IEEE802154_SignalIdentifierMode_t signalIdentifierMode)`

**Description:** Configure signal identifier for 802.15.4 signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IEEE802154_SignalIdentifierMode_t](ieee802-15-4#rail-ieee802154-signal-identifier-mode-t)|[in]|signalIdentifierMode|Mode of signal identifier operation.|

This features allows detection of 2.4 GHz 802.15.4 signal on air. This function must be called once before [RAIL_IEEE802154_EnableSignalDetection()](ieee802-15-4#rail-ieee802154-enable-signal-detection) to configure and enable signal identifier.

To enable event for signal detection [RAIL_ConfigEvents()](events#rail-config-events) must be called for enabling [RAIL_EVENT_SIGNAL_DETECTED](events#rail-event-signal-detected).

This function is only supported by chips where [RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ieee802154-supports-signal-identifier-1) and [RAIL_IEEE802154_SupportsSignalIdentifier()](features#rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier). 

###### RAIL_IEEE802154_EnableSignalDetection (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_EnableSignalDetection(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable or disable signal identifier for 802.15.4 signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Signal detection is enabled if true, disabled if false.|

[RAIL_IEEE802154_ConfigSignalIdentifier()](ieee802-15-4#rail-ieee802154-config-signal-identifier) must be called once before calling this function to configure and enable signal identifier. Once a signal is detected signal detection will be turned off and this function should be called to re-enable the signal detection without needing to call [RAIL_IEEE802154_ConfigSignalIdentifier()](ieee802-15-4#rail-ieee802154-config-signal-identifier) if the signal identifier is already configured and enabled.

This function is only supported by chips where [RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ieee802154-supports-signal-identifier-1) and [RAIL_IEEE802154_SupportsSignalIdentifier()](features#rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_enable_signal_detection()](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection). 

###### RAIL_IEEE802154_ConfigCcaMode (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigCcaMode(RAIL_Handle_t railHandle, RAIL_IEEE802154_CcaMode_t ccaMode)`

**Description:** Set 802.15.4 CCA mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IEEE802154_CcaMode_t](ieee802-15-4#rail-ieee802154-cca-mode-t)|[in]|ccaMode|Mode of CCA operation.|

This function sets the CCA mode [RAIL_IEEE802154_CcaMode_t](ieee802-15-4#rail-ieee802154-cca-mode-t). If not called, RAIL_IEEE802154_CCA_MODE_RSSI (RSSI-based CCA) is used for CCA.

In [RAIL_IEEE802154_CCA_MODE_SIGNAL](ieee802-15-4#rail-ieee802154-cca-mode-signal), [RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI](ieee802-15-4#rail-ieee802154-cca-mode-signal-or-rssi) and [RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI](ieee802-15-4#rail-ieee802154-cca-mode-signal-and-rssi) the signal identifier is enabled for the duration of LBT. If previously enabled by [RAIL_IEEE802154_ConfigSignalIdentifier()](ieee802-15-4#rail-ieee802154-config-signal-identifier), the signal identifier will remain active until triggered.

This function is only supported by chips where [RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#rail-ieee802154-supports-signal-identifier-1) and [RAIL_IEEE802154_SupportsSignalIdentifier()](features#rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call. An error should be returned if ccaMode is unsuppported on a given device.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_cca_mode()](ieee802-15-4#sl-rail-ieee802154-config-cca-mode). 

###### RAIL_IEEE802154_ConfigRxChannelSwitching (heading level 7)

`RAIL_Status_t RAIL_IEEE802154_ConfigRxChannelSwitching(RAIL_Handle_t railHandle, const RAIL_IEEE802154_RxChannelSwitchingCfg_t *pConfig)`

**Description:** Configure RX channel switching for 802.15.4.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t) *|[in]|pConfig|A pointer to [RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t) structure. NULL will disable any switching previously set up. The feature can also be disabled by disabling [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching).|

**Returns**

- Status code indicating success of the function call. For series 3 parts: return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if IEEE 802.15.4 is not enabled via [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init), return RAIL_STATUS_NO_ERROR otherwise.

This function configures RX channel switching, allowing reception of 2.4 GHz 802.15.4 signals on two different radio channels within the same PHY. This function should be called once before [RAIL_StartRx()](receive#rail-start-rx) and/or enabling [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching).

When [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching) is enabled, channel switching will occur during normal listening but is suspended when starting any kind of transmit, including scheduled or CSMA transmits. It remains suspended after a [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack) transmit until the Ack is received or times out.

When [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching) is disabled after switching has been active, the radio could be left listening on either channel, so the application should call [RAIL_StartRx()](receive#rail-start-rx) to put it on the desired non-switching channel.

**Note**

- Switching is cancelled on any PHY change, so this function would need to be re-called to reestablish switching after such a change. When RX channel switching is active, receive sensitivity and performance are slightly impacted.
- Switching is stopped on any channel change that is not from [RAIL_IEEE802154_RxChannelSwitchingCfg_t](rail-ieee802154-rx-channel-switching-cfg-t) but is resumed on configuring back the appropriate channel.

**Note**

- For series 2 parts: If the two channels are same, the function behaves the same as if pConfig was NULL.
- IEEE 802.15.4 must be enabled via [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init), and the radio must be in the idle state when configuring RX channel switching. A DMA channel must be allocated with [RAIL_UseDma()](general#rail-use-dma) or by incorporating the [Direct Memory Access (DMA) Utility](rail-util-dma) plugin; otherwise this API will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call). This feature also requires a PRS channel, internally allocated by the RAIL library, to use and hold onto for future use. If no PRS channel is available, the function returns [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).
- This function internally uses [RAIL_EnableCacheSynthCal()](state-transitions#rail-enable-cache-synth-cal) to enable/disable the sequencer cache to store the synth calibration value.

**Warnings**

- For series 2 parts, this function relies on LDMA access and RAIL is meant to run in TrustZone non-secure world, it is not supported if LDMA is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Note**

- For series 3 parts:
- IEEE 802.15.4 must be enabled via [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init).
- If the two channels are same, the function will do channel switching on a single frequency but will still duty cycle if PHY allows it.
- [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching) is only considered when [RAIL_StartRx()](receive#rail-start-rx) or [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel) is called, not instantly.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_rx_channel_switching()](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching). 

###### sl_rail_ieee802154_init (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_init(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_config_t *p_config)`

**Description:** Initialize RAIL for IEEE802.15.4 features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ieee802154_config_t](sl-rail-ieee802154-config-t) *|[in]|p_config|A non-NULL pointer to an IEEE802154 configuration structure.|

**Returns**

- Status code indicating success of the function call.

This function calls the following RAIL functions to configure the radio for IEEE802.15.4 features.

Initializes the following:

- Enables IEEE802154 hardware acceleration
- Configures RAIL Auto Ack functionality
- Configures RAIL Address Filter for 802.15.4 address filtering

It saves having to call the following functions individually:

- [sl_rail_config_auto_ack()](auto-ack#sl-rail-config-auto-ack)
- [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions)
- [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions)
- [sl_rail_write_auto_ack_fifo()](auto-ack#sl-rail-write-auto-ack-fifo)
- [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing)
- [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter)
- [sl_rail_enable_address_filter()](address-filtering#sl-rail-enable-address-filter)

It must be called before most of the sl_rail_ieee802154_* functions. 

###### sl_rail_ieee802154_config_2p4_ghz_radio (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_ant_div (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_ant_div(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for radio coexistence.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity optimized for radio coexistence. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_coex (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_coex(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation optimized for radio coexistence.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports radio coexistence. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_fem (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_fem(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports a front end module. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity and a front end module. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation optimized for radio coexistence and a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports radio coexistence and a front end module. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for 2.4 GHz 802.15.4 operation with antenna diversity optimized for radio coexistence and a front end module.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 2.4 GHz operation, but with a configuration that supports antenna diversity, radio coexistence and a front end module. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_config_gb863_mhz_radio (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_gb863_mhz_radio(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for Sub-GHz GB868 863 MHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for Sub-GHz GB868 863 MHz operation. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, GB868 channels in the 863 MHz band (channel pages 28, 29, and 30 – logical channels 0x80..0x9A, 0xA0..0xA8, 0xC0..0xDA, respectively) will be available, as defined by Rev 22 of the Zigbee Specification, 2017 document 05-3474-22, section D.10.2.1.3.2.

**Note**

- This call implicitly enables [SL_RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-g-option-gb868).

###### sl_rail_ieee802154_config_gb915_mhz_radio (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_gb915_mhz_radio(sl_rail_handle_t rail_handle)`

**Description:** Configure the radio for Sub-GHz GB868 915 MHz 802.15.4 operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for Sub-GHz GB868 915 MHz operation. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, GB868 channels in the 915 MHz band (channel page 31 – logical channels 0xE0..0xFA) will be available, as defined by Rev 22 of the Zigbee Specification, 2017 document 05-3474-22, section D.10.2.1.3.2.

**Note**

- This call implicitly enables [SL_RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-g-option-gb868).

###### sl_rail_ieee802154_deinit (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_deinit(sl_rail_handle_t rail_handle)`

**Description:** De-initialize IEEE802.15.4 hardware acceleration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Disables and resets all IEE802.15.4 hardware acceleration features. This function should only be called when the radio is IDLE. This calls the following:

- [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing), to reset all timings to 100 us
- [sl_rail_enable_address_filter()](address-filtering#sl-rail-enable-address-filter) passing false for its enable parameter
- [sl_rail_reset_address_filter()](address-filtering#sl-rail-reset-address-filter)

###### sl_rail_ieee802154_is_enabled (heading level 7)

`bool sl_rail_ieee802154_is_enabled(sl_rail_handle_t rail_handle)`

**Description:** Return whether IEEE802.15.4 hardware acceleration is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if IEEE802.15.4 hardware acceleration was enabled to start with and false otherwise.

###### sl_rail_ieee802154_config_channels (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_channel_config, sl_rail_ieee802154_phy_t phy_id)`

**Description:** Load an 802.15.4 channel config.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_channel_config_t](sl-rail-channel-config-t) *|N/A|p_channel_config|A pointer to a channel configuration.|
|[sl_rail_ieee802154_phy_t](ieee802-15-4#sl-rail-ieee802154-phy-t)|N/A|phy_id|PTI config ID.|

**Returns**

- Status code indicating success of the function call.

This initializes the radio for 802.15.4 operation. It takes the place of calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). After this call, channels 11-26 will be available, giving the frequencies of those channels on channel page 0, as defined by IEEE 802.15.4-2011 section 8.1.2.2. The channelConfig can potentially define additional channels outside of the range 11-26.

**Note**

- This call implicitly disables all [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).

###### sl_rail_ieee802154_get_phy_id (heading level 7)

`sl_rail_ieee802154_phy_t sl_rail_ieee802154_get_phy_id(sl_rail_handle_t rail_handle)`

**Description:** Return IEEE802.15.4 PHY identifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- PHY identifier (aka PTI radio config id).

###### sl_rail_ieee802154_set_addresses (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_addresses(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_addr_config_t *p_addresses)`

**Description:** Configure the RAIL Address Filter for 802.15.4 filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ieee802154_addr_config_t](sl-rail-ieee802154-addr-config-t) *|[in]|p_addresses|A pointer to the address information that should be used.|

**Returns**

- Status code indicating success of the function call. If this returns an error, the 802.15.4 address filter is in an undefined state.

Set up the 802.15.4 address filter to accept messages to the given addresses. This will return false if any of the addresses failed to be set. If NULL is passed in for p_addresses, all addresses will be set to their reset value. 

###### sl_rail_ieee802154_set_pan_id (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_pan_id(sl_rail_handle_t rail_handle, uint16_t pan_id, uint8_t index)`

**Description:** Set a PAN Id for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|pan_id|The 16-bit PAN Id information. This will be matched against the destination PAN Id of incoming messages. The PAN Id is sent little endian over the air, meaning pan_id<7:0> is first in the payload followed by pan_id<15:8>. Set to 0xFFFF to disable for this index.|
|uint8_t|[in]|index|Indicates which PAN Id to set. Must be below [SL_RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#sl-rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given PAN Id. 

###### sl_rail_ieee802154_set_short_address (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_short_address(sl_rail_handle_t rail_handle, uint16_t short_addr, uint8_t index)`

**Description:** Set a short address for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|short_addr|A 16 bit short address value. This will be matched against the destination short address of incoming messages. The short address is sent little endian over the air meaning short_addr<7:0> is first in the payload followed by short_addr<15:8>. Set to 0xFFFF to disable for this index.|
|uint8_t|[in]|index|Which short address to set. Must be below [SL_RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#sl-rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given short address. 

###### sl_rail_ieee802154_set_long_address (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_long_address(sl_rail_handle_t rail_handle, const uint8_t *p_long_addr, uint8_t index)`

**Description:** Set a long address for 802.15.4 address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const uint8_t *|[in]|p_long_addr|A pointer to an 8-byte array containing the long address information. The long address must be in over-the-air byte order. This will be matched against the destination long address of incoming messages. Set to 0x00 00 00 00 00 00 00 00 to disable for this index.|
|uint8_t|[in]|index|Indicates which long address to set. Must be below [SL_RAIL_IEEE802154_MAX_ADDRESSES](ieee802-15-4#sl-rail-ieee802154-max-addresses).|

**Returns**

- Status code indicating success of the function call.

Set up the 802.15.4 address filter to accept messages to the given long address. 

###### sl_rail_ieee802154_set_pan_coordinator (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_pan_coordinator(sl_rail_handle_t rail_handle, bool is_pan_coordinator)`

**Description:** Set whether the current node is a PAN coordinator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|is_pan_coordinator|true if this device is a PAN coordinator.|

**Returns**

- Status code indicating success of the function call.

If the device is a PAN Coordinator, it will accept data and command frames with no destination address. This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. 

###### sl_rail_ieee802154_set_promiscuous_mode (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_promiscuous_mode(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Set whether to enable 802.15.4 promiscuous mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|true if all frames and addresses should be accepted.|

**Returns**

- Status code indicating success of the function call.

If promiscuous mode is enabled, no frame or address filtering steps will be performed other than checking the CRC. This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. 

###### sl_rail_ieee802154_config_e_options (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_e_options(sl_rail_handle_t rail_handle, sl_rail_ieee802154_e_options_t mask, sl_rail_ieee802154_e_options_t options)`

**Description:** Configure certain 802.15.4E-2012 / 802.15.4-2015 Frame Version 2 features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ieee802154_e_options_t](ieee802-15-4#sl-rail-ieee802154-e-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[sl_rail_ieee802154_e_options_t](ieee802-15-4#sl-rail-ieee802154-e-options-t)|[in]|options|A bitmask containing desired options settings. Bit positions for each option are found in the [sl_rail_ieee802154_e_options_t](ieee802-15-4#sl-rail-ieee802154-e-options-t).|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init) or the platform does not support the feature(s). These settings may be changed at any time when 802.15.4 hardware acceleration is enabled. 

###### sl_rail_ieee802154_config_g_options (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_g_options(sl_rail_handle_t rail_handle, sl_rail_ieee802154_g_options_t mask, sl_rail_ieee802154_g_options_t options)`

**Description:** Configure certain 802.15.4G-2012 / 802.15.4-2015 SUN PHY features (only for radio configurations designed accordingly).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t)|[in]|options|A bitmask containing desired options settings. Bit positions for each option are found in the [sl_rail_ieee802154_g_options_t](ieee802-15-4#sl-rail-ieee802154-g-options-t).|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init), the platform does not support the feature(s), the radio configuration is not appropriate, or the radio is not idle. 

###### sl_rail_ieee802154_compute_channel_from_phy_mode_id (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_compute_channel_from_phy_mode_id(sl_rail_handle_t rail_handle, uint8_t new_phy_mode_id, uint16_t *p_channel)`

**Description:** Compute channel to switch to given a targeted PHY Mode Id in the context of Wi-SUN mode switching.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|new_phy_mode_id|A targeted PHY Mode Id.|
|uint16_t *|[out]|p_channel|A pointer to the channel to switch to.|

**Returns**

- Status code indicating success of the function call.

This function will fail if:

- the targeted phy_mode_id is the same as the current PHY Mode Id
- called on a platform that lacks [SL_RAIL_IEEE802154_SUPPORTS_G_MODE_SWITCH](features#sl-rail-ieee802154-supports-g-mode-switch-1)
- called on a platform that doesn't have 802154G options enabled by [sl_rail_ieee802154_config_g_options()](ieee802-15-4#sl-rail-ieee802154-config-g-options). For new_phy_mode_id associated with a FSK FEC_off PHY, if dynamic FEC is activated (see [SL_RAIL_IEEE802154_G_OPTION_DYN_FEC](ieee802-15-4#sl-rail-ieee802154-g-option-dyn-fec)), the returned channel can correspond to the associated FSK FEC_on PHY corresponding then to PHY Mode Id = new_phy_mode_id + 16

###### sl_railcb_ieee802154_is_mode_switch_new_channel_valid (heading level 7)

`sl_rail_status_t sl_railcb_ieee802154_is_mode_switch_new_channel_valid(sl_rail_handle_t rail_handle, uint32_t current_base_freq_hz, uint8_t new_phy_mode_id, const sl_rail_channel_config_entry_t *p_config_entry_new_phy_mode_id, uint16_t *p_channel)`

**Description:** Manage forbidden channels during mode switch.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|The real RAIL instance handle issuing the callback.|
|uint32_t|[in]|current_base_freq_hz|The current frequency of the base channel.|
|uint8_t|[in]|new_phy_mode_id|A targeted PHY Mode Id.|
|const [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t) *|[in]|p_config_entry_new_phy_mode_id|A pointer to [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t) structure corresponding to the new PHY config_entry.|
|uint16_t *|[inout]|p_channel|A pointer to the channel to switch to. If channel is valid, the function must just return. If channel is forbidden, the function must update it with the closest valid channel. The highest channel must be selected in case of two valid channels being equidistant to a forbidden channel.|

**Returns**

- Status code indicating success of the function call. It must return [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) for failure or [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) for success.

This function must fail if no valid channel has been found. If so, RAIL will abort the mode switch.

**Note**

- This callback will only be called on platforms where [SL_RAIL_IEEE802154_SUPPORTS_G_MODE_SWITCH](features#sl-rail-ieee802154-supports-g-mode-switch-1) is true, [SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH](ieee802-15-4#sl-rail-ieee802154-g-option-wi-sun-mode-switch) was successfully enabled, and a valid mode switch PHY header is received.

###### sl_rail_ieee802154_accept_frames (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_accept_frames(sl_rail_handle_t rail_handle, uint8_t frames_mask)`

**Description:** Set which 802.15.4 frame types to accept.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|frames_mask|A mask containing which 802.15.4 frame types to receive.|

**Returns**

- Status code indicating success of the function call.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init) or frames_mask requests an unsupported frame type. This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. Only Beacon, Data, Ack, Command, and Multipurpose frames may be received. The SL_RAIL_IEEE802154_ACCEPT_*_FRAMES defines may be combined to create a bitmask to pass into this function.

[SL_RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-ack-frames) behaves slightly different than the other defines. If [SL_RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-ack-frames) is set, the radio will accept an Ack frame during normal packet reception, but only a truly expected Ack will have its [sl_rail_rx_packet_details_t::is_ack](sl-rail-rx-packet-details-t#is-ack) true. If [SL_RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#sl-rail-ieee802154-accept-ack-frames) is not set, Ack frames will be filtered unless they're expected when the radio is waiting for an Ack. 

###### sl_rail_ieee802154_enable_early_frame_pending (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_enable_early_frame_pending(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable early Frame Pending lookup event notification ([SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command)).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|true to enable, false to disable.|

**Returns**

- Status code indicating success of the function call.

Normally, [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) is triggered after receiving the entire MAC header and MAC command byte for an Ack-requesting MAC command frame. Version 0/1 frames also require that command to be a Data Request for this event to occur. Enabling this feature causes this event to be triggered earlier to allow for more time to determine the type of Ack needed (Immediate or Enhanced) and/or perform frame pending lookup to influence the outgoing Ack by using [sl_rail_ieee802154_write_enh_ack()](ieee802-15-4#sl-rail-ieee802154-write-enh-ack) or [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending).

For Frame Version 0/1 packets and for Frame Version 2 packets when [SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack) is not in use, "early" means right after receiving the source address information in the MAC header.

For Frame Version 2 packets when [SL_RAIL_IEEE802154_E_OPTION_ENH_ACK](ieee802-15-4#sl-rail-ieee802154-e-option-enh-ack) is in use, "early" means right after receiving any Auxiliary Security header which follows the source address information in the MAC header.

This feature is useful when the protocol knows an Ack-requesting MAC Command must be a data poll without needing to receive the MAC Command byte, giving it a bit more time to adjust Frame Pending or generate an Enhanced Ack.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init), or on platforms that do not support this feature. This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. 

###### sl_rail_ieee802154_enable_data_frame_pending (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_enable_data_frame_pending(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable Frame Pending lookup event notification ([SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command)) for MAC Data frames.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|true to enable, false to disable.|

**Returns**

- Status code indicating success of the function call.

Normally [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) is triggered only for Ack-requesting MAC command frames. Enabling this feature causes this event to also be triggered for MAC data frames, at the same point in the packet as [sl_rail_ieee802154_enable_early_frame_pending()](ieee802-15-4#sl-rail-ieee802154-enable-early-frame-pending) would trigger. This feature is necessary to support the Thread Basil-Hayden Enhanced Frame Pending feature in Version 0/1 frames, and to support Version 2 Data frames which require an Enhanced Ack.

This function will fail if 802.15.4 hardware acceleration is not currently enabled by calling [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init). This setting may be changed at any time when 802.15.4 hardware acceleration is enabled. 

###### sl_rail_ieee802154_toggle_frame_pending (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_toggle_frame_pending(sl_rail_handle_t rail_handle)`

**Description:** Change the Frame Pending bit on the outgoing legacy Immediate Ack from the default specified by [sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks](sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function must only be called while processing the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) if the Ack for this packet should go out with its Frame Pending bit set differently than what was specified by [sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks](sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).

It's intended only for use with 802.15.4 legacy immediate Acks and not 802.15.4E enhanced Acks. This will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is too late to modify the outgoing Immediate Ack. 

###### sl_rail_ieee802154_get_address (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_get_address(sl_rail_handle_t rail_handle, sl_rail_ieee802154_address_t *p_address)`

**Description:** Get the source address of the incoming data request.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t) *|[out]|p_address|A pointer to [sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t) structure to populate with source address information.|

**Returns**

- Status code indicating success of the function call.

This function must only be called when handling the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) event. This will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if the address information is stale (i.e., it is too late to affect the outgoing Ack). 

###### sl_rail_ieee802154_write_enh_ack (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_write_enh_ack(sl_rail_handle_t rail_handle, const uint8_t *p_ack_data, uint16_t ack_data_bytes)`

**Description:** Write the Auto-Ack FIFO for the next outgoing 802.15.4E Enhanced Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const uint8_t *|[in]|p_ack_data|A pointer to Ack data to transmit This may be NULL, in which case it's assumed the data has already been emplaced into the Ack buffer and RAIL just needs to be told how many bytes are there. Use [sl_rail_get_auto_ack_fifo()](auto-ack#sl-rail-get-auto-ack-fifo) to get the address of RAIL's Auto-Ack buffer in RAM and its size.|
|uint16_t|[in]|ack_data_bytes|Length of Ack data, in bytes. If this exceeds the size of the Auto-Ack FIFO buffer the function will return [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).|

**Returns**

- Status code indicating success of the function call.

This function sets the Auto-Ack data to use in acknowledging the frame being received. It must only be called while processing the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command), and is intended for use when packet information from [sl_rail_get_rx_incoming_packet_info()](packet-information#sl-rail-get-rx-incoming-packet-info) indicates an 802.15.4E Enhanced Ack must be sent instead of a legacy Immediate Ack. [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending) should not be called for an Enhanced Ack; instead the Enhanced Ack's Frame Control Field should have the Frame Pending bit set appropriately in its p_ack_data. This will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is too late to write the outgoing Ack – a situation that will likely trigger a [SL_RAIL_EVENT_TXACK_UNDERFLOW](events#sl-rail-event-txack-underflow) event. When successful, the Enhanced p_ack_data will only be sent once. Subsequent packets needing an Enhanced Ack will each need to call this function to write their Ack information. 

###### sl_rail_ieee802154_set_rx_to_enh_ack_tx (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_set_rx_to_enh_ack_tx(sl_rail_handle_t rail_handle, sl_rail_transition_time_t *p_rx_to_enh_ack_tx)`

**Description:** Set a separate RX packet to TX state transition turnaround time for sending an Enhanced Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_transition_time_t](state-transitions#sl-rail-transition-time-t) *|[inout]|p_rx_to_enh_ack_tx|A pointer to the turnaround transition requested for Enhanced Acks. It will be updated with the actual time set. Requesting a time of 0 will sync the Enhanced Ack turnaround time with that used for immediate Acks (and output 0). Requesting a time of [SL_RAIL_TRANSITION_TIME_KEEP](state-transitions#sl-rail-transition-time-keep) will output the current Enhanced Ack timing parameter (0 if it is the same as that used for Immediate Acks).|

**Returns**

- Status code indicating a success of the function call. An error will not update the p_rx_to_enh_ack_tx output parameter.

Normally Immediate and Enhanced Acks are both sent using the [sl_rail_ieee802154_config_t::timings](sl-rail-ieee802154-config-t#timings) rx_to_tx turnaround time. If the stack needs more time to prepare an Enhanced Ack, it can call this function after [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init) to set a longer turnaround time used just for Enhanced Ack transmits.

This function will fail on platforms that lack [SL_RAIL_IEEE802154_SUPPORTS_E_ENHANCED_ACK](features#sl-rail-ieee802154-supports-e-enhanced-ack-1). 

###### sl_rail_ieee802154_convert_rssi_to_lqi (heading level 7)

`uint8_t sl_rail_ieee802154_convert_rssi_to_lqi(uint8_t orig_lqi, int8_t rssi_dbm)`

**Description:** Convert RSSI into 802.15.4 Link Quality Indication (LQI) metric compatible with the Silicon Labs Zigbee stack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|orig_lqi|The original LQI, for example from [sl_rail_rx_packet_details_t::lqi](sl-rail-rx-packet-details-t#lqi). This parameter is not currently used but may be used in the future.|
|int8_t|[in]|rssi_dbm|The RSSI in dBm, for example from [sl_rail_rx_packet_details_t::rssi_dbm](sl-rail-rx-packet-details-t#rssi-dbm).|

**Returns**

- An LQI value (range 0..255 but not all intermediate values are possible) based on the rssi_dbm and the chip's RSSI sensitivity range.

This function is compatible with [sl_rail_convert_lqi_callback_t()](receive#sl-rail-convert-lqi-callback-t) and is suitable to pass to [sl_rail_convert_lqi()](receive#sl-rail-convert-lqi). 

###### sl_rail_ieee802154_convert_rssi_to_ed (heading level 7)

`uint8_t sl_rail_ieee802154_convert_rssi_to_ed(int8_t rssi_dbm)`

**Description:** Convert RSSI into 802.15.4 Energy Detection (ED) metric compatible with the Silicon Labs Zigbee stack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|int8_t|[in]|rssi_dbm|The RSSI in dBm, for example from [sl_rail_rx_packet_details_t::rssi_dbm](sl-rail-rx-packet-details-t#rssi-dbm).|

**Returns**

- An Energy Detect value (range 0..255 but not all intermediate values are possible) based on the rssiDbm and the chip's RSSI sensitivity range.

###### sl_rail_ieee802154_config_signal_identifier (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_signal_identifier(sl_rail_handle_t rail_handle, sl_rail_ieee802154_signal_identifier_mode_t signal_identifier_mode)`

**Description:** Configure signal identifier for 802.15.4 signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ieee802154_signal_identifier_mode_t](ieee802-15-4#sl-rail-ieee802154-signal-identifier-mode-t)|[in]|signal_identifier_mode|Mode of signal identifier operation.|

This features allows detection of 2.4 GHz 802.15.4 signal on air. This function must be called once before [sl_rail_ieee802154_enable_signal_detection()](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection) to configure and enable signal identifier.

To enable event for signal detection [sl_rail_config_events()](events#sl-rail-config-events) must be called for enabling [SL_RAIL_EVENT_SIGNAL_DETECTED](events#sl-rail-event-signal-detected).

This function is only supported by chips where [SL_RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ieee802154-supports-signal-identifier-1) and [sl_rail_ieee802154_supports_signal_identifier()](features#sl-rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call.

###### sl_rail_ieee802154_enable_signal_detection (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_enable_signal_detection(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable or disable signal identifier for 802.15.4 signal detection.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Signal detection is enabled if true, disabled if false.|

[sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier) must be called once before calling this function to configure and enable signal identifier. Once a signal is detected signal detection will be turned off and this function should be called to re-enable the signal detection without needing to call [sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier) if the signal identifier is already configured and enabled.

This function is only supported by chips where [SL_RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ieee802154-supports-signal-identifier-1) and [sl_rail_ieee802154_supports_signal_identifier()](features#sl-rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call.

###### sl_rail_ieee802154_config_cca_mode (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_cca_mode(sl_rail_handle_t rail_handle, sl_rail_ieee802154_cca_mode_t cca_mode)`

**Description:** Set 802.15.4 CCA mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_ieee802154_cca_mode_t](ieee802-15-4#sl-rail-ieee802154-cca-mode-t)|[in]|cca_mode|Mode of CCA operation.|

This function sets the CCA mode [sl_rail_ieee802154_cca_mode_t](ieee802-15-4#sl-rail-ieee802154-cca-mode-t). If not called, SL_RAIL_IEEE802154_CCA_MODE_RSSI (RSSI-based CCA) is used for CCA.

In [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal), [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_OR_RSSI](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal-or-rssi) and [SL_RAIL_IEEE802154_CCA_MODE_SIGNAL_AND_RSSI](ieee802-15-4#sl-rail-ieee802154-cca-mode-signal-and-rssi) the signal identifier is enabled for the duration of LBT. If previously enabled by [sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier), the signal identifier will remain active until triggered.

This function is only supported by chips where [SL_RAIL_IEEE802154_SUPPORTS_SIGNAL_IDENTIFIER](features#sl-rail-ieee802154-supports-signal-identifier-1) and [sl_rail_ieee802154_supports_signal_identifier()](features#sl-rail-ieee802154-supports-signal-identifier) are true.

**Returns**

- Status code indicating success of the function call. An error should be returned if cca_mode is unsuppported on a given device.

###### sl_rail_ieee802154_config_rx_channel_switching (heading level 7)

`sl_rail_status_t sl_rail_ieee802154_config_rx_channel_switching(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_rx_channel_switching_cfg_t *p_config)`

**Description:** Configure RX channel switching for 802.15.4.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t) *|[in]|p_config|A pointer to [sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t) structure. NULL will disable any switching previously set up. The feature can also be disabled by disabling [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching).|

**Returns**

- Status code indicating success of the function call. For series 3 parts: return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if IEEE 802.15.4 is not enabled via [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init), return [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) otherwise.

This function configures RX channel switching, allowing reception of 2.4 GHz 802.15.4 signals on two different radio channels within the same PHY. This function should be called once before [sl_rail_start_rx()](receive#sl-rail-start-rx) and/or enabling [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching).

When [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching) is enabled, channel switching will occur during normal listening but is suspended (and the radio is idled) when starting any kind of transmit, including scheduled or CSMA transmits. It remains suspended after a [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack) transmit until the Ack is received or times out.

When [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching) is disabled after switching has been active, the radio could be left listening on either channel, so the application should call [sl_rail_start_rx()](receive#sl-rail-start-rx) to put it on the desired non-switching channel.

**Note**

- Switching is cancelled on any PHY change and this function would need to be re-called to reestablish switching after such a change. When RX channel switching is active, receive sensitivity and performance are slightly impacted.
- Switching is stopped on any channel change that is not from [sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t) but is resumed on configuring back the appropriate channel.

**Note**

- For series 2 parts: If the two channels are same, the function behaves the same as if p_config was NULL.
- IEEE 802.15.4 must be enabled via [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init), and the radio must be in the idle state when configuring RX channel switching. A DMA channel must be allocated with [sl_rail_use_dma()](general#sl-rail-use-dma) or by incorporating the [Direct Memory Access (DMA) Utility](rail-util-dma) plugin; otherwise this API will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call). This feature also requires a PRS channel, internally allocated by the RAIL library, to use and hold onto for future use. If no PRS channel is available, the function returns [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).
- This function internally uses [sl_rail_enable_cache_synth_cal()](state-transitions#sl-rail-enable-cache-synth-cal) to enable/disable the sequencer cache to store the synth calibration value.

**Warnings**

- For series 2 parts, this function relies on LDMA access and RAIL is meant to run in TrustZone non-secure world, it is not supported if LDMA is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

**Note**

- For series 3 parts:
- IEEE 802.15.4 must be enabled via [sl_rail_ieee802154_init()](ieee802-15-4#sl-rail-ieee802154-init).
- If the two channels are same, the function will do channel switching on a single frequency but will still duty cycle if PHY allows it.
- [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching) is only considered when [sl_rail_start_rx()](receive#sl-rail-start-rx) or [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel) is called, not instantly.

###### Macros

`#define RAIL_IEEE802154_MAX_ADDRESSES (3U)`

**Description**: The maximum number of allowed addresses of each type.

`#define RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES (0U)`

**Description**: RX channel switching buffer size, in bytes.

`#define RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE uint32_t`

**Description**: Fixed-width type indicating the needed alignment for RX channel switching buffer.

`#define RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT (sizeof(RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE))`

**Description**: Alignment that is needed for RX channel switching buffer.

`#define RAIL_IEEE802154_RX_CHANNEL_SWITCHING_NUM_CHANNELS (2U)`

**Description**: Maximum numbers of channels supported for RX channel switching.

`#define RAIL_IEEE802154_E_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define RAIL_IEEE802154_E_OPTIONS_DEFAULT RAIL_IEEE802154_E_OPTIONS_NONE`

**Description**: All options disabled by default .

`#define RAIL_IEEE802154_E_OPTION_GB868 (1UL << RAIL_IEEE802154_E_OPTION_GB868_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 features needed for GB868.

`#define RAIL_IEEE802154_E_OPTION_ENH_ACK (1UL << RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 features needed for Enhanced Acks.

`#define RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST (1UL << RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 macImplicitBroadcast feature.

`#define RAIL_IEEE802154_E_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define RAIL_IEEE802154_G_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define RAIL_IEEE802154_G_OPTIONS_DEFAULT RAIL_IEEE802154_G_OPTIONS_NONE`

**Description**: All options disabled by default .

`#define RAIL_IEEE802154_G_OPTION_GB868 (1UL << RAIL_IEEE802154_G_OPTION_GB868_SHIFT)`

**Description**: An option to enable/disable 802.15.4G-2012 features needed for GB868.

`#define RAIL_IEEE802154_G_OPTION_DYNFEC (1UL << RAIL_IEEE802154_G_OPTION_DYNFEC_SHIFT)`

**Description**: An option to enable/disable 802.15.4G dynamic FEC feature (SUN FSK only).

`#define RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH (1UL << RAIL_IEEE802154_G_OPTION_WISUN_MODESWITCH_SHIFT)`

**Description**: An option to enable/disable Wi-SUN Mode Switch feature.

`#define RAIL_IEEE802154_G_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define RAIL_IEEE802154_ACCEPT_BEACON_FRAMES (0x01)`

**Description**: When receiving packets, accept 802.15.4 BEACON frame types.

`#define RAIL_IEEE802154_ACCEPT_DATA_FRAMES (0x02)`

**Description**: When receiving packets, accept 802.15.4 DATA frame types.

`#define RAIL_IEEE802154_ACCEPT_ACK_FRAMES (0x04)`

**Description**: When receiving packets, accept 802.15.4 Ack frame types.

`#define RAIL_IEEE802154_ACCEPT_COMMAND_FRAMES (0x08)`

**Description**: When receiving packets, accept 802.15.4 COMMAND frame types.

`#define RAIL_IEEE802154_ACCEPT_MULTIPURPOSE_FRAMES (0x20)`

**Description**: When receiving packets, accept 802.15.4-2015 Multipurpose frame types.

`#define RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES `

**Description**: In standard operation, accept BEACON, DATA and COMMAND frames.

`#define RAIL_IEEE802154_ToggleFramePending RAIL_IEEE802154_SetFramePending`

**Description**: Alternate naming for function [RAIL_IEEE802154_SetFramePending](ieee802-15-4#rail-ieee802154-set-frame-pending) to depict it is used for changing the default setting specified by [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks) in an outgoing Ack.

`#define RAIL_IEEE802154_EnableSignalIdentifier RAIL_IEEE802154_EnableSignalDetection`

**Description**: Backward compatible name for the [RAIL_IEEE802154_EnableSignalDetection](ieee802-15-4#rail-ieee802154-enable-signal-detection) API.

`#define SL_RAIL_IEEE802154_MAX_ADDRESSES (3U)`

**Description**: The maximum number of allowed addresses of each type.

`#define SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES (0U)`

**Description**: RX channel switching buffer size, in bytes.

`#define SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE uint32_t`

**Description**: Fixed-width type indicating the needed alignment for RX channel switching buffer.

`#define SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT (sizeof(SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_ALIGNMENT_TYPE))`

**Description**: Alignment that is needed for RX channel switching buffer.

`#define SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_NUM_CHANNELS (2U)`

**Description**: Maximum numbers of channels supported for RX channel switching.

`#define SL_RAIL_IEEE802154_PHY_EXTENSION_SHIFT (8)`

**Description**: PHY id shift of extension for stackinfo.phyId.

`#define SL_RAIL_IEEE802154_PHY_EXTENSION_MASK (0xFF00U)`

**Description**: PHY id bitmask of extension for stackinfo.phyId.

`#define SL_RAIL_IEEE802154_PHY_2BYTE_PHR_MASK (0x80U)`

**Description**: PHY id bitmask of 2-byte PHR length flag for use with indicated radio configurations.

`#define SL_RAIL_IEEE802154_PHY_EXTERNAL_MASK (0x10U)`

**Description**: PHY id bitmask for external (non-built-in) radio configuration.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV_SHIFT (0x01u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-ant-div) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX_SHIFT (0x02u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-coex) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM_SHIFT (0x03u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-fem) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS_SHIFT (0x04u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-2-mbps) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC_SHIFT (0x05u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-1-mbps-fec) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING_SHIFT (0x06u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-rx-ch-switching) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING_SHIFT (0x07u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-rx-duty-cycling) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_2_MBPS_SHIFT (0x08u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_2_MBPS](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-fcs-2-mbps) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_1_MBPS_FEC_SHIFT (0x09u)`

**Description**: Shift position of [SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_1_MBPS_FEC](ieee802-15-4#sl-rail-ieee802154-phy-feature-2-p4-ghz-fcs-1-mbps-fec) bit.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ (0UL)`

**Description**: No IEEE802.15.4 features selected.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV_SHIFT)`

**Description**: RX antenna diversity feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX_SHIFT)`

**Description**: WiFi coex feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM_SHIFT)`

**Description**: Front end module feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS_SHIFT)`

**Description**: Mode switch feature for 2Mbps 2.4 GHz operation.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC_SHIFT)`

**Description**: Mode switch feature for 1Mbps 2.4 GHz operation with forward error correction (1-byte PHR).

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING_SHIFT)`

**Description**: RX channel switching feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING (1UL << SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING_SHIFT)`

**Description**: RX Duty cycling feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_2_MBPS (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING)`

**Description**: Mode switch feature for 2Mbps 2.4 GHz operation with fast channel switching.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FCS_1_MBPS_FEC (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_CH_SWITCHING)`

**Description**: Mode switch feature for 1Mbps 2.4 GHz operation with forward error correction (1-byte PHR) and fast channel switching.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DC_2_MBPS (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_2_MBPS | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING)`

**Description**: Mode switch feature for 2Mbps 2.4 GHz operation with duty cycling.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DC_1_MBPS_FEC (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_1_MBPS_FEC | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_RX_DUTY_CYCLING)`

**Description**: Mode switch feature for 1Mbps 2.4 GHz operation with forward error correction (1-byte PHR) and duty cycling.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV_COEX (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX)`

**Description**: RX antenna diversity and WiFi coex features.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM_ANT_DIV (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV)`

**Description**: Front end module and RX antenna diversity features.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM_COEX (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX)`

**Description**: Front end module and WiFi coex feature.

`#define SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM_ANT_DIV_COEX (SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_FEM | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_ANT_DIV | SL_RAIL_IEEE802154_PHY_FEATURE_2P4_GHZ_COEX)`

**Description**: Front end module and RX antenna diversity and WiFi coex feature.

`#define SL_RAIL_IEEE802154_E_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define SL_RAIL_IEEE802154_E_OPTIONS_DEFAULT SL_RAIL_IEEE802154_E_OPTIONS_NONE`

**Description**: All options disabled by default .

`#define SL_RAIL_IEEE802154_E_OPTION_GB868 (1UL << SL_RAIL_IEEE802154_E_OPTION_GB868_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 features needed for GB868.

`#define SL_RAIL_IEEE802154_E_OPTION_ENH_ACK (1UL << SL_RAIL_IEEE802154_E_OPTION_ENH_ACK_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 features needed for Enhanced Acks.

`#define SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST (1UL << SL_RAIL_IEEE802154_E_OPTION_IMPLICIT_BROADCAST_SHIFT)`

**Description**: An option to enable/disable 802.15.4E-2012 macImplicitBroadcast feature.

`#define SL_RAIL_IEEE802154_E_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define SL_RAIL_IEEE802154_G_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define SL_RAIL_IEEE802154_G_OPTIONS_DEFAULT SL_RAIL_IEEE802154_G_OPTIONS_NONE`

**Description**: All options disabled by default .

`#define SL_RAIL_IEEE802154_G_OPTION_GB868 (1UL << SL_RAIL_IEEE802154_G_OPTION_GB868_SHIFT)`

**Description**: An option to enable/disable 802.15.4G-2012 features needed for GB868.

`#define SL_RAIL_IEEE802154_G_OPTION_DYN_FEC (1UL << SL_RAIL_IEEE802154_G_OPTION_DYN_FEC_SHIFT)`

**Description**: An option to enable/disable 802.15.4G dynamic FEC feature (SUN FSK only).

`#define SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH (1UL << SL_RAIL_IEEE802154_G_OPTION_WI_SUN_MODE_SWITCH_SHIFT)`

**Description**: An option to enable/disable Wi-SUN Mode Switch feature.

`#define SL_RAIL_IEEE802154_G_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define SL_RAIL_IEEE802154_ACCEPT_BEACON_FRAMES (0x01)`

**Description**: When receiving packets, accept 802.15.4 BEACON frame types.

`#define SL_RAIL_IEEE802154_ACCEPT_DATA_FRAMES (0x02)`

**Description**: When receiving packets, accept 802.15.4 DATA frame types.

`#define SL_RAIL_IEEE802154_ACCEPT_ACK_FRAMES (0x04)`

**Description**: When receiving packets, accept 802.15.4 Ack frame types.

`#define SL_RAIL_IEEE802154_ACCEPT_COMMAND_FRAMES (0x08)`

**Description**: When receiving packets, accept 802.15.4 COMMAND frame types.

`#define SL_RAIL_IEEE802154_ACCEPT_MULTIPURPOSE_FRAMES (0x20)`

**Description**: When receiving packets, accept 802.15.4-2015 Multipurpose frame types.

`#define SL_RAIL_IEEE802154_ACCEPT_STANDARD_FRAMES `

**Description**: In standard operation, accept BEACON, DATA and COMMAND frames.

Representation of 802.15.4 address. 

This structure is only used for received source address information needed to perform Frame Pending lookup.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t). 

###### Public Attributes (heading level 7)

###### shortAddress (heading level 8)

```
uint16_t RAIL_IEEE802154_Address_t::shortAddress
```

**Description:** Present for 2 byte addresses.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_t::short_address](sl-rail-ieee802154-address-t#short-address).

###### longAddress (heading level 8)

```
uint8_t RAIL_IEEE802154_Address_t::longAddress[8]
```

**Description:** Present for 8 byte addresses.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_t::long_address](sl-rail-ieee802154-address-t#long-address).

###### @4 (heading level 8)

```
union RAIL_IEEE802154_Address_t::@3 RAIL_IEEE802154_Address_t::@4
```

**Description:** Convenient storage for different address types.

###### length (heading level 8)

```
RAIL_IEEE802154_AddressLength_t RAIL_IEEE802154_Address_t::length
```

**Description:** Enumeration of the received address length.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_t::address_length](sl-rail-ieee802154-address-t#address-length).

###### filterMask (heading level 8)

```
RAIL_AddrFilterMask_t RAIL_IEEE802154_Address_t::filterMask
```

**Description:** A bitmask representing which address filter(s) this packet has passed.

**Details:** It is undefined on platforms lacking [RAIL_SUPPORTS_ADDR_FILTER_MASK](features#rail-supports-addr-filter-mask-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_address_t::filter_mask](sl-rail-ieee802154-address-t#filter-mask).

A configuration structure for IEEE 802.15.4 Address Filtering. 

This structure allows configuration of multi-PAN functionality by specifying multiple PAN Ids and short addresses. A packet will be received if it matches an address and its corresponding PAN Id. Long address 0 and short address 0 match against PAN Id 0, etc. The broadcast PAN Id and address will work with any address or PAN Id, respectively.

**Note**

- The broadcast addresses are handled separately and do not need to be specified here. Any address to be ignored should be set with all bits high.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t](sl-rail-ieee802154-addr-config-t). 

###### Public Attributes (heading level 7)

###### panId (heading level 8)

```
uint16_t RAIL_IEEE802154_AddrConfig_t::panId[(3U)]
```

**Description:** PAN Ids for destination filtering.

**Details:** All must be specified. To disable a PAN Id, set it to the broadcast value, 0xFFFF.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::pan_id](sl-rail-ieee802154-addr-config-t#pan-id).

###### shortAddr (heading level 8)

```
uint16_t RAIL_IEEE802154_AddrConfig_t::shortAddr[(3U)]
```

**Description:** A short network addresses for destination filtering.

**Details:** All must be specified. To disable a short address, set it to the broadcast value, 0xFFFF.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::short_addr](sl-rail-ieee802154-addr-config-t#short-addr).

###### longAddr (heading level 8)

```
uint8_t RAIL_IEEE802154_AddrConfig_t::longAddr[(3U)][8]
```

**Description:** A 64-bit address for destination filtering.

**Details:** All must be specified. This field is parsed in over-the-air byte order. To disable a long address, set it to the reserved value of 0x00 00 00 00 00 00 00 00.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_addr_config_t::long_addr](sl-rail-ieee802154-addr-config-t#long-addr).

A configuration structure for IEEE 802.15.4 in RAIL. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t](sl-rail-ieee802154-config-t). 

###### Public Attributes (heading level 7)

###### addresses (heading level 8)

```
const RAIL_IEEE802154_AddrConfig_t* RAIL_IEEE802154_Config_t::addresses
```

**Description:** Configure the RAIL Address Filter to allow the given destination addresses.

**Details:** If this pointer is NULL, defer destination address configuration. If a member of addresses is NULL, defer configuration of just that member. This can be overridden via [RAIL_IEEE802154_SetAddresses()](ieee802-15-4#rail-ieee802154-set-addresses), or the individual members can be changed via [RAIL_IEEE802154_SetPanId()](ieee802-15-4#rail-ieee802154-set-pan-id), [RAIL_IEEE802154_SetShortAddress()](ieee802-15-4#rail-ieee802154-set-short-address), and [RAIL_IEEE802154_SetLongAddress()](ieee802-15-4#rail-ieee802154-set-long-address).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::p_addresses](sl-rail-ieee802154-config-t#p-addresses).

###### ackConfig (heading level 8)

```
RAIL_AutoAckConfig_t RAIL_IEEE802154_Config_t::ackConfig
```

**Description:** Define the Acking configuration for the IEEE 802.15.4 implementation.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::ack_config](sl-rail-ieee802154-config-t#ack-config).

###### timings (heading level 8)

```
RAIL_StateTiming_t RAIL_IEEE802154_Config_t::timings
```

**Description:** Define state timings for the IEEE 802.15.4 implementation.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::timings](sl-rail-ieee802154-config-t#timings).

###### framesMask (heading level 8)

```
uint8_t RAIL_IEEE802154_Config_t::framesMask
```

**Description:** Set which 802.15.4 frame types will be received, of Beacon, Data, Ack, and Command.

**Details:** This setting can be overridden via [RAIL_IEEE802154_AcceptFrames()](ieee802-15-4#rail-ieee802154-accept-frames).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::frames_mask](sl-rail-ieee802154-config-t#frames-mask).

###### promiscuousMode (heading level 8)

```
bool RAIL_IEEE802154_Config_t::promiscuousMode
```

**Description:** Enable promiscuous mode during configuration.

**Details:** This can be overridden via [RAIL_IEEE802154_SetPromiscuousMode()](ieee802-15-4#rail-ieee802154-set-promiscuous-mode) afterwards.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::promiscuous_mode](sl-rail-ieee802154-config-t#promiscuous-mode).

###### isPanCoordinator (heading level 8)

```
bool RAIL_IEEE802154_Config_t::isPanCoordinator
```

**Description:** Set whether the device is a PAN Coordinator during configuration.

**Details:** This can be overridden via [RAIL_IEEE802154_SetPanCoordinator()](ieee802-15-4#rail-ieee802154-set-pan-coordinator) afterwards.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::is_pan_coordinator](sl-rail-ieee802154-config-t#is-pan-coordinator).

###### defaultFramePendingInOutgoingAcks (heading level 8)

```
bool RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks
```

**Description:** The default value for the Frame Pending bit in outgoing Acks for packets that triggered the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) event.

**Details:** Such an Ack's Frame Pending bit can be inverted if necessary during the handling of that event by calling [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending) (formerly [RAIL_IEEE802154_SetFramePending()](ieee802-15-4#rail-ieee802154-set-frame-pending)).

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks](sl-rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks).

A configuration structure for RX channel switching. 

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t](sl-rail-ieee802154-rx-channel-switching-cfg-t). 

###### Public Attributes (heading level 7)

###### buffer (heading level 8)

```
uint32_t* RAIL_IEEE802154_RxChannelSwitchingCfg_t::buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel specific settings for concurrent listening, for series 2 parts.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer. This parameter is not used for series 3 parts.

**Note**

- the size of this buffer must be at least as large as the [RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES](ieee802-15-4#rail-ieee802154-rx-channel-switching-buf-bytes) and needs to be word aligned.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::p_buffer](sl-rail-ieee802154-rx-channel-switching-cfg-t#p-buffer).

###### bufferBytes (heading level 8)

```
uint16_t RAIL_IEEE802154_RxChannelSwitchingCfg_t::bufferBytes
```

**Description:** For series 2 parts, this parameter must be set to the length of the buffer array, in bytes.

**Details:** This way, during configuration, the software can confirm it's writing within the range of the buffer. The configuration API will return an error if bufferBytes is insufficient. This parameter is not used for series 3 parts.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::buffer_bytes](sl-rail-ieee802154-rx-channel-switching-cfg-t#buffer-bytes).

###### channels (heading level 8)

```
uint16_t RAIL_IEEE802154_RxChannelSwitchingCfg_t::channels[(2U)]
```

**Description:** Array to hold the channel numbers for RX channel switching.

**Details:** **Note**

- Radio will switch between the exact channels specified, and not across an inclusive range of channels between the specified channels.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_rx_channel_switching_cfg_t::channels](sl-rail-ieee802154-rx-channel-switching-cfg-t#channels).

A structure containing the PHY Mode Id value and the corresponding mode switch PHR as defined in Wi-SUN spec. 

These structures are usually generated by the radio configurator.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t](sl-rail-ieee802154-mode-switch-phr-t). 

###### Public Attributes (heading level 7)

###### phyModeId (heading level 8)

```
uint8_t RAIL_IEEE802154_ModeSwitchPhr_t::phyModeId
```

**Description:** PHY mode Id.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t::phy_mode_id](sl-rail-ieee802154-mode-switch-phr-t#phy-mode-id).

###### phr (heading level 8)

```
uint16_t RAIL_IEEE802154_ModeSwitchPhr_t::phr
```

**Description:** Corresponding Mode Switch PHY header.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_mode_switch_phr_t::phr](sl-rail-ieee802154-mode-switch-phr-t#phr).

Representation of 802.15.4 address. 

This structure is only used for received source address information needed to perform Frame Pending lookup. 

###### Public Attributes (heading level 7)

###### short_address (heading level 8)

```
uint16_t sl_rail_ieee802154_address_t::short_address
```

**Description:** Present for 2 byte addresses.

###### long_address (heading level 8)

```
uint8_t sl_rail_ieee802154_address_t::long_address[8]
```

**Description:** Present for 8 byte addresses.

###### @8 (heading level 8)

```
union sl_rail_ieee802154_address_t::@7 sl_rail_ieee802154_address_t::@8
```

**Description:** Convenient storage for different address types.

###### address_length (heading level 8)

```
sl_rail_ieee802154_address_length_t sl_rail_ieee802154_address_t::address_length
```

**Description:** Enumeration of the received address length.

###### filter_mask (heading level 8)

```
sl_rail_addr_filter_mask_t sl_rail_ieee802154_address_t::filter_mask
```

**Description:** A bitmask representing which address filter(s) this packet has passed.

**Details:** It is undefined on platforms lacking [SL_RAIL_SUPPORTS_ADDR_FILTER_MASK](features#sl-rail-supports-addr-filter-mask-1).

A configuration structure for IEEE 802.15.4 Address Filtering. 

This structure allows configuration of multi-PAN functionality by specifying multiple PAN Ids and short addresses. A packet will be received if it matches an address and its corresponding PAN Id. Long address 0 and short address 0 match against PAN Id 0, etc. The broadcast PAN Id and address will work with any address or PAN Id, respectively.

**Note**

- The broadcast addresses are handled separately and do not need to be specified here. Any address to be ignored should be set with all bits high.

###### Public Attributes (heading level 7)

###### pan_id (heading level 8)

```
uint16_t sl_rail_ieee802154_addr_config_t::pan_id[(3U)]
```

**Description:** PAN Ids for destination filtering.

**Details:** All must be specified. To disable a PAN Id, set it to the broadcast value, 0xFFFF.

###### short_addr (heading level 8)

```
uint16_t sl_rail_ieee802154_addr_config_t::short_addr[(3U)]
```

**Description:** A short network addresses for destination filtering.

**Details:** All must be specified. To disable a short address, set it to the broadcast value, 0xFFFF.

###### long_addr (heading level 8)

```
uint8_t sl_rail_ieee802154_addr_config_t::long_addr[(3U)][8]
```

**Description:** A 64-bit address for destination filtering.

**Details:** All must be specified. This field is parsed in over-the-air byte order. To disable a long address, set it to the reserved value of 0x00 00 00 00 00 00 00 00.

A configuration structure for IEEE 802.15.4 in RAIL. 

###### Public Attributes (heading level 7)

###### p_addresses (heading level 8)

```
const sl_rail_ieee802154_addr_config_t* sl_rail_ieee802154_config_t::p_addresses
```

**Description:** Configure the RAIL Address Filter to allow the given destination addresses.

**Details:** If this pointer is NULL, defer destination address configuration. If a member of addresses is NULL, defer configuration of just that member. This can be overridden via [sl_rail_ieee802154_set_addresses()](ieee802-15-4#sl-rail-ieee802154-set-addresses), or the individual members can be changed via [sl_rail_ieee802154_set_pan_id()](ieee802-15-4#sl-rail-ieee802154-set-pan-id), [sl_rail_ieee802154_set_short_address()](ieee802-15-4#sl-rail-ieee802154-set-short-address), and [sl_rail_ieee802154_set_long_address()](ieee802-15-4#sl-rail-ieee802154-set-long-address).

###### ack_config (heading level 8)

```
sl_rail_auto_ack_config_t sl_rail_ieee802154_config_t::ack_config
```

**Description:** Define the Acking configuration for the IEEE 802.15.4 implementation.

###### timings (heading level 8)

```
sl_rail_state_timing_t sl_rail_ieee802154_config_t::timings
```

**Description:** Define state timings for the IEEE 802.15.4 implementation.

###### frames_mask (heading level 8)

```
uint8_t sl_rail_ieee802154_config_t::frames_mask
```

**Description:** Set which 802.15.4 frame types will be received, of Beacon, Data, Ack, and Command.

**Details:** This setting can be overridden via [sl_rail_ieee802154_accept_frames()](ieee802-15-4#sl-rail-ieee802154-accept-frames).

###### promiscuous_mode (heading level 8)

```
bool sl_rail_ieee802154_config_t::promiscuous_mode
```

**Description:** Enable promiscuous mode during configuration.

**Details:** This can be overridden via [sl_rail_ieee802154_set_promiscuous_mode()](ieee802-15-4#sl-rail-ieee802154-set-promiscuous-mode) afterwards.

###### is_pan_coordinator (heading level 8)

```
bool sl_rail_ieee802154_config_t::is_pan_coordinator
```

**Description:** Set whether the device is a PAN Coordinator during configuration.

**Details:** This can be overridden via [sl_rail_ieee802154_set_pan_coordinator()](ieee802-15-4#sl-rail-ieee802154-set-pan-coordinator) afterwards.

###### default_frame_pending_in_outgoing_acks (heading level 8)

```
bool sl_rail_ieee802154_config_t::default_frame_pending_in_outgoing_acks
```

**Description:** The default value for the Frame Pending bit in outgoing Acks for packets that triggered the [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) event.

**Details:** Such an Ack's Frame Pending bit can be inverted if necessary during the handling of that event by calling [sl_rail_ieee802154_toggle_frame_pending()](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending).

A configuration structure for RX channel switching. 

###### Public Attributes (heading level 7)

###### p_buffer (heading level 8)

```
uint32_t* sl_rail_ieee802154_rx_channel_switching_cfg_t::p_buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel specific settings for concurrent listening, for series 2 parts.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer. This parameter is not used for series 3 parts.

**Note**

- the size of this buffer must be at least as large as the [SL_RAIL_IEEE802154_RX_CHANNEL_SWITCHING_BUF_BYTES](ieee802-15-4#sl-rail-ieee802154-rx-channel-switching-buf-bytes) and needs to be word aligned.

###### buffer_bytes (heading level 8)

```
uint16_t sl_rail_ieee802154_rx_channel_switching_cfg_t::buffer_bytes
```

**Description:** For series 2 parts, this parameter must be set to the length of the buffer array, in bytes.

**Details:** This way, during configuration, the software can confirm it's writing within the range of the buffer. The configuration API will return an error if buffer_bytes is insufficient. This parameter is not used for series 3 parts.

###### channels (heading level 8)

```
uint16_t sl_rail_ieee802154_rx_channel_switching_cfg_t::channels[(2U)]
```

**Description:** Array to hold the channel numbers for RX channel switching.

**Details:** **Note**

- Radio will switch between the exact channels specified, and not across an inclusive range of channels between the specified channels.

A structure containing the PHY Mode Id value and the corresponding mode switch PHR as defined in Wi-SUN spec. 

These structures are usually generated by the radio configurator. 

###### Public Attributes (heading level 7)

###### phy_mode_id (heading level 8)

```
uint8_t sl_rail_ieee802154_mode_switch_phr_t::phy_mode_id
```

**Description:** PHY mode Id.

###### phr (heading level 8)

```
uint16_t sl_rail_ieee802154_mode_switch_phr_t::phr
```

**Description:** Corresponding Mode Switch PHY header.

###### IEEE 802.15.4 Duty Cycling

APIs related to [IEEE 802.15.4 Duty Cycling Utility](rail-util-ieee802154-duty-cycling) component. 

###### Functions (heading level 7)

###### sl_rail_util_ieee802154_get_rx_duty_cycling_phy_features (heading level 8)

`sl_rail_ieee802154_phy_features_t sl_rail_util_ieee802154_get_rx_duty_cycling_phy_features(void)`

**Description:** Get PHY features selected by the duty cycling component.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Note**

- RAIL provides a weak implementation; users can override it with their own.
- This function is only available for Series 3 parts that support [SL_RAIL_SUPPORTS_RX_DUTY_CYCLING](features#sl-rail-supports-rx-duty-cycling-1).

**Returns**

- Selected PHY features.

###### sl_rail_ieee802154_config_2p4_ghz_radio_rx_duty_cycling (heading level 8)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_rx_duty_cycling(sl_rail_handle_t rail_handle)`

**Description:** Configure the 2.4 GHz IEEE 802.15.4 radio with Rx duty cycling support.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A handle for the RAIL instance.|

After this function is called, the radio will begin duty cycling each time it enters RX.

**Note**

- This function is only available for Series 3 parts that support [SL_RAIL_SUPPORTS_RX_DUTY_CYCLING](features#sl-rail-supports-rx-duty-cycling-1).

**Returns**

- Status code indicating the result of the operation.

###### IEEE 802.15.4 Fast Channel Switching

APIs related to [IEEE 802.15.4 Fast Channel Switching Utility](rail-util-ieee802154-fast-channel-switching) component. 

###### Functions (heading level 7)

###### sl_rail_util_ieee802154_get_fast_channel_switching_phy_features (heading level 8)

`sl_rail_ieee802154_phy_features_t sl_rail_util_ieee802154_get_fast_channel_switching_phy_features(void)`

**Description:** Get PHY features selected by the fast channel switching component.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Note**

- RAIL provides a weak implementation; users can override it with their own.
- This function is only available for Series 3 parts that support [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) or the runtime call [sl_rail_ieee802154_supports_rx_channel_switching()](features#sl-rail-ieee802154-supports-rx-channel-switching).

**Returns**

- PHY features selected features.

###### sl_rail_ieee802154_config_2p4_ghz_radio_fast_channel_switching (heading level 8)

`sl_rail_status_t sl_rail_ieee802154_config_2p4_ghz_radio_fast_channel_switching(sl_rail_handle_t rail_handle)`

**Description:** Configure the 2.4 GHz IEEE 802.15.4 radio with fast channel switching support.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A handle for the RAIL instance.|

**Returns**

- Status code indicating the result of the operation.

**Note**

- This function is only available for Series 3 parts that support [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) or the runtime call [sl_rail_ieee802154_supports_rx_channel_switching()](features#sl-rail-ieee802154-supports-rx-channel-switching).
- [sl_rail_ieee802154_config_rx_channel_switching()](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching) must be called after configuring the radio with [sl_rail_ieee802154_config_2p4_ghz_radio_fast_channel_switching()](ieee802154-fast-channel-switching-api#sl-rail-ieee802154-config-2p4-ghz-radio-fast-channel-switching).

###### IEEE 802.15.4 High Speed

APIs related to [IEEE 802.15.4 High Speed Utility](rail-util-ieee802154-high-speed) component. 

###### Functions (heading level 7)

###### sl_rail_util_ieee802154_get_high_speed_phy_features (heading level 8)

`sl_rail_ieee802154_phy_features_t sl_rail_util_ieee802154_get_high_speed_phy_features(void)`

**Description:** Get PHY features selected by the high speed component.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- PHY features selected features.

###### IEEE 802.15.4 Radio Configurations

Radio configurations for the RAIL 802.15.4 Accelerator. 

These radio configurations are used to configure 802.15.4 when a function such as [RAIL_IEEE802154_Config2p4GHzRadio()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overridden to account for those settings.

These radio configurations are used to configure 802.15.4 when a function such as [sl_rail_ieee802154_config_2p4_ghz_radio()](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio) is called. Each radio configuration listed below is compiled into the RAIL library as a weak symbol that will take into account per-die defaults. If the board configuration in use has different settings than the default, such as a different radio subsystem clock frequency, these radio configurations can be overridden to account for those settings. 

###### Variables (heading level 7)

###### RAIL_IEEE802154_Phy2p4GHz (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHz
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4.

**Details:** Will be NULL if [RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#rail-supports-protocol-ieee802154-1) or [RAIL_SUPPORTS_2P4GHZ_BAND](features#rail-supports-2-p4-ghz-band) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz).

###### RAIL_IEEE802154_Phy2p4GHzAntDiv (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzAntDiv
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with antenna diversity.

**Details:** Will be NULL if [RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#rail-supports-protocol-ieee802154-1), [RAIL_SUPPORTS_2P4GHZ_BAND](features#rail-supports-2-p4-ghz-band), or [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div).

###### RAIL_IEEE802154_Phy2p4GHzCoex (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzCoex
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 optimized for coexistence.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_coex](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-coex).

###### RAIL_IEEE802154_Phy2p4GHzAntDivCoex (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzAntDivCoex
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 optimized for coexistence, while supporting antenna diversity.

**Details:** Will be NULL if [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1) or [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-coex).

###### RAIL_IEEE802154_Phy2p4GHzFem (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzFem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-fem).

###### RAIL_IEEE802154_Phy2p4GHzAntDivFem (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzAntDivFem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and antenna diversity.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1) or [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-fem).

###### RAIL_IEEE802154_Phy2p4GHzCoexFem (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzCoexFem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and is optimized for radio coexistence.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1) or [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_coex_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-coex-fem).

###### RAIL_IEEE802154_Phy2p4GHzAntDivCoexFem (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzAntDivCoexFem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and antenna diversity, and is optimized for radio coexistence.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#rail-ieee802154-supports-fem-phy-1), [RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#rail-ieee802154-supports-coex-phy-1), or [RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#rail-supports-antenna-diversity-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex_fem](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-ant-div-coex-fem).

###### RAIL_IEEE802154_Phy2p4GHzCustom1 (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzCustom1
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with custom settings.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_CUSTOM1_PHY](features#rail-ieee802154-supports-custom1-phy-1) is 0.

**Deprecated**This RAIL 2.x PHY has been eliminated in RAIL 3; it is no longer supported.

###### RAIL_IEEE802154_PhyGB863MHz (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_PhyGB863MHz
```

**Description:** Default PHY to use for 863 MHz GB868 802.15.4.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#rail-ieee802154-supports-g-subset-gb868-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_gb863_mhz](ieee802154-phy#sl-rail-ieee802154-phy-gb863-mhz).

###### RAIL_IEEE802154_PhyGB915MHz (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_PhyGB915MHz
```

**Description:** Default PHY to use for 915 MHz GB868 802.15.4.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#rail-ieee802154-supports-g-subset-gb868-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_gb915_mhz](ieee802154-phy#sl-rail-ieee802154-phy-gb915-mhz).

###### RAIL_IEEE802154_Phy2p4GHzRxChSwitching (heading level 8)

```
const RAIL_ChannelConfig_t* const RAIL_IEEE802154_Phy2p4GHzRxChSwitching
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with RX channel switching.

**Details:** Will be NULL if [RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1) is 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_ieee802154_phy_2p4_ghz_rx_ch_switching](ieee802154-phy#sl-rail-ieee802154-phy-2p4-ghz-rx-ch-switching).

###### sl_rail_ieee802154_phy_2p4_ghz (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4.

**Details:** Will be NULL if [SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#sl-rail-supports-protocol-ieee802154-1) or [SL_RAIL_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-supports-2-p4-ghz-band) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_ant_div (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_ant_div
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with antenna diversity.

**Details:** Will be NULL if [SL_RAIL_SUPPORTS_PROTOCOL_IEEE802154](features#sl-rail-supports-protocol-ieee802154-1), [SL_RAIL_SUPPORTS_2P4_GHZ_BAND](features#sl-rail-supports-2-p4-ghz-band), or [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_coex (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_coex
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 optimized for coexistence.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 optimized for coexistence, while supporting antenna diversity.

**Details:** Will be NULL if [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1) or [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_fem (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_fem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_ant_div_fem (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_ant_div_fem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and antenna diversity.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1) or [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_coex_fem (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_coex_fem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and is optimized for radio coexistence.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1) or [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex_fem (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_ant_div_coex_fem
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with a configuration that supports a front-end module and antenna diversity, and is optimized for radio coexistence.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_FEM_PHY](features#sl-rail-ieee802154-supports-fem-phy-1), [SL_RAIL_IEEE802154_SUPPORTS_COEX_PHY](features#sl-rail-ieee802154-supports-coex-phy-1), or [SL_RAIL_SUPPORTS_ANTENNA_DIVERSITY](features#sl-rail-supports-antenna-diversity-1) is 0.

###### sl_rail_ieee802154_phy_gb863_mhz (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_gb863_mhz
```

**Description:** Default PHY to use for 863 MHz GB868 802.15.4.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#sl-rail-ieee802154-supports-g-subset-gb868-1) is 0.

###### sl_rail_ieee802154_phy_gb915_mhz (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_gb915_mhz
```

**Description:** Default PHY to use for 915 MHz GB868 802.15.4.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_G_SUBSET_GB868](features#sl-rail-ieee802154-supports-g-subset-gb868-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_rx_ch_switching (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_rx_ch_switching
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with RX channel switching.

**Details:** Will be NULL if [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) is 0.

###### sl_rail_ieee802154_phy_2p4_ghz_rx_duty_cycling (heading level 8)

```
const sl_rail_channel_config_t* const sl_rail_ieee802154_phy_2p4_ghz_rx_duty_cycling
```

**Description:** Default PHY to use for 2.4 GHz 802.15.4 with duty cycling.

**Details:** Will be NULL if [SL_RAIL_SUPPORTS_RX_DUTY_CYCLING](features#sl-rail-supports-rx-duty-cycling-1) is 0.

##### Multi-Level Frequency Modulation

MFM configuration routines. 

**Note**

- This feature is only supported on EFR32xG23 devices.

This feature can be used to directly control the TX interpolation filter input to allow for a more flexible frequency modulation scheme than the standard MODEM. When doing this, the MFM buffer is treated as an array of 8-bit signed data used as normalized frequency deviation to the SYNTH frequency to directly control the interpolation filter input. No support for frame handling, coding, nor shaping is supported. Only compatible with FSK modulations.

The functions in this group configure RAIL Multi-Level Frequency Modulation (MFM) hardware acceleration features.

To configure MFM functionality, the application must first set up a RAIL instance with [RAIL_Init()](general#rail-init) and other setup functions. Before enabling MFM, a ping-pong buffer (called buffer0 and buffer1 below) must be configured via [RAIL_SetMfmPingPongFifo()](mfm#rail-set-mfm-ping-pong-fifo) and populated with the initial buffer content. MFM is enabled by setting [RAIL_TxDataSource_t::TX_MFM_DATA](data-management#tx-mfm-data) using [RAIL_ConfigData()](data-management#rail-config-data) and is activated when transmit is started by [RAIL_StartTx()](packet-tx#rail-start-tx). Once transmitting the data in the ping-pong buffers, RAIL will manage them so it looks like a continuous transmission to the receiver. Every time one of the ping-pong buffers has been transmitted, [RAIL_EVENT_MFM_TX_BUFFER_DONE](events#rail-event-mfm-tx-buffer-done) is triggered so the application can update the data in that buffer without the need to start/stop the transmission. [RAIL_EVENT_MFM_TX_BUFFER_DONE](events#rail-event-mfm-tx-buffer-done) can be enable with [RAIL_ConfigEvents()](events#rail-config-events). Use [RAIL_StopTx()](transmit#rail-stop-tx) to finish transmitting. 

```c
#define MFM_RAW_BUF_WORDS 128
extern RAIL_Handle_t railHandle;
uint8_t txCount = 0;
uint32_t mfmPingPongBuffers[2][MFM_RAW_BUF_WORDS];

typedef struct mfmConfigApp {
  RAIL_MFM_PingPongBufferConfig_t buffer;
  RAIL_StateTiming_t timings;
  RAIL_DataConfig_t dataConfig;
} mfmConfigApp_t;

static mfmConfigApp_t mfmConfig = {
  .buffer = {
    .pBuffer0 = (&mfmPingPongBuffers[0]),
    .pBuffer1 = (&mfmPingPongBuffers[1]),
    .bufferSizeWords = MFM_RAW_BUF_WORDS,
  },
  .timings = {
    .idleToTx = 100,
    .idleToRx = 0,
    .rxToTx = 0,
    .txToRx = 0,
    .rxSearchTimeout = 0,
    .txToRxSearchTimeout = 0
  },
  .dataConfig = {
    .txSource = TX_MFM_DATA,
    .rxSource = RX_PACKET_DATA,
    .txMethod = PACKET_MODE,
    .rxMethod = PACKET_MODE,
  },
};

// Main RAIL events handler callback
static void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Increment TX counter
  if (events & RAIL_EVENT_MFM_BUF_DONE) {
      txCount++;
      return;
    }
  }
}

void mfmInit(void)
{
  // initialize MFM
  uint32_t idx;
  uint32_t *pDst0 = mfmConfig.buffer.pBuffer0;
  uint32_t *pDst1 = mfmConfig.buffer.pBuffer1;
  for (idx = 0; idx < (mfmConfig.buffer.bufferSizeWords / 4); idx++) {
    pDst0[4 * idx + 0] = 0x755A3100;
    pDst1[4 * idx + 0] = 0x755A3100;
    pDst0[4 * idx + 1] = 0x315A757F;
    pDst1[4 * idx + 1] = 0x315A757F;
    pDst0[4 * idx + 2] = 0x8BA6CF00;
    pDst1[4 * idx + 2] = 0x8BA6CF00;
    pDst0[4 * idx + 3] = 0xCFA68B81;
    pDst1[4 * idx + 3] = 0xCFA68B81;
  }

  RAIL_Status_t status;
  status = RAIL_SetMfmPingPongFifo(railHandle, &mfmConfig.buffer);
  assert(status == RAIL_STATUS_NO_ERROR);

  status = RAIL_SetStateTiming(railHandle, &mfmConfig.timings);
  assert(status == RAIL_STATUS_NO_ERROR);

  mfmConfig.dataConfig.txSource = TX_MFM_DATA;
  status = RAIL_ConfigData(railHandle, &mfmConfig.dataConfig);
  assert(status == RAIL_STATUS_NO_ERROR);

  // start transmitting
  status = RAIL_StartTx(railHandle, 0, 0, NULL);
  assert(status == RAIL_STATUS_NO_ERROR);
}

void mfmDeInit(void)
{
  RAIL_Status_t status;
  status = RAIL_StopTx(railHandle, RAIL_STOP_MODES_ALL);
  assert(status == RAIL_STATUS_NO_ERROR);

  mfmConfig.dataConfig.txSource = TX_PACKET_DATA;
  status = RAIL_ConfigData(railHandle, &mfmConfig.dataConfig);
  assert(status == RAIL_STATUS_NO_ERROR);
}

```

**Note**

- This feature is only supported on EFR32xG23 devices.

This feature can be used to directly control the TX interpolation filter input to allow for a more flexible frequency modulation scheme than the standard MODEM. When doing this, the MFM buffer is treated as an array of 8-bit signed data used as normalized frequency deviation to the SYNTH frequency to directly control the interpolation filter input. No support for frame handling, coding, nor shaping is supported. Only compatible with FSK modulations.

The functions in this group configure RAIL Multi-Level Frequency Modulation (MFM) hardware acceleration features.

To configure MFM functionality, the application must first set up a RAIL instance with [sl_rail_init()](general#sl-rail-init) and other setup functions. Before enabling MFM, a ping-pong buffer (called buffer0 and buffer1 below) must be configured via [sl_rail_set_mfm_ping_pong_fifo()](mfm#sl-rail-set-mfm-ping-pong-fifo) and populated with the initial buffer content. MFM is enabled by setting [sl_rail_tx_data_source_t::SL_RAIL_TX_DATA_SOURCE_MFM_DATA](data-management#sl-rail-tx-data-source-mfm-data) using [sl_rail_config_tx_data()](data-management#sl-rail-config-tx-data) and is activated when transmit is started by [sl_rail_start_tx()](packet-tx#sl-rail-start-tx). Once transmitting the data in the ping-pong buffers, RAIL will manage them so it looks like a continuous transmission to the receiver. Every time one of the ping-pong buffers has been transmitted, [SL_RAIL_EVENT_MFM_TX_BUFFER_DONE](events#sl-rail-event-mfm-tx-buffer-done) is triggered so the application can update the data in that buffer without the need to start/stop the transmission. [SL_RAIL_EVENT_MFM_TX_BUFFER_DONE](events#sl-rail-event-mfm-tx-buffer-done) can be enable with [sl_rail_config_events()](events#sl-rail-config-events). Use [sl_rail_stop_tx()](transmit#sl-rail-stop-tx) to finish transmitting. 

```c
#define MFM_RAW_BUF_WORDS 128
extern sl_rail_handle_t rail_handle;
uint8_t tx_count = 0;
uint32_t mfm_ping_pong_buffers[2][MFM_RAW_BUF_WORDS];

typedef struct mfm_config_app {
  sl_rail_mfm_ping_pong_buffer_config_t buffer;
  sl_rail_state_timing_t timings;
  sl_rail_tx_data_config_t tx_data_config;
} mfm_config_app_t;

static mfm_config_app_t mfm_config = {
  .buffer = {
    .p_buffer_0 = (&mfm_ping_pong_buffers[0]),
    .p_buffer_1 = (&mfm_ping_pong_buffers[1]),
    .buffer_words = MFM_RAW_BUF_WORDS,
  },
  .timings = {
    .idle_to_tx = 100,
    .idle_to_rx = 0,
    .rx_to_tx = 0,
    .tx_to_rx = 0,
    .rxsearch_timeout = 0,
    .tx_to_rxsearch_timeout = 0
  },
  .tx_data_config = {
     .tx_source = SL_RAIL_TX_DATA_SOURCE_MFM_DATA;
     .tx_method = SL_RAIL_DATA_METHOD_PACKET_MODE,
  },
};

// Main RAIL events handler callback
static void events_handler(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Increment TX counter
  if (events & SL_RAIL_EVENT_MFM_BUF_DONE) {
      tx_count++;
      return;
    }
  }
}

void mfm_init(void)
{
  // initialize MFM
  uint32_t idx;
  uint32_t *p_dst_0 = mfm_config.buffer.p_buffer_0;
  uint32_t *p_dst_1 = mfm_config.buffer.p_buffer_1;
  for (idx = 0; idx < (mfm_config.buffer.buffer_words / 4); idx++) {
    p_dst_0[4 * idx + 0] = 0x755A3100;
    p_dst_1[4 * idx + 0] = 0x755A3100;
    p_dst_0[4 * idx + 1] = 0x315A757F;
    p_dst_1[4 * idx + 1] = 0x315A757F;
    p_dst_0[4 * idx + 2] = 0x8BA6CF00;
    p_dst_1[4 * idx + 2] = 0x8BA6CF00;
    p_dst_0[4 * idx + 3] = 0xCFA68B81;
    p_dst_1[4 * idx + 3] = 0xCFA68B81;
  }

  sl_rail_status_t status;
  status = sl_rail_set_mfm_ping_pong_fifo(rail_handle, &mfm_config.buffer);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  status = sl_rail_set_state_timing(rail_handle, &mfm_config.timings);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  mfm_config.tx_data_config.tx_source = SL_RAIL_TX_DATA_SOURCE_MFM_DATA;
  status = sl_rail_config_tx_data(rail_handle, &mfm_config.tx_data_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // start transmitting
  status = sl_rail_start_tx(rail_handle, 0, 0, NULL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

void mfm_deinit(void)
{
  sl_rail_status_t status;
  status = sl_rail_stop_tx(rail_handle, SL_RAIL_STOP_MODES_ALL);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  mfm_config.tx_data_config.tx_source = SL_RAIL_TX_DATA_SOURCE_PACKET_DATA;
  status = sl_rail_config_tx_data(rail_handle, &mfm_config.tx_data_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

```

###### Modules

[RAIL_MFM_PingPongBufferConfig_t](rail-mfm-ping-pong-buffer-config-t)

[sl_rail_mfm_ping_pong_buffer_config_t](sl-rail-mfm-ping-pong-buffer-config-t)

###### Functions

###### RAIL_SetMfmPingPongFifo (heading level 7)

`RAIL_Status_t RAIL_SetMfmPingPongFifo(RAIL_Handle_t railHandle, const RAIL_MFM_PingPongBufferConfig_t *config)`

**Description:** Set MFM ping-pong buffer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle of RAIL instance.|
|const [RAIL_MFM_PingPongBufferConfig_t](rail-mfm-ping-pong-buffer-config-t) *|[in]|config|A non-NULL pointer to the MFM ping-pong buffer configuration structure.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_mfm_ping_pong_fifo()](mfm#sl-rail-set-mfm-ping-pong-fifo). 

###### sl_rail_set_mfm_ping_pong_fifo (heading level 7)

`sl_rail_status_t sl_rail_set_mfm_ping_pong_fifo(sl_rail_handle_t rail_handle, const sl_rail_mfm_ping_pong_buffer_config_t *p_config)`

**Description:** Set MFM ping-pong buffer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_mfm_ping_pong_buffer_config_t](sl-rail-mfm-ping-pong-buffer-config-t) *|[in]|p_config|A non-NULL pointer to the MFM ping-pong buffer configuration structure.|

**Returns**

- Status code indicating success of the function call.

A configuration structure for MFM Ping-pong buffer in RAIL. 

**Deprecated**RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t](sl-rail-mfm-ping-pong-buffer-config-t). 

###### Public Attributes (heading level 7)

###### pBuffer0 (heading level 8)

```
uint32_t* RAIL_MFM_PingPongBufferConfig_t::pBuffer0
```

**Description:** A pointer to buffer 0.

**Details:** Must be 32-bit aligned.

**Deprecated**RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_0](sl-rail-mfm-ping-pong-buffer-config-t#p-buffer-0).

###### pBuffer1 (heading level 8)

```
uint32_t* RAIL_MFM_PingPongBufferConfig_t::pBuffer1
```

**Description:** A pointer to buffer 1.

**Details:** Must be 32-bit aligned.

**Deprecated**RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_1](sl-rail-mfm-ping-pong-buffer-config-t#p-buffer-1).

###### bufferSizeWords (heading level 8)

```
uint32_t RAIL_MFM_PingPongBufferConfig_t::bufferSizeWords
```

**Description:** Size of each buffer in 32-bit words.

**Details:** **Deprecated**RAIL 2.x equivalent of [sl_rail_mfm_ping_pong_buffer_config_t::buffer_words](sl-rail-mfm-ping-pong-buffer-config-t#buffer-words).

A configuration structure for MFM Ping-pong buffer in RAIL. 

###### Public Attributes (heading level 7)

###### p_buffer_0 (heading level 8)

```
uint32_t* sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_0
```

**Description:** A pointer to buffer 0.

**Details:** Must be 32-bit aligned.

###### p_buffer_1 (heading level 8)

```
uint32_t* sl_rail_mfm_ping_pong_buffer_config_t::p_buffer_1
```

**Description:** A pointer to buffer 1.

**Details:** Must be 32-bit aligned.

###### buffer_words (heading level 8)

```
uint32_t sl_rail_mfm_ping_pong_buffer_config_t::buffer_words
```

**Description:** Size of each buffer in 32-bit words.

##### Z-Wave

Z-Wave configuration routines. 

The functions in this group configure RAIL Z-Wave hardware acceleration features.

To configure Z-Wave functionality, the application must first set up a RAIL instance with [RAIL_Init()](general#rail-init) and other setup functions. 

```c
RAIL_ZWAVE_NodeId_t gRecentBeamNodeId;
uint8_t gRecentBeamChannelIndex;

// Main RAIL_EVENT callback
static void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Get beam Node Id and channel index from beam packet
  if (events & RAIL_EVENT_ZWAVE_BEAM) {
    if (RAIL_ZWAVE_IsEnabled(railHandle)) {
      if ((RAIL_ZWAVE_GetBeamNodeId(railHandle, &gRecentBeamNodeId)
           != RAIL_STATUS_NO_ERROR)
          || (RAIL_ZWAVE_GetBeamChannelIndex(railHandle, &gRecentBeamChannelIndex)
              != RAIL_STATUS_NO_ERROR)) {
        return;
      }
    }
  }
}

static const RAIL_ZWAVE_Config_t zwaveConfig = {
  .options = RAIL_ZWAVE_OPTIONS_DEFAULT
};

RAIL_Status_t zwaveInit(void)
{
  // initialize Z-Wave
  RAIL_Status_t status = RAIL_ZWAVE_Init(railHandle, &zwaveConfig);

  if (status != RAIL_STATUS_NO_ERROR) {
    return status;
  }

  uint8_t myHomeId[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
  RAIL_ZWAVE_SetNodeId(railHandle, RAIL_ZWAVE_NODE_ID_DEFAULT);
  RAIL_ZWAVE_SetHomeId(railHandle, myHomeId, RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE);

  // configure region to EU(European Union)
  return RAIL_ZWAVE_ConfigRegion(railHandle, RAIL_ZWAVE_REGION_EU);
}

```

The functions in this group configure RAIL Z-Wave hardware acceleration features.

To configure Z-Wave functionality, the application must first set up a RAIL instance with [sl_rail_init()](general#sl-rail-init) and other setup functions. 

```c
sl_rail_zwave_beam_details_t g_recent_beam_details;

// Main SL_RAIL_EVENT callback
static void rail_events_callback(sl_rail_handle_t rail_handle,
                                 sl_rail_events_t events)
{
  // Get beam details from the beam packet
  if (events & SL_RAIL_EVENT_ZWAVE_BEAM) {
    if (sl_rail_zwave_is_enabled(rail_handle)) {
      if (sl_rail_zwave_get_rx_beam_details(rail_handle, &g_recent_beam_details)
          != SL_RAIL_STATUS_NO_ERROR)
        return;
      }
    }
  }
}

static const sl_rail_zwave_config_t zwave_config = {
  .options = SL_RAIL_ZWAVE_OPTIONS_DEFAULT
};

void zwave_init(void)
{
  // initialize Z-Wave
  sl_rail_status_t status = sl_rail_zwave_init(rail_handle, &zwave_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  uint8_t my_home_id[4] = { 0xDE, 0xAD, 0xBE, 0xEF };
  sl_rail_zwave_set_node_id(rail_handle, SL_RAIL_ZWAVE_NODE_ID_DEFAULT);
  sl_rail_zwave_set_home_id(rail_handle, my_home_id, SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE);

  // configure region to EU(European Union)
  status = sl_rail_zwave_config_region(rail_handle, SL_RAIL_ZWAVE_REGION_EU);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
}

```

###### Modules

[RAIL_ZWAVE_Config_t](rail-zwave-config-t)

[RAIL_ZWAVE_LrAckData_t](rail-zwave-lr-ack-data-t)

[RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t)

[RAIL_ZWAVE_RegionConfig_t](rail-zwave-region-config-t)

[RAIL_ZWAVE_IrcalVal_t](rail-zwave-ircal-val-t)

[sl_rail_zwave_config_t](sl-rail-zwave-config-t)

[sl_rail_zwave_lr_ack_data_t](sl-rail-zwave-lr-ack-data-t)

[sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t)

[sl_rail_zwave_region_config_t](sl-rail-zwave-region-config-t)

[sl_rail_zwave_beam_details_t](sl-rail-zwave-beam-details-t)

[sl_rail_zwave_ir_cal_val_t](sl-rail-zwave-ir-cal-val-t)

###### Enumerations

###### RAIL_ZWAVE_Options_t (heading level 7)

```
enum RAIL_ZWAVE_Options_t {
    RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT = 0
    RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT = 1
    RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT = 2
    RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT = 3
}
```

**Description:**

Z-Wave options.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_options_t](z-wave#sl-rail-zwave-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT|Shift position of [RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#rail-zwave-option-promiscuous-mode) bit.|
|RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT|Shift position of [RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#rail-zwave-option-detect-beam-frames) bit.|
|RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT|Shift position of [RAIL_ZWAVE_OPTION_NODE_ID_FILTERING](z-wave#rail-zwave-option-node-id-filtering) bit.|
|RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT|Shift position of [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode) bit.|

###### RAIL_ZWAVE_NodeId_t (heading level 7)

```
enum RAIL_ZWAVE_NodeId_t {
    RAIL_ZWAVE_NODE_ID_NONE = 0x00U
    RAIL_ZWAVE_NODE_ID_BROADCAST = 0xFFU
    RAIL_ZWAVE_NODE_ID_DEFAULT = RAIL_ZWAVE_NODE_ID_BROADCAST
    RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE = 0xFFFU
    RAIL_ZWAVE_NODE_ID_DEFAULT_LONGRANGE = RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE
}
```

**Description:**

A Z-Wave Node Id.

**Details:**

This data type is 12 bits wide when using the ZWave Long Range PHY, and 8 bits wide otherwise.

**Note**

- When using the Long Range PHY, values 0xFA1..0xFFE are reserved. Otherwise, values 0xE9..0xFE are reserved.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_node_id_t](z-wave#sl-rail-zwave-node-id-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_NODE_ID_NONE|The unknown Node Id for uninitialized nodes.|
|RAIL_ZWAVE_NODE_ID_BROADCAST|The broadcast Node Id.|
|RAIL_ZWAVE_NODE_ID_DEFAULT|Default to the broadcast Node Id.|
|RAIL_ZWAVE_NODE_ID_BROADCAST_LONGRANGE|The Long Range broadcast Node Id.|
|RAIL_ZWAVE_NODE_ID_DEFAULT_LONGRANGE|Default to the Long Range broadcast Node Id.|

###### RAIL_ZWAVE_HomeId_t (heading level 7)

```
enum RAIL_ZWAVE_HomeId_t {
    RAIL_ZWAVE_HOME_ID_UNKNOWN = 0x00000000U
    RAIL_ZWAVE_HOME_ID_DEFAULT = 0x54545454U
}
```

**Description:**

A Z-Wave Home Id.

**Details:**

**Note**

- Home Ids in the range 0x54000000..0x55FFFFFF are illegal.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_home_id_t](z-wave#sl-rail-zwave-home-id-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_HOME_ID_UNKNOWN|The unknown Home Id.|
|RAIL_ZWAVE_HOME_ID_DEFAULT|An impossible and unlikely Home Id.|

###### RAIL_ZWAVE_HomeIdHash_t (heading level 7)

```
enum RAIL_ZWAVE_HomeIdHash_t {
    RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1 = 0x0AU
    RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2 = 0x4AU
    RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3 = 0x55U
    RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE = 0x55U
    RAIL_ZWAVE_HOME_ID_HASH_DEFAULT = RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE
}
```

**Description:**

A Z-Wave Home Id hash.

**Details:**

**Note**

- Certain values (as shown) are illegal.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_home_id_hash_t](z-wave#sl-rail-zwave-home-id-hash-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1|An illegal Home Id hash value.|
|RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2|An illegal Home Id hash value.|
|RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_3|An illegal Home Id hash value.|
|RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE|Illegal Home Id hash value that suppresses checking the Home Id hash field of beam packets.|
|RAIL_ZWAVE_HOME_ID_HASH_DEFAULT|Default to don't care.|

###### RAIL_ZWAVE_Baud_t (heading level 7)

```
enum RAIL_ZWAVE_Baud_t {
    RAIL_ZWAVE_BAUD_9600
    RAIL_ZWAVE_BAUD_40K
    RAIL_ZWAVE_BAUD_100K
    RAIL_ZWAVE_LR
    RAIL_ZWAVE_ENERGY_DETECT = RAIL_ZWAVE_LR
    RAIL_ZWAVE_BAUD_INVALID
}
```

**Description:**

Z-Wave supported baud rates or PHYs.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_baud_t](z-wave#sl-rail-zwave-baud-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_BAUD_9600|9.6 kbps baud rate.|
|RAIL_ZWAVE_BAUD_40K|40 kbps baud rate.|
|RAIL_ZWAVE_BAUD_100K|100 kbps baud rate.|
|RAIL_ZWAVE_LR|Long Range PHY.|
|RAIL_ZWAVE_ENERGY_DETECT|Energy detection PHY.|
|RAIL_ZWAVE_BAUD_INVALID|Sentinel value for invalid baud rate.|

###### RAIL_ZWAVE_RegionId_t (heading level 7)

```
enum RAIL_ZWAVE_RegionId_t {
    RAIL_ZWAVE_REGIONID_UNKNOWN = 0
    RAIL_ZWAVE_REGIONID_EU = 1
    RAIL_ZWAVE_REGIONID_US = 2
    RAIL_ZWAVE_REGIONID_ANZ = 3
    RAIL_ZWAVE_REGIONID_HK = 4
    RAIL_ZWAVE_REGIONID_MY = 5
    RAIL_ZWAVE_REGIONID_IN = 6
    RAIL_ZWAVE_REGIONID_JP = 7
    RAIL_ZWAVE_REGIONID_RU = 8
    RAIL_ZWAVE_REGIONID_IL = 9
    RAIL_ZWAVE_REGIONID_KR = 10
    RAIL_ZWAVE_REGIONID_CN = 11
    RAIL_ZWAVE_REGIONID_US_LR1 = 12
    RAIL_ZWAVE_REGIONID_US_LR2 = 13
    RAIL_ZWAVE_REGIONID_US_LR3 = 14
    RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE = RAIL_ZWAVE_REGIONID_US_LR3
    RAIL_ZWAVE_REGIONID_EU_LR1 = 15
    RAIL_ZWAVE_REGIONID_EU_LR2 = 16
    RAIL_ZWAVE_REGIONID_EU_LR3 = 17
    RAIL_ZWAVE_REGIONID_EU_LR_END_DEVICE = RAIL_ZWAVE_REGIONID_EU_LR3
    RAIL_ZWAVE_REGIONID_COUNT
}
```

**Description:**

Z-Wave region identifications.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_id_t](z-wave#sl-rail-zwave-region-id-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_ZWAVE_REGIONID_UNKNOWN|Unknown/Invalid.|
|RAIL_ZWAVE_REGIONID_EU|European Union.|
|RAIL_ZWAVE_REGIONID_US|United States.|
|RAIL_ZWAVE_REGIONID_ANZ|Australia/New Zealand.|
|RAIL_ZWAVE_REGIONID_HK|Hong Kong.|
|RAIL_ZWAVE_REGIONID_MY|Malaysia.|
|RAIL_ZWAVE_REGIONID_IN|India.|
|RAIL_ZWAVE_REGIONID_JP|Japan.|
|RAIL_ZWAVE_REGIONID_RU|Russian Federation.|
|RAIL_ZWAVE_REGIONID_IL|Israel.|
|RAIL_ZWAVE_REGIONID_KR|Korea.|
|RAIL_ZWAVE_REGIONID_CN|China.|
|RAIL_ZWAVE_REGIONID_US_LR1|United States, with first long range PHY.|
|RAIL_ZWAVE_REGIONID_US_LR2|United States, with second long range PHY.|
|RAIL_ZWAVE_REGIONID_US_LR3|United States, with third long range PHY.|
|RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE|**Deprecated**This RAIL 2.x backwards compatible enum value has been eliminated in RAIL 3; use [SL_RAIL_ZWAVE_REGION_ID_US_LR_3](z-wave#sl-rail-zwave-region-id-us-lr-3).|
|RAIL_ZWAVE_REGIONID_EU_LR1|European Union, with first long range PHY.|
|RAIL_ZWAVE_REGIONID_EU_LR2|European Union, with second long range PHY.|
|RAIL_ZWAVE_REGIONID_EU_LR3|European Union, with third long range PHY.|
|RAIL_ZWAVE_REGIONID_EU_LR_END_DEVICE|**Deprecated**This RAIL 2.x backwards compatible enum value has been eliminated in RAIL 3, use [SL_RAIL_ZWAVE_REGION_ID_EU_LR_3](z-wave#sl-rail-zwave-region-id-eu-lr-3).|
|RAIL_ZWAVE_REGIONID_COUNT|Count of known regions.|

###### sl_rail_zwave_options_t (heading level 7)

```
enum sl_rail_zwave_options_t {
    SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT = 0
    SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT = 1
    SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT = 2
    SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT = 3
}
```

**Description:**

Z-Wave options.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT|Shift position of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#sl-rail-zwave-option-promiscuous-mode) bit.|
|SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT|Shift position of [SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#sl-rail-zwave-option-detect-beam-frames) bit.|
|SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT|Shift position of [SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING](z-wave#sl-rail-zwave-option-node-id-filtering) bit.|
|SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT|Shift position of [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#sl-rail-zwave-option-promiscuous-beam-mode) bit.|

###### sl_rail_zwave_node_id_t (heading level 7)

```
enum sl_rail_zwave_node_id_t {
    SL_RAIL_ZWAVE_NODE_ID_NONE = 0x00U
    SL_RAIL_ZWAVE_NODE_ID_BROADCAST = 0xFFU
    SL_RAIL_ZWAVE_NODE_ID_DEFAULT = SL_RAIL_ZWAVE_NODE_ID_BROADCAST
    SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_BROADCAST = 0xFFFU
    SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_DEFAULT = SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_BROADCAST
}
```

**Description:**

A Z-Wave Node Id.

**Details:**

This data type is 12 bits wide when using the ZWave Long Range PHY, and 8 bits wide otherwise.

**Note**

- When using the Long Range PHY, values 0xFA1..0xFFE are reserved. Otherwise, values 0xE9..0xFE are reserved.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_NODE_ID_NONE|The unknown Node Id for uninitialized nodes.|
|SL_RAIL_ZWAVE_NODE_ID_BROADCAST|The broadcast Node Id.|
|SL_RAIL_ZWAVE_NODE_ID_DEFAULT|Default to the broadcast Node Id.|
|SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_BROADCAST|The Long Range broadcast Node Id.|
|SL_RAIL_ZWAVE_NODE_ID_LONG_RANGE_DEFAULT|Default to the Long Range broadcast Node Id.|

###### sl_rail_zwave_home_id_t (heading level 7)

```
enum sl_rail_zwave_home_id_t {
    SL_RAIL_ZWAVE_HOME_ID_UNKNOWN = 0x00000000U
    SL_RAIL_ZWAVE_HOME_ID_DEFAULT = 0x54545454U
}
```

**Description:**

A Z-Wave Home Id.

**Details:**

**Note**

- Home Ids in the range 0x54000000..0x55FFFFFF are illegal.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_HOME_ID_UNKNOWN|The unknown Home Id.|
|SL_RAIL_ZWAVE_HOME_ID_DEFAULT|An impossible and unlikely Home Id.|

###### sl_rail_zwave_home_id_hash_t (heading level 7)

```
enum sl_rail_zwave_home_id_hash_t {
    SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_0 = 0x0AU
    SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1 = 0x4AU
    SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2 = 0x55U
    SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE = 0x55U
    SL_RAIL_ZWAVE_HOME_ID_HASH_DEFAULT = SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE
}
```

**Description:**

A Z-Wave Home Id hash.

**Details:**

**Note**

- Certain values (as shown) are illegal.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_0|An illegal Home Id hash value.|
|SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_1|An illegal Home Id hash value.|
|SL_RAIL_ZWAVE_HOME_ID_HASH_ILLEGAL_2|An illegal Home Id hash value.|
|SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE|Illegal Home Id hash value that suppresses checking the Home Id hash field of beam packets.|
|SL_RAIL_ZWAVE_HOME_ID_HASH_DEFAULT|Default to don't care.|

###### sl_rail_zwave_baud_t (heading level 7)

```
enum sl_rail_zwave_baud_t {
    SL_RAIL_ZWAVE_BAUD_9600 = 0u
    SL_RAIL_ZWAVE_BAUD_40_K = 1u
    SL_RAIL_ZWAVE_BAUD_100_K = 2u
    SL_RAIL_ZWAVE_BAUD_LR = 3u
    SL_RAIL_ZWAVE_BAUD_INVALID
}
```

**Description:**

Z-Wave supported baud rates or PHYs.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_BAUD_9600|9.6 kbps baud rate.|
|SL_RAIL_ZWAVE_BAUD_40_K|40 kbps baud rate.|
|SL_RAIL_ZWAVE_BAUD_100_K|100 kbps baud rate.|
|SL_RAIL_ZWAVE_BAUD_LR|Long Range PHY.|
|SL_RAIL_ZWAVE_BAUD_INVALID|Sentinel value for invalid baud rate.|

###### sl_rail_zwave_phy_t (heading level 7)

```
enum sl_rail_zwave_phy_t {
    SL_RAIL_ZWAVE_PHY_9P6_KBPS = 0u
    SL_RAIL_ZWAVE_PHY_9P6_KBPS_CONCURRENT = 1u
    SL_RAIL_ZWAVE_PHY_40_KBPS = 2u
    SL_RAIL_ZWAVE_PHY_40_KBPS_BEAM = 3u
    SL_RAIL_ZWAVE_PHY_100_KBPS = 4u
    SL_RAIL_ZWAVE_PHY_100_KBPS_LOWSIDE = 5u
    SL_RAIL_ZWAVE_PHY_100_KBPS_BEAM = 6u
    SL_RAIL_ZWAVE_PHY_100_KBPS_LOWSIDE_BEAM = 7u
    SL_RAIL_ZWAVE_PHY_LONG_RANGE = 8u
    SL_RAIL_ZWAVE_PHY_LONG_RANGE_BEAM = 9u
}
```

**Description:**

The Z-Wave PHY identifier (aka PTI radio configuration id).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_PHY_9P6_KBPS||
|SL_RAIL_ZWAVE_PHY_9P6_KBPS_CONCURRENT||
|SL_RAIL_ZWAVE_PHY_40_KBPS||
|SL_RAIL_ZWAVE_PHY_40_KBPS_BEAM||
|SL_RAIL_ZWAVE_PHY_100_KBPS||
|SL_RAIL_ZWAVE_PHY_100_KBPS_LOWSIDE||
|SL_RAIL_ZWAVE_PHY_100_KBPS_BEAM||
|SL_RAIL_ZWAVE_PHY_100_KBPS_LOWSIDE_BEAM||
|SL_RAIL_ZWAVE_PHY_LONG_RANGE||
|SL_RAIL_ZWAVE_PHY_LONG_RANGE_BEAM||

###### sl_rail_zwave_region_id_t (heading level 7)

```
enum sl_rail_zwave_region_id_t {
    SL_RAIL_ZWAVE_REGION_ID_UNKNOWN = 0u
    SL_RAIL_ZWAVE_REGION_ID_EU = 1u
    SL_RAIL_ZWAVE_REGION_ID_US = 2u
    SL_RAIL_ZWAVE_REGION_ID_ANZ = 3u
    SL_RAIL_ZWAVE_REGION_ID_HK = 4u
    SL_RAIL_ZWAVE_REGION_ID_MY = 5u
    SL_RAIL_ZWAVE_REGION_ID_IN = 6u
    SL_RAIL_ZWAVE_REGION_ID_JP = 7u
    SL_RAIL_ZWAVE_REGION_ID_RU = 8u
    SL_RAIL_ZWAVE_REGION_ID_IL = 9u
    SL_RAIL_ZWAVE_REGION_ID_KR = 10u
    SL_RAIL_ZWAVE_REGION_ID_CN = 11u
    SL_RAIL_ZWAVE_REGION_ID_US_LR_1 = 12u
    SL_RAIL_ZWAVE_REGION_ID_US_LR_2 = 13u
    SL_RAIL_ZWAVE_REGION_ID_US_LR_3 = 14u
    SL_RAIL_ZWAVE_REGION_ID_EU_LR_1 = 15u
    SL_RAIL_ZWAVE_REGION_ID_EU_LR_2 = 16u
    SL_RAIL_ZWAVE_REGION_ID_EU_LR_3 = 17u
    SL_RAIL_ZWAVE_REGION_ID_COUNT
}
```

**Description:**

Z-Wave region identifications.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_ZWAVE_REGION_ID_UNKNOWN|Unknown/Invalid.|
|SL_RAIL_ZWAVE_REGION_ID_EU|European Union.|
|SL_RAIL_ZWAVE_REGION_ID_US|United States.|
|SL_RAIL_ZWAVE_REGION_ID_ANZ|Australia/New Zealand.|
|SL_RAIL_ZWAVE_REGION_ID_HK|Hong Kong.|
|SL_RAIL_ZWAVE_REGION_ID_MY|Malaysia.|
|SL_RAIL_ZWAVE_REGION_ID_IN|India.|
|SL_RAIL_ZWAVE_REGION_ID_JP|Japan.|
|SL_RAIL_ZWAVE_REGION_ID_RU|Russian Federation.|
|SL_RAIL_ZWAVE_REGION_ID_IL|Israel.|
|SL_RAIL_ZWAVE_REGION_ID_KR|Korea.|
|SL_RAIL_ZWAVE_REGION_ID_CN|China.|
|SL_RAIL_ZWAVE_REGION_ID_US_LR_1|United States, with first long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_US_LR_2|United States, with second long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_US_LR_3|United States, with third long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_EU_LR_1|European Union, with first long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_EU_LR_2|European Union, with second long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_EU_LR_3|European Union, with third long range PHY.|
|SL_RAIL_ZWAVE_REGION_ID_COUNT|Count of known regions.|

###### Typedefs

###### RAIL_RxChannelHoppingParameters_t (heading level 7)

`RAIL_RxChannelHoppingParameters_t`

**Description:**

Rx channel hopping on-channel time for all Z-Wave channels in a region.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_rx_channel_hopping_parameters_t](z-wave#sl-rail-zwave-rx-channel-hopping-parameters-t).

###### sl_rail_zwave_rx_channel_hopping_parameters_t (heading level 7)

`sl_rail_zwave_rx_channel_hopping_parameters_t`

**Description:**

Rx channel hopping on-channel time for all Z-Wave channels in a region.

###### Variables

###### RAIL_ZWAVE_REGION_EU (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_EU
```

**Description:** EU-European Union.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_eu](z-wave#sl-rail-zwave-region-eu).

###### RAIL_ZWAVE_REGION_US (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US
```

**Description:** US-United States.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_us](z-wave#sl-rail-zwave-region-us).

###### RAIL_ZWAVE_REGION_ANZ (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_ANZ
```

**Description:** ANZ-Australia/New Zealand.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_anz](z-wave#sl-rail-zwave-region-anz).

###### RAIL_ZWAVE_REGION_HK (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_HK
```

**Description:** HK-Hong Kong.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_hk](z-wave#sl-rail-zwave-region-hk).

###### RAIL_ZWAVE_REGION_MY (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_MY
```

**Description:** MY-Malaysia.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_my](z-wave#sl-rail-zwave-region-my).

###### RAIL_ZWAVE_REGION_IN (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_IN
```

**Description:** IN-India.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_in](z-wave#sl-rail-zwave-region-in).

###### RAIL_ZWAVE_REGION_JP (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_JP
```

**Description:** JP-Japan.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_jp](z-wave#sl-rail-zwave-region-jp).

###### RAIL_ZWAVE_REGION_JPED (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_JPED
```

**Description:** JP-Japan Energy-Detect.

**Details:** **Deprecated**This RAIL 2.x region config has been eliminated in RAIL 3; it only applied to devices no longer supported.

###### RAIL_ZWAVE_REGION_RU (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_RU
```

**Description:** RU-Russia.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_ru](z-wave#sl-rail-zwave-region-ru).

###### RAIL_ZWAVE_REGION_IL (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_IL
```

**Description:** IL-Israel.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_il](z-wave#sl-rail-zwave-region-il).

###### RAIL_ZWAVE_REGION_KR (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_KR
```

**Description:** KR-Korea.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_kr](z-wave#sl-rail-zwave-region-kr).

###### RAIL_ZWAVE_REGION_KRED (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_KRED
```

**Description:** KR-Korea Energy-Detect.

**Details:** **Deprecated**This RAIL 2.x region config has been eliminated in RAIL 3; it only applied to devices no longer supported.

###### RAIL_ZWAVE_REGION_CN (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_CN
```

**Description:** CN-China.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_cn](z-wave#sl-rail-zwave-region-cn).

###### RAIL_ZWAVE_REGION_US_LR1 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR1
```

**Description:** US-Long Range 1.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_1](z-wave#sl-rail-zwave-region-us-lr-1).

###### RAIL_ZWAVE_REGION_US_LR2 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR2
```

**Description:** US-Long Range 2.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_2](z-wave#sl-rail-zwave-region-us-lr-2).

###### RAIL_ZWAVE_REGION_US_LR3 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_US_LR3
```

**Description:** US-Long Range 3.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_us_lr_3](z-wave#sl-rail-zwave-region-us-lr-3).

###### RAIL_ZWAVE_REGION_EU_LR1 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_EU_LR1
```

**Description:** EU-Long Range 1.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_1](z-wave#sl-rail-zwave-region-eu-lr-1).

###### RAIL_ZWAVE_REGION_EU_LR2 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_EU_LR2
```

**Description:** EU-Long Range 2.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_2](z-wave#sl-rail-zwave-region-eu-lr-2).

###### RAIL_ZWAVE_REGION_EU_LR3 (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_EU_LR3
```

**Description:** EU-Long Range 3.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_eu_lr_3](z-wave#sl-rail-zwave-region-eu-lr-3).

###### RAIL_ZWAVE_REGION_INVALID (heading level 7)

```
const RAIL_ZWAVE_RegionConfig_t RAIL_ZWAVE_REGION_INVALID
```

**Description:** Invalid Region.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_invalid](z-wave#sl-rail-zwave-region-invalid).

###### sl_rail_zwave_region_eu (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_eu
```

**Description:** EU-European Union.

###### sl_rail_zwave_region_us (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_us
```

**Description:** US-United States.

###### sl_rail_zwave_region_anz (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_anz
```

**Description:** ANZ-Australia/New Zealand.

###### sl_rail_zwave_region_hk (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_hk
```

**Description:** HK-Hong Kong.

###### sl_rail_zwave_region_my (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_my
```

**Description:** MY-Malaysia.

###### sl_rail_zwave_region_in (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_in
```

**Description:** IN-India.

###### sl_rail_zwave_region_jp (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_jp
```

**Description:** JP-Japan.

###### sl_rail_zwave_region_ru (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_ru
```

**Description:** RU-Russia.

###### sl_rail_zwave_region_il (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_il
```

**Description:** IL-Israel.

###### sl_rail_zwave_region_kr (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_kr
```

**Description:** KR-Korea.

###### sl_rail_zwave_region_cn (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_cn
```

**Description:** CN-China.

###### sl_rail_zwave_region_us_lr_1 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_us_lr_1
```

**Description:** US-Long Range 1.

###### sl_rail_zwave_region_us_lr_2 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_us_lr_2
```

**Description:** US-Long Range 2.

###### sl_rail_zwave_region_us_lr_3 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_us_lr_3
```

**Description:** US-Long Range 3.

###### sl_rail_zwave_region_eu_lr_1 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_eu_lr_1
```

**Description:** EU-Long Range 1.

###### sl_rail_zwave_region_eu_lr_2 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_eu_lr_2
```

**Description:** EU-Long Range 2.

###### sl_rail_zwave_region_eu_lr_3 (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_eu_lr_3
```

**Description:** EU-Long Range 3.

###### sl_rail_zwave_region_invalid (heading level 7)

```
const sl_rail_zwave_region_config_t sl_rail_zwave_region_invalid
```

**Description:** Invalid Region.

###### sl_rail_zwave_region_cfg (heading level 7)

```
const sl_rail_zwave_region_config_t* const sl_rail_zwave_region_cfg[SL_RAIL_ZWAVE_REGION_ID_COUNT]
```

**Description:** An array of region configurations indexed by [sl_rail_zwave_region_id_t](z-wave#sl-rail-zwave-region-id-t).

###### Functions

###### RAIL_ZWAVE_ConfigRegion (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_ConfigRegion(RAIL_Handle_t railHandle, const RAIL_ZWAVE_RegionConfig_t *regionCfg)`

**Description:** Switch the Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ZWAVE_RegionConfig_t](rail-zwave-region-config-t) *|[in]|regionCfg|A pointer to a Z-Wave channel configuration for the selected region.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Setting a new Z-Wave Region will default any Low Power values to Normal Power values for the region. Z-Wave Region configuration must always be followed by a Low Power setup in case one desires to have the Low Power Acking functionality.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region). 

###### RAIL_ZWAVE_PerformIrcal (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_PerformIrcal(RAIL_Handle_t railHandle, RAIL_ZWAVE_IrcalVal_t *pIrCalVals, bool forceIrcal)`

**Description:** Perform image rejection calibration on all valid channels of a Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_IrcalVal_t](rail-zwave-ircal-val-t) *|[inout]|pIrCalVals|An application-provided pointer of type [RAIL_ZWAVE_IrcalVal_t](rail-zwave-ircal-val-t). This is populated with image rejection calibration values, if not NULL or initialized with [RAIL_CAL_INVALID_VALUE](calibration#rail-cal-invalid-value) or if forceIrcal is true.|
|bool|[in]|forceIrcal|If true, will always perform image rejection calibration and not use previously cached values.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function also calibrates for beam detection and should be called before [RAIL_ZWAVE_ReceiveBeam()](z-wave#rail-zwave-receive-beam) and after the Z-Wave region has been configured via [RAIL_ZWAVE_ConfigRegion()](z-wave#rail-zwave-config-region). Channel hopping must be disabled otherwise this function will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_perform_ir_cal()](z-wave#sl-rail-zwave-perform-ir-cal). 

###### RAIL_ZWAVE_Init (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_Init(RAIL_Handle_t railHandle, const RAIL_ZWAVE_Config_t *config)`

**Description:** Initialize RAIL for Z-Wave features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ZWAVE_Config_t](rail-zwave-config-t) *|[in]|config|A pointer to a Z-Wave configuration structure.|

**Returns**

- Status code indicating success of the function call.

This function is the entry point for working with Z-Wave within RAIL. It sets up relevant hardware acceleration for Z-Wave-specific features, such as Home Id filtering and beam packets (as specified in the configuration) and allows users to select the relevant Z-Wave region-specific PHY via [RAIL_ZWAVE_ConfigRegion()](z-wave#rail-zwave-config-region).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_init()](z-wave#sl-rail-zwave-init). 

###### RAIL_ZWAVE_Deinit (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_Deinit(RAIL_Handle_t railHandle)`

**Description:** De-initialize Z-Wave hardware acceleration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Disables and resets all Z-Wave hardware acceleration features. This function should only be called when the radio is idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_deinit()](z-wave#sl-rail-zwave-deinit). 

###### RAIL_ZWAVE_IsEnabled (heading level 7)

`bool RAIL_ZWAVE_IsEnabled(RAIL_Handle_t railHandle)`

**Description:** Return whether Z-Wave hardware acceleration is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if Z-Wave hardware acceleration was enabled to start with and false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_is_enabled()](z-wave#sl-rail-zwave-is-enabled). 

###### RAIL_ZWAVE_ConfigOptions (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_ConfigOptions(RAIL_Handle_t railHandle, RAIL_ZWAVE_Options_t mask, RAIL_ZWAVE_Options_t options)`

**Description:** Configure Z-Wave options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_Options_t](z-wave#rail-zwave-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[RAIL_ZWAVE_Options_t](z-wave#rail-zwave-options-t)|[in]|options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [RAIL_ZWAVE_Options_t](z-wave#rail-zwave-options-t).|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_options()](z-wave#sl-rail-zwave-config-options). 

###### RAIL_ZWAVE_SetNodeId (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetNodeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t nodeId)`

**Description:** Inform RAIL of the Z-Wave node's Node Id for receive filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_NodeId_t](z-wave#rail-zwave-node-id-t)|[in]|nodeId|A Z-Wave Node Id.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Until this API is called, RAIL will assume the Node Id is [RAIL_ZWAVE_NODE_ID_DEFAULT](z-wave#rail-zwave-node-id-default).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_set_node_id()](z-wave#sl-rail-zwave-set-node-id). 

###### RAIL_ZWAVE_SetHomeId (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetHomeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeId_t homeId, RAIL_ZWAVE_HomeIdHash_t homeIdHash)`

**Description:** Inform RAIL of the Z-Wave node's Home Id and its hash for receive filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_HomeId_t](z-wave#rail-zwave-home-id-t)|[in]|homeId|A Z-Wave Home Id.|
|[RAIL_ZWAVE_HomeIdHash_t](z-wave#rail-zwave-home-id-hash-t)|[in]|homeIdHash|The hash of the Home Id expected in beam frames. If this is [RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#rail-zwave-home-id-hash-dont-care), beam frame detection will not check the Home Id hash in a received beam frame at all, and [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) will trigger based solely on the Node Id in the beam frame.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Until this API is called, RAIL will assume the Home Id is an illegal one of [RAIL_ZWAVE_HOME_ID_DEFAULT](z-wave#rail-zwave-home-id-default), and its hash is [RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#rail-zwave-home-id-hash-dont-care).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_set_home_id()](z-wave#sl-rail-zwave-set-home-id). 

###### RAIL_ZWAVE_GetBeamNodeId (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetBeamNodeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t *pNodeId)`

**Description:** Get the Node Id of the most recently seen beam frame that triggered [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_NodeId_t](z-wave#rail-zwave-node-id-t) *|[out]|pNodeId|A pointer to [RAIL_ZWAVE_NodeId_t](z-wave#rail-zwave-node-id-t) to populate.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This is best called while handling the [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event; if multiple beams are received only the most recent beam's NodeId is provided.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::node_id](sl-rail-zwave-beam-details-t#node-id). 

###### RAIL_ZWAVE_GetBeamHomeIdHash (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetBeamHomeIdHash(RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeIdHash_t *pBeamHomeIdHash)`

**Description:** Get the Home Id hash of the most recently seen beam frame that triggered [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ZWAVE_HomeIdHash_t](z-wave#rail-zwave-home-id-hash-t) *|[out]|pBeamHomeIdHash|A pointer to [RAIL_ZWAVE_HomeIdHash_t](z-wave#rail-zwave-home-id-hash-t) to populate.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This is best called while handling the [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event; if multiple beams are received only the most recent beam's Home Id hash is provided.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::home_id_hash](sl-rail-zwave-beam-details-t#home-id-hash). 

###### RAIL_ZWAVE_GetBeamChannelIndex (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetBeamChannelIndex(RAIL_Handle_t railHandle, uint8_t *pChannelIndex)`

**Description:** Get the channel hopping index of the most recently seen beam frame that triggered [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[out]|pChannelIndex|A pointer to a uint8_t to populate with the channel hopping index. If channel-hopping was off at the time the beam packet was received, [RAIL_CHANNEL_HOPPING_INVALID_INDEX](rx-channel-hopping#rail-channel-hopping-invalid-index) is provided.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This is best called while handling the [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event; if multiple beams are received only the most recent beam's channel hopping index is provided.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::channel_index](sl-rail-zwave-beam-details-t#channel-index). 

###### RAIL_ZWAVE_GetLrBeamTxPower (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetLrBeamTxPower(RAIL_Handle_t railHandle, uint8_t *pLrBeamTxPower)`

**Description:** Get the TX power used by the transmitter of the most recently seen long range beam frame that triggered [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[out]|pLrBeamTxPower|An application provided pointer to a uint8_t to be populated with the TX power of the latest long range beam. This will be set to [RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID](z-wave#rail-zwave-lr-beam-tx-power-invalid) if this API is called after receiving a regular non-long-range beam.|

**Returns**

- Status code indicating success of the function call. This function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if called after receiving a regular (non-long-range) beam.

**Note**

- This is best called while handling the [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event; if multiple beams are received only the most recent long range beam's TX power is provided.
- The following table shows long range beam TX power value to dBm value mapping:

|Tx Power Value|Description|
|---|---|
|0|-6 dBm|
|1|-2 dBm|
|2|+2 dBm|
|3|+6 dBm|
|4|+10 dBm|
|5|+13 dBm|
|6|+16 dBm|
|7|+19 dBm|
|8|+21 dBm|
|9|+23 dBm|
|10|+25 dBm|
|11|+26 dBm|
|12|+27 dBm|
|13|+28 dBm|
|14|+29 dBm|
|15|+30 dBm|

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::lr_tx_power](sl-rail-zwave-beam-details-t#lr-tx-power). 

###### RAIL_ZWAVE_GetBeamRssi (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetBeamRssi(RAIL_Handle_t railHandle, int8_t *pBeamRssi)`

**Description:** Get the RSSI of the received beam frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int8_t *|[out]|pBeamRssi|An application provided pointer to a int8_t to be populated with the latest beam's RSSI, in dBm.|

**Returns**

- Status code indicating success of the function call. This function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if called without ever having received a beam.

**Note**

- This is best called while handling the [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event; if multiple beams are received only the most recent beam's RSSI is provided.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) using [sl_rail_zwave_beam_details_t::rssi_dbm](sl-rail-zwave-beam-details-t#rssi-dbm). 

###### RAIL_ZWAVE_SetTxLowPower (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetTxLowPower(RAIL_Handle_t railHandle, uint8_t powerLevel)`

**Description:** Set the Raw Low Power settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|powerLevel|Desired low power raw level.|

**Returns**

- Status code indicating success of the function call.

Low Power settings are required during Ack transmissions when the Low Power Bit is set. This setting is only valid for one subsequent transmission, after which all transmissions will be at the nominal power setting, until re-invoked.

**Deprecated**This RAIL 2.x function has been eliminated. 

###### RAIL_ZWAVE_GetTxLowPower (heading level 7)

`RAIL_TxPowerLevel_t RAIL_ZWAVE_GetTxLowPower(RAIL_Handle_t railHandle)`

**Description:** Get the TX low power in raw units (see [rail_chip_specific.h](rail-chip-specific-h-1) for value ranges).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The chip-specific [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) raw value of the low transmit power.

This API returns the low raw power value that was set by [RAIL_ZWAVE_SetTxLowPower()](z-wave#rail-zwave-set-tx-low-power).

Calling this function before configuring the Low Power PA (i.e., before a successful call to [RAIL_ZWAVE_SetTxLowPowerDbm()](z-wave#rail-zwave-set-tx-low-power-dbm) or [RAIL_ZWAVE_SetTxLowPower()](z-wave#rail-zwave-set-tx-low-power)) will return a low power value that is the same as the nominal power. Also, calling this function before configuring the PA (i.e., before a successful call to [RAIL_ConfigTxPower()](pa#rail-config-tx-power)) will return [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid).

**Deprecated**This RAIL 2.x function has been eliminated. 

###### RAIL_ZWAVE_SetTxLowPowerDbm (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetTxLowPowerDbm(RAIL_Handle_t railHandle, RAIL_TxPower_t power)`

**Description:** Set the Low Power settings in deci-dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|power|Desired low power in deci-dBm.|

**Returns**

- Status code indicating success of the function call.

Low Power settings are required during Ack transmissions when the Low Power Bit is set. This setting is only valid for one subsequent transmission, after which all transmissions will be at the nominal power setting, until re-invoked.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_set_tx_low_power_dbm()](z-wave#sl-rail-zwave-set-tx-low-power-dbm). 

###### RAIL_ZWAVE_GetTxLowPowerDbm (heading level 7)

`RAIL_TxPower_t RAIL_ZWAVE_GetTxLowPowerDbm(RAIL_Handle_t railHandle)`

**Description:** Get the TX low power in terms of deci-dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The chip-specific [RAIL_TxPower_t](pa#rail-tx-power-t) value of the low transmit power in deci-dBm.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_get_tx_low_power_dbm()](z-wave#sl-rail-zwave-get-tx-low-power-dbm). 

###### RAIL_ZWAVE_ReceiveBeam (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_ReceiveBeam(RAIL_Handle_t railHandle, uint8_t *beamDetectIndex, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Implement beam detection and reception algorithms.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t *|[out]|beamDetectIndex|A pointer to an indicator of whether or not a beam was detected at all, regardless of if it was received, generally for use only by instruction from Silicon Labs. Can be NULL.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this operation appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions. Note that Z-Wave currently does not support multiprotocol, so this scheduler info exists to future proof the API for when it does.|

**Returns**

- Status code indicating success of the function call. Reasons for failure include an un-idled radio or a non-Japan non-Korea region configured before calling this function.

This function takes care of all configuration and radio setup to detect and receive beams in the current Z-Wave region. If a beam is detected, RAIL will provide the usual [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) event during which time users can process the beam as expected. However, normal packets may also be received during this time (also triggering [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion) events), in which case, this API may need to be re-called to receive a beam. Users should also listen for [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete), which will indicate that no beam is heard. At that point, the radio will be automatically idled. Until one of these events is received, users should not try to reconfigure radio settings or start another radio operation. If an application needs to do some other operation or configuration, it must first call [RAIL_Idle()](state-transitions#rail-idle-1) and wait for the radio to idle.

**Note**

- : The radio must be idle before calling this function.
- : [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) must have been called successfully in Z-Wave before this function is called to provide a valid memory buffer for internal use (see [RAIL_RxChannelHoppingConfig_t::buffer](rail-rx-channel-hopping-config-t#buffer)).
- : This function alters radio functionality substantially. After calling it, the user should call [RAIL_ZWAVE_ConfigRegion()](z-wave#rail-zwave-config-region), [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping), [RAIL_EnableRxChannelHopping()](rx-channel-hopping#rail-enable-rx-channel-hopping), and [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions) to reset these parameters to whatever behaviors were desired before calling this function. Additionally, this function will idle the radio upon on exit.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_receive_beam()](z-wave#sl-rail-zwave-receive-beam). 

###### RAIL_ZWAVE_ConfigBeamRx (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_ConfigBeamRx(RAIL_Handle_t railHandle, const RAIL_ZWAVE_BeamRxConfig_t *config)`

**Description:** Configure the receive algorithm used in [RAIL_ZWAVE_ReceiveBeam()](z-wave#rail-zwave-receive-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t) *|[in]|config|A pointer to a configuration for the beam detection algorithm.|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- This function should not be used without direct instruction by Silicon Labs.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_beam_rx()](z-wave#sl-rail-zwave-config-beam-rx). 

###### RAIL_ZWAVE_SetDefaultRxBeamConfig (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetDefaultRxBeamConfig(RAIL_Handle_t railHandle)`

**Description:** Set the default RX beam configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function resets any changes made to the beam configuration via [RAIL_ZWAVE_ConfigBeamRx()](z-wave#rail-zwave-config-beam-rx) and the default beam configuration will be in effect on subsequent call(s) to [RAIL_ZWAVE_ReceiveBeam()](z-wave#rail-zwave-receive-beam).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_set_default_rx_beam_config()](z-wave#sl-rail-zwave-set-default-rx-beam-config). 

###### RAIL_ZWAVE_GetRxBeamConfig (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_GetRxBeamConfig(RAIL_ZWAVE_BeamRxConfig_t *pConfig)`

**Description:** Get the current RX beam configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t) *|[out]|pConfig|A pointer to [RAIL_ZWAVE_BeamRxConfig_t](rail-zwave-beam-rx-config-t) to be populated with the current beam configuration.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_get_rx_beam_config()](z-wave#sl-rail-zwave-get-rx-beam-config). 

###### RAIL_ZWAVE_ConfigRxChannelHopping (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_ConfigRxChannelHopping(RAIL_Handle_t railHandle, RAIL_RxChannelHoppingConfig_t *config)`

**Description:** Configure the channel hop timings for use in Z-Wave RX channel hop configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t) *|[inout]|config|A pointer to a configuration for Z-Wave RX channel hopping. This structure must be allocated in application global read-write memory. RAIL will populate fields within or referenced by this structure during its operation. Be sure to allocate [RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t) entries[] for [RAIL_NUM_ZWAVE_CHANNELS](z-wave#rail-num-zwave-channels). Be sure to set [RAIL_RxChannelHoppingConfig_t::numberOfChannels](rail-rx-channel-hopping-config-t#number-of-channels) to the desired number of channels.|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- This function should not be used without direct instruction by Silicon Labs.

**Note**

- : This API must be called before [RAIL_EnableRxChannelHopping()](rx-channel-hopping#rail-enable-rx-channel-hopping). This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_rx_channel_hopping()](z-wave#sl-rail-zwave-config-rx-channel-hopping). 

###### RAIL_ZWAVE_GetRegion (heading level 7)

`RAIL_ZWAVE_RegionId_t RAIL_ZWAVE_GetRegion(RAIL_Handle_t railHandle)`

**Description:** Get the Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The [RAIL_ZWAVE_RegionId_t](z-wave#rail-zwave-region-id-t) value.

**Note**

- [RAIL_ZWAVE_ConfigRegion()](z-wave#rail-zwave-config-region) must have been called successfully before this function is called. Otherwise, [RAIL_ZWAVE_REGIONID_UNKNOWN](z-wave#rail-zwave-regionid-unknown) is returned.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_get_region()](z-wave#sl-rail-zwave-get-region). 

###### RAIL_ZWAVE_SetLrAckData (heading level 7)

`RAIL_Status_t RAIL_ZWAVE_SetLrAckData(RAIL_Handle_t railHandle, const RAIL_ZWAVE_LrAckData_t *pLrAckData)`

**Description:** Write the Auto-Ack FIFO for the next outgoing Z-Wave Long Range Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ZWAVE_LrAckData_t](rail-zwave-lr-ack-data-t) *|[in]|pLrAckData|An application provided pointer to a const [RAIL_ZWAVE_LrAckData_t](rail-zwave-lr-ack-data-t) to populate the noise floor, TX power and receive rssi bytes of the outgoing Z-Wave Long Range Ack packet.|

**Returns**

- Status code indicating success of the function call.

This function sets the Auto-Ack data to use in acknowledging the frame being received. It must only be called while processing the [RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND](events#rail-event-zwave-lr-ack-request-command). This will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is too late to write the outgoing Ack. When successful, the ackData will only be sent once. Subsequent packets needing an Z-Wave Long Range Ack will each need to call this function to write the Ack information.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_set_lr_ack_data()](z-wave#sl-rail-zwave-set-lr-ack-data). 

###### sl_rail_zwave_config_region (heading level 7)

`sl_rail_status_t sl_rail_zwave_config_region(sl_rail_handle_t rail_handle, const sl_rail_zwave_region_config_t *p_region_config)`

**Description:** Switch the Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_zwave_region_config_t](sl-rail-zwave-region-config-t) *|[in]|p_region_config|A pointer to a Z-Wave channel configuration for the selected region.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Setting a new Z-Wave Region will default any Low Power values to Normal Power values for the region. Z-Wave Region configuration must always be followed by a Low Power setup in case one desires to have the Low Power Acking functionality.

###### sl_rail_zwave_perform_ir_cal (heading level 7)

`sl_rail_status_t sl_rail_zwave_perform_ir_cal(sl_rail_handle_t rail_handle, sl_rail_zwave_ir_cal_val_t *p_ir_cal_vals, bool force_ir_cal)`

**Description:** Perform image rejection calibration on all valid channels of a Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_ir_cal_val_t](sl-rail-zwave-ir-cal-val-t) *|[inout]|p_ir_cal_vals|An application-provided pointer of type [sl_rail_zwave_ir_cal_val_t](sl-rail-zwave-ir-cal-val-t). This is populated with image rejection calibration values, if not NULL or initialized with [SL_RAIL_CAL_INVALID_VALUE](calibration#sl-rail-cal-invalid-value) or if force_ir_cal is true.|
|bool|[in]|force_ir_cal|If true, will always perform image rejection calibration and not use previously cached values.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function also calibrates for beam detection and should be called before [sl_rail_zwave_receive_beam()](z-wave#sl-rail-zwave-receive-beam) and after the Z-Wave region has been configured via [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region). Channel hopping must be disabled otherwise this function will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_zwave_init (heading level 7)

`sl_rail_status_t sl_rail_zwave_init(sl_rail_handle_t rail_handle, const sl_rail_zwave_config_t *p_config)`

**Description:** Initialize RAIL for Z-Wave features.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_zwave_config_t](sl-rail-zwave-config-t) *|[in]|p_config|A pointer to a Z-Wave configuration structure.|

**Returns**

- Status code indicating success of the function call.

This function is the entry point for working with Z-Wave within RAIL. It sets up relevant hardware acceleration for Z-Wave-specific features, such as Home Id filtering and beam packets (as specified in the configuration) and allows users to select the relevant Z-Wave region-specific PHY via [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region). 

###### sl_rail_zwave_deinit (heading level 7)

`sl_rail_status_t sl_rail_zwave_deinit(sl_rail_handle_t rail_handle)`

**Description:** De-initialize Z-Wave hardware acceleration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Disables and resets all Z-Wave hardware acceleration features. This function should only be called when the radio is idle. 

###### sl_rail_zwave_is_enabled (heading level 7)

`bool sl_rail_zwave_is_enabled(sl_rail_handle_t rail_handle)`

**Description:** Return whether Z-Wave hardware acceleration is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if Z-Wave hardware acceleration was enabled to start with and false otherwise.

###### sl_rail_zwave_config_options (heading level 7)

`sl_rail_status_t sl_rail_zwave_config_options(sl_rail_handle_t rail_handle, sl_rail_zwave_options_t mask, sl_rail_zwave_options_t options)`

**Description:** Configure Z-Wave options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_options_t](z-wave#sl-rail-zwave-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[sl_rail_zwave_options_t](z-wave#sl-rail-zwave-options-t)|[in]|options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [sl_rail_zwave_options_t](z-wave#sl-rail-zwave-options-t).|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_zwave_set_node_id (heading level 7)

`sl_rail_status_t sl_rail_zwave_set_node_id(sl_rail_handle_t rail_handle, sl_rail_zwave_node_id_t node_id)`

**Description:** Inform RAIL of the Z-Wave node's Node Id for receive filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_node_id_t](z-wave#sl-rail-zwave-node-id-t)|[in]|node_id|A Z-Wave Node Id.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Until this API is called, RAIL will assume the Node Id is [SL_RAIL_ZWAVE_NODE_ID_DEFAULT](z-wave#sl-rail-zwave-node-id-default).

###### sl_rail_zwave_set_home_id (heading level 7)

`sl_rail_status_t sl_rail_zwave_set_home_id(sl_rail_handle_t rail_handle, sl_rail_zwave_home_id_t home_id, sl_rail_zwave_home_id_hash_t home_id_hash)`

**Description:** Inform RAIL of the Z-Wave node's Home Id and its hash for receive filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_home_id_t](z-wave#sl-rail-zwave-home-id-t)|[in]|home_id|A Z-Wave Home Id.|
|[sl_rail_zwave_home_id_hash_t](z-wave#sl-rail-zwave-home-id-hash-t)|[in]|home_id_hash|The hash of the home_id expected in beam frames. If this is [SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#sl-rail-zwave-home-id-hash-dont-care), beam frame detection will not check the Home Id hash in a received beam frame at all, and [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam) will trigger based solely on the Node Id in the beam frame.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Until this API is called, RAIL will assume the Home Id is an illegal one of [SL_RAIL_ZWAVE_HOME_ID_DEFAULT](z-wave#sl-rail-zwave-home-id-default), and its hash is [SL_RAIL_ZWAVE_HOME_ID_HASH_DONT_CARE](z-wave#sl-rail-zwave-home-id-hash-dont-care).

###### sl_rail_zwave_get_rx_beam_details (heading level 7)

`sl_rail_status_t sl_rail_zwave_get_rx_beam_details(sl_rail_handle_t rail_handle, sl_rail_zwave_beam_details_t *p_beam_details)`

**Description:** Get detailed information about a Z-Wave beam frame that triggered [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_beam_details_t](sl-rail-zwave-beam-details-t) *|[out]|p_beam_details|An application provided pointer to [sl_rail_zwave_beam_details_t](sl-rail-zwave-beam-details-t) to populate the Node Id, Home Id hash, channel hopping index, RSSI, and TX Power (for long range beam only) of the received beam frame.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This is best called while handling the [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam) event; if multiple beams are received only the most recent beam's details are provided.
- [sl_rail_zwave_beam_details_t::channel_index](sl-rail-zwave-beam-details-t#channel-index) will be set to [SL_RAIL_CHANNEL_HOPPING_INVALID_INDEX](rx-channel-hopping#sl-rail-channel-hopping-invalid-index) if channel-hopping was off at the time the beam packet was received.
- [sl_rail_zwave_beam_details_t::lr_tx_power](sl-rail-zwave-beam-details-t#lr-tx-power) will be set to [SL_RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID](z-wave#sl-rail-zwave-lr-beam-tx-power-invalid) if this API is called after receiving a regular non Long Range beam.

###### sl_rail_zwave_set_tx_low_power_dbm (heading level 7)

`sl_rail_status_t sl_rail_zwave_set_tx_low_power_dbm(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm)`

**Description:** Set the Low Power settings in deci-dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t)|[in]|power_ddbm|Desired low power in deci-dBm.|

**Returns**

- Status code indicating success of the function call.

Low Power settings are required during Ack transmissions when the Low Power Bit is set. This setting is only valid for one subsequent transmission, after which all transmissions will be at the nominal power setting, until re-invoked. 

###### sl_rail_zwave_get_tx_low_power_dbm (heading level 7)

`sl_rail_tx_power_t sl_rail_zwave_get_tx_low_power_dbm(sl_rail_handle_t rail_handle)`

**Description:** Get the TX low power in terms of deci-dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A RAIL instance handle.|

**Returns**

- The chip-specific [sl_rail_tx_power_t](pa#sl-rail-tx-power-t) value of the low transmit power in deci-dBm.

###### sl_rail_zwave_receive_beam (heading level 7)

`sl_rail_status_t sl_rail_zwave_receive_beam(sl_rail_handle_t rail_handle, uint8_t *p_beam_detect_index, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Implement beam detection and reception algorithms.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t *|[out]|p_beam_detect_index|A pointer to an indicator of whether or not a beam was detected at all, regardless of if it was received, generally for use only by instruction from Silicon Labs. Can be NULL.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this operation appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions. Note that Z-Wave currently does not support multiprotocol, so this scheduler info exists to future proof the API for when it does.|

**Returns**

- Status code indicating success of the function call. Reasons for failure include an un-idled radio or a non-Japan non-Korea region configured before calling this function.

This function takes care of all configuration and radio setup to detect and receive beams in the current Z-Wave region. If a beam is detected, RAIL will provide the usual [SL_RAIL_EVENT_ZWAVE_BEAM](events#sl-rail-event-zwave-beam) event during which time users can process the beam as expected. However, normal packets may also be received during this time (also triggering [SL_RAIL_EVENTS_RX_COMPLETION](events#sl-rail-events-rx-completion) events), in which case, this API may need to be re-called to receive a beam. Users should also listen for [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#sl-rail-event-rx-channel-hopping-complete), which will indicate that no beam is heard. At that point, the radio will be automatically idled. Until one of these events is received, users should not try to reconfigure radio settings or start another radio operation. If an application needs to do some other operation or configuration, it must first call [sl_rail_idle()](state-transitions#sl-rail-idle-1) and wait for the radio to idle.

**Note**

- : The radio must be idle before calling this function.
- : [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) must have been called successfully in Z-Wave before this function is called to provide a valid memory buffer for internal use (see [sl_rail_rx_channel_hopping_config_t::p_buffer](sl-rail-rx-channel-hopping-config-t#p-buffer)).
- : This function alters radio functionality substantially. After calling it, the user should call [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region), [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping), [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping), and [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions) to reset these parameters to whatever behaviors were desired before calling this function. Additionally, this function will idle the radio upon on exit.

###### sl_rail_zwave_config_beam_rx (heading level 7)

`sl_rail_status_t sl_rail_zwave_config_beam_rx(sl_rail_handle_t rail_handle, const sl_rail_zwave_beam_rx_config_t *p_config)`

**Description:** Configure the receive algorithm used in [sl_rail_zwave_receive_beam()](z-wave#sl-rail-zwave-receive-beam).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t) *|[in]|p_config|A pointer to a configuration for the beam detection algorithm.|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- This function should not be used without direct instruction by Silicon Labs.

###### sl_rail_zwave_set_default_rx_beam_config (heading level 7)

`sl_rail_status_t sl_rail_zwave_set_default_rx_beam_config(sl_rail_handle_t rail_handle)`

**Description:** Set the default RX beam configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function resets any changes made to the beam configuration via [sl_rail_zwave_config_beam_rx()](z-wave#sl-rail-zwave-config-beam-rx) and the default beam configuration will be in effect on subsequent call(s) to [sl_rail_zwave_receive_beam()](z-wave#sl-rail-zwave-receive-beam).

###### sl_rail_zwave_get_rx_beam_config (heading level 7)

`sl_rail_status_t sl_rail_zwave_get_rx_beam_config(sl_rail_handle_t rail_handle, sl_rail_zwave_beam_rx_config_t *p_config)`

**Description:** Get the current RX beam configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t) *|[out]|p_config|A pointer to [sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t) to be populated with the current beam configuration.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_zwave_config_rx_channel_hopping (heading level 7)

`sl_rail_status_t sl_rail_zwave_config_rx_channel_hopping(sl_rail_handle_t rail_handle, sl_rail_rx_channel_hopping_config_t *p_config)`

**Description:** Configure the channel hop timings for use in Z-Wave RX channel hop configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t) *|[inout]|p_config|A pointer to a configuration for Z-Wave RX channel hopping. This structure must be allocated in application global read-write memory. RAIL will populate fields within or referenced by this structure during its operation. Be sure to allocate [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t) entries[] for [SL_RAIL_NUM_ZWAVE_CHANNELS](z-wave#sl-rail-num-zwave-channels). Be sure to set [sl_rail_rx_channel_hopping_config_t::number_of_channels](sl-rail-rx-channel-hopping-config-t#number-of-channels) to the desired number of channels.|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- This function should not be used without direct instruction by Silicon Labs.

**Note**

- : This API must be called before [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping). This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled.

###### sl_rail_zwave_get_region (heading level 7)

`sl_rail_zwave_region_id_t sl_rail_zwave_get_region(sl_rail_handle_t rail_handle)`

**Description:** Get the Z-Wave region.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The [sl_rail_zwave_region_id_t](z-wave#sl-rail-zwave-region-id-t) value.

**Note**

- [sl_rail_zwave_config_region()](z-wave#sl-rail-zwave-config-region) must have been called successfully before this function is called. Otherwise, [SL_RAIL_ZWAVE_REGION_ID_UNKNOWN](z-wave#sl-rail-zwave-region-id-unknown) is returned.

###### sl_rail_zwave_set_lr_ack_data (heading level 7)

`sl_rail_status_t sl_rail_zwave_set_lr_ack_data(sl_rail_handle_t rail_handle, const sl_rail_zwave_lr_ack_data_t *p_lr_ack_data)`

**Description:** Write the Auto-Ack FIFO for the next outgoing Z-Wave Long Range Ack.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_zwave_lr_ack_data_t](sl-rail-zwave-lr-ack-data-t) *|[in]|p_lr_ack_data|An application provided pointer to a const [sl_rail_zwave_lr_ack_data_t](sl-rail-zwave-lr-ack-data-t) to populate the noise floor, TX power and receive rssi bytes of the outgoing Z-Wave Long Range Ack packet.|

**Returns**

- Status code indicating success of the function call.

This function sets the Auto-Ack data to use in acknowledging the frame being received. It must only be called while processing the [SL_RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND](events#sl-rail-event-zwave-lr-ack-request-command). This will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if it is too late to write the outgoing Ack. When successful, the p_lr_ack_data will only be sent once. Subsequent packets needing an Z-Wave Long Range Ack will each need to call this function to write the Ack information. 

###### Macros

`#define RAIL_ZWAVE_OPTIONS_NONE 0U`

**Description**: A value representing no options.

`#define RAIL_ZWAVE_OPTIONS_DEFAULT RAIL_ZWAVE_OPTIONS_NONE`

**Description**: All options are disabled by default.

`#define RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE   (1u << RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT)`

**Description**: An option to configure promiscuous mode, accepting non-beam packets regardless of their Home Id.

`#define RAIL_ZWAVE_OPTION_NODE_ID_FILTERING   (1u << RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT)`

**Description**: An option to filter non-beam packets based on their Node Id when [RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#rail-zwave-option-promiscuous-mode) is disabled.

`#define RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES   (1u << RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT)`

**Description**: An option to configure beam frame recognition.

`#define RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE   (1u << RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT)`

**Description**: An option to receive all beams promiscuously when [RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#rail-zwave-option-detect-beam-frames) is enabled.

`#define RAIL_ZWAVE_OPTIONS_ALL 0xFFFFFFFFU`

**Description**: A value representing all options.

`#define RAIL_ZWAVE_FREQ_INVALID 0xFFFFFFFFUL`

**Description**: Sentinel value to indicate that a channel (and thus its frequency) are invalid.

`#define RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID (0xFFU)`

**Description**: Invalid beam TX power value returned when [RAIL_ZWAVE_GetLrBeamTxPower()](z-wave#rail-zwave-get-lr-beam-tx-power) is called after receiving a regular non-long-range beam.

`#define RAIL_NUM_ZWAVE_CHANNELS (4U)`

**Description**: Number of channels in each of Z-Wave's region-based PHYs.

`#define RAIL_ZWAVE_REGION_US_LR_END_DEVICE RAIL_ZWAVE_REGION_US_LR3`

**Description**: **Deprecated**Backwards-compatible define.

`#define RAIL_ZWAVE_REGION_EU_LR_END_DEVICE RAIL_ZWAVE_REGION_EU_LR3`

**Description**: **Deprecated**Backwards-compatible define.

`#define SL_RAIL_ZWAVE_OPTIONS_NONE 0U`

**Description**: A value representing no options.

`#define SL_RAIL_ZWAVE_OPTIONS_DEFAULT SL_RAIL_ZWAVE_OPTIONS_NONE`

**Description**: All options are disabled by default.

`#define SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE   (1u << SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE_SHIFT)`

**Description**: An option to configure promiscuous mode, accepting non-beam packets regardless of their Home Id.

`#define SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING   (1u << SL_RAIL_ZWAVE_OPTION_NODE_ID_FILTERING_SHIFT)`

**Description**: An option to filter non-beam packets based on their Node Id when [SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_MODE](z-wave#sl-rail-zwave-option-promiscuous-mode) is disabled.

`#define SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES   (1u << SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES_SHIFT)`

**Description**: An option to configure beam frame recognition.

`#define SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE   (1u << SL_RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE_SHIFT)`

**Description**: An option to receive all beams promiscuously when [SL_RAIL_ZWAVE_OPTION_DETECT_BEAM_FRAMES](z-wave#sl-rail-zwave-option-detect-beam-frames) is enabled.

`#define SL_RAIL_ZWAVE_OPTIONS_ALL 0xFFFFFFFFU`

**Description**: A value representing all options.

`#define SL_RAIL_ZWAVE_FREQ_INVALID 0xFFFFFFFFUL`

**Description**: Sentinel value to indicate that a channel (and thus its frequency) are invalid.

`#define SL_RAIL_ZWAVE_LR_BEAM_TX_POWER_INVALID (0xFFU)`

**Description**: Invalid beam TX power value returned when [sl_rail_zwave_get_rx_beam_details()](z-wave#sl-rail-zwave-get-rx-beam-details) is called after receiving a regular non-long-range beam.

`#define SL_RAIL_NUM_ZWAVE_CHANNELS (4U)`

**Description**: Number of channels in each of Z-Wave's region-based PHYs.

A configuration structure for Z-Wave in RAIL. 

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_t](sl-rail-zwave-config-t). 

###### Public Attributes (heading level 7)

###### options (heading level 8)

```
RAIL_ZWAVE_Options_t RAIL_ZWAVE_Config_t::options
```

**Description:** Defines Z-Wave options.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_t::options](sl-rail-zwave-config-t#options).

###### ackConfig (heading level 8)

```
RAIL_AutoAckConfig_t RAIL_ZWAVE_Config_t::ackConfig
```

**Description:** Defines Z-Wave Acking configuration.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_t::ack_config](sl-rail-zwave-config-t#ack-config).

###### timings (heading level 8)

```
RAIL_StateTiming_t RAIL_ZWAVE_Config_t::timings
```

**Description:** Defines state timings for Z-Wave.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_config_t::timings](sl-rail-zwave-config-t#timings).

Configuration structure for Z-Wave Long Range Ack. 

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t](sl-rail-zwave-lr-ack-data-t). 

###### Public Attributes (heading level 7)

###### noiseFloorDbm (heading level 8)

```
int8_t RAIL_ZWAVE_LrAckData_t::noiseFloorDbm
```

**Description:** Radio noise level measured on the channel the frame is transmitted on.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::noise_floor_dbm](sl-rail-zwave-lr-ack-data-t#noise-floor-dbm).

###### txPowerDbm (heading level 8)

```
int8_t RAIL_ZWAVE_LrAckData_t::txPowerDbm
```

**Description:** Transmit power used to transmit the ongoing Z-Wave Long Range Ack.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::transmit_power_dbm](sl-rail-zwave-lr-ack-data-t#transmit-power-dbm).

###### receiveRssiDbm (heading level 8)

```
int8_t RAIL_ZWAVE_LrAckData_t::receiveRssiDbm
```

**Description:** Signal strength measured while receiving the Z-Wave Long Range frame.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_lr_ack_data_t::receive_rssi_dbm](sl-rail-zwave-lr-ack-data-t#receive-rssi-dbm).

Configuration structure for Z-Wave beam detection. 

**Warnings**

- This structure should not be used without direct instruction by Silicon Labs. Appropriate defaults for this are built into the RAIL library.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t](sl-rail-zwave-beam-rx-config-t). 

###### Public Attributes (heading level 7)

###### channelHoppingConfig (heading level 8)

```
RAIL_RxChannelHoppingConfig_t RAIL_ZWAVE_BeamRxConfig_t::channelHoppingConfig
```

**Description:** Channel hopping pattern to use for beam detection.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::channel_hopping_config](sl-rail-zwave-beam-rx-config-t#channel-hopping-config).

###### receiveConfig_100 (heading level 8)

```
RAIL_RxDutyCycleConfig_t RAIL_ZWAVE_BeamRxConfig_t::receiveConfig_100
```

**Description:** Amount of time to spend trying to receive a beam once detected.

**Details:** 100 kbps only.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::receive_config_100_kbps](sl-rail-zwave-beam-rx-config-t#receive-config-100-kbps).

###### receiveConfig_40 (heading level 8)

```
RAIL_RxDutyCycleConfig_t RAIL_ZWAVE_BeamRxConfig_t::receiveConfig_40
```

**Description:** Amount of time to spend trying to receive a beam once detected.

**Details:** 40 kbps only.

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_beam_rx_config_t::receive_config_40_kbps](sl-rail-zwave-beam-rx-config-t#receive-config-40-kbps).

Each Z-Wave region supports 3 channels. 

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t](sl-rail-zwave-region-config-t). 

###### Public Attributes (heading level 7)

###### frequency (heading level 8)

```
uint32_t RAIL_ZWAVE_RegionConfig_t::frequency[(4U)]
```

**Description:** Channel frequency in hertz.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t::frequency_hz](sl-rail-zwave-region-config-t#frequency-hz).

###### maxPower (heading level 8)

```
RAIL_TxPower_t RAIL_ZWAVE_RegionConfig_t::maxPower[(4U)]
```

**Description:** The maximum power allowed on the channel, in dBm.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t::max_power_dbm](sl-rail-zwave-region-config-t#max-power-dbm).

###### baudRate (heading level 8)

```
RAIL_ZWAVE_Baud_t RAIL_ZWAVE_RegionConfig_t::baudRate[(4U)]
```

**Description:** Channel baud rate index.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t::baud_rate](sl-rail-zwave-region-config-t#baud-rate).

###### regionId (heading level 8)

```
RAIL_ZWAVE_RegionId_t RAIL_ZWAVE_RegionConfig_t::regionId
```

**Description:** Identification number for the region.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t::region_id](sl-rail-zwave-region-config-t#region-id).

###### regionSpecific (heading level 8)

```
RAIL_ZWAVE_RegionOptions_t RAIL_ZWAVE_RegionConfig_t::regionSpecific
```

**Description:** Encapsulates region-specific options.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_region_config_t::region_options](sl-rail-zwave-region-config-t#region-options).

Structure for Z-Wave Image Rejection Calibration. 

**Note**

- Index 0 will hold the low side image rejection calibration value (channel 0), while index 1 will hold the high side image rejection value (channel 1).

**Deprecated**RAIL 2.x synonym of [sl_rail_zwave_ir_cal_val_t](sl-rail-zwave-ir-cal-val-t). 

###### Public Attributes (heading level 7)

###### imageRejection (heading level 8)

```
RAIL_IrCalValues_t RAIL_ZWAVE_IrcalVal_t::imageRejection[2]
```

**Description:** Low side and high side image rejection values.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_zwave_ir_cal_val_t::image_rejection](sl-rail-zwave-ir-cal-val-t#image-rejection).

A configuration structure for Z-Wave in RAIL. 

###### Public Attributes (heading level 7)

###### options (heading level 8)

```
sl_rail_zwave_options_t sl_rail_zwave_config_t::options
```

**Description:** Defines Z-Wave options.

###### ack_config (heading level 8)

```
sl_rail_auto_ack_config_t sl_rail_zwave_config_t::ack_config
```

**Description:** Defines Z-Wave Acking configuration.

###### timings (heading level 8)

```
sl_rail_state_timing_t sl_rail_zwave_config_t::timings
```

**Description:** Defines state timings for Z-Wave.

Configuration structure for Z-Wave Long Range Ack. 

###### Public Attributes (heading level 7)

###### noise_floor_dbm (heading level 8)

```
int8_t sl_rail_zwave_lr_ack_data_t::noise_floor_dbm
```

**Description:** Radio noise level measured on the channel the frame is transmitted on.

###### transmit_power_dbm (heading level 8)

```
int8_t sl_rail_zwave_lr_ack_data_t::transmit_power_dbm
```

**Description:** Transmit power used to transmit the ongoing Z-Wave Long Range Ack.

###### receive_rssi_dbm (heading level 8)

```
int8_t sl_rail_zwave_lr_ack_data_t::receive_rssi_dbm
```

**Description:** Signal strength measured while receiving the Z-Wave Long Range frame.

Configuration structure for Z-Wave beam detection. 

**Warnings**

- This structure should not be used without direct instruction by Silicon Labs. Appropriate defaults for this are built into the RAIL library.

###### Public Attributes (heading level 7)

###### channel_hopping_config (heading level 8)

```
sl_rail_rx_channel_hopping_config_t sl_rail_zwave_beam_rx_config_t::channel_hopping_config
```

**Description:** Channel hopping pattern to use for beam detection.

###### receive_config_100_kbps (heading level 8)

```
sl_rail_rx_duty_cycle_config_t sl_rail_zwave_beam_rx_config_t::receive_config_100_kbps
```

**Description:** Amount of time to spend trying to receive a beam once detected.

**Details:** 100 kbps only.

###### receive_config_40_kbps (heading level 8)

```
sl_rail_rx_duty_cycle_config_t sl_rail_zwave_beam_rx_config_t::receive_config_40_kbps
```

**Description:** Amount of time to spend trying to receive a beam once detected.

**Details:** 40 kbps only.

Each Z-Wave region supports 3 channels. 

###### Public Attributes (heading level 7)

###### frequency_hz (heading level 8)

```
uint32_t sl_rail_zwave_region_config_t::frequency_hz[(4U)]
```

**Description:** Channel frequency in hertz.

###### max_power_dbm (heading level 8)

```
sl_rail_tx_power_t sl_rail_zwave_region_config_t::max_power_dbm[(4U)]
```

**Description:** The maximum power allowed on the channel, in dBm.

###### baud_rate (heading level 8)

```
sl_rail_zwave_baud_t sl_rail_zwave_region_config_t::baud_rate[(4U)]
```

**Description:** Channel baud rate index.

###### region_id (heading level 8)

```
sl_rail_zwave_region_id_t sl_rail_zwave_region_config_t::region_id
```

**Description:** Identification number for the region.

###### region_options (heading level 8)

```
sl_rail_zwave_region_options_t sl_rail_zwave_region_config_t::region_options
```

**Description:** Encapsulates region-specific options.

Structure to get Z-Wave received beam related details. 

###### Public Attributes (heading level 7)

###### channel_index (heading level 8)

```
uint8_t sl_rail_zwave_beam_details_t::channel_index
```

**Description:** Channel hopping index of the last received beam frame.

###### node_id (heading level 8)

```
sl_rail_zwave_node_id_t sl_rail_zwave_beam_details_t::node_id
```

**Description:** Node Id of the last received beam frame.

###### home_id_hash (heading level 8)

```
sl_rail_zwave_home_id_hash_t sl_rail_zwave_beam_details_t::home_id_hash
```

**Description:** Home Id hash of the last received beam frame.

###### rssi_dbm (heading level 8)

```
int8_t sl_rail_zwave_beam_details_t::rssi_dbm
```

**Description:** RSSI in dBm of the last received beam frame.

###### lr_tx_power (heading level 8)

```
uint8_t sl_rail_zwave_beam_details_t::lr_tx_power
```

**Description:** TX power value from within the last received Long Range beam.

**Details:** The following table shows how to translate the Long Range Tx power value to dBm:

|Tx Power Value|Description|
|---|---|
|0|-6 dBm|
|1|-2 dBm|
|2|+2 dBm|
|3|+6 dBm|
|4|+10 dBm|
|5|+13 dBm|
|6|+16 dBm|
|7|+19 dBm|
|8|+21 dBm|
|9|+23 dBm|
|10|+25 dBm|
|11|+26 dBm|
|12|+27 dBm|
|13|+28 dBm|
|14|+29 dBm|
|15|+30 dBm|

Structure for Z-Wave Image Rejection Calibration. 

**Note**

- Index 0 will hold the low side image rejection calibration value (channel 0), while index 1 will hold the high side image rejection value (channel 1).

###### Public Attributes (heading level 7)

###### image_rejection (heading level 8)

```
sl_rail_ir_cal_values_t sl_rail_zwave_ir_cal_val_t::image_rejection[2]
```

**Description:** Low side and high side image rejection values.

#### RF Sense

##### Modules

[RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t)

[sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t)

##### Enumerations

###### RAIL_RfSenseBand_t

```
enum RAIL_RfSenseBand_t {
    RAIL_RFSENSE_OFF
    RAIL_RFSENSE_2_4GHZ
    RAIL_RFSENSE_SUBGHZ
    RAIL_RFSENSE_ANY
    RAIL_RFSENSE_MAX
    RAIL_RFSENSE_2_4GHZ_LOW_SENSITIVITY =  (0x20U)  + RAIL_RFSENSE_2_4GHZ
    RAIL_RFSENSE_SUBGHZ_LOW_SENSITIVITY =  (0x20U)  + RAIL_RFSENSE_SUBGHZ
    RAIL_RFSENSE_ANY_LOW_SENSITIVITY =  (0x20U)  + RAIL_RFSENSE_ANY
}
```

**Description:**

An enumeration for specifying the RF Sense frequency band.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RFSENSE_OFF|RF Sense is disabled.|
|RAIL_RFSENSE_2_4GHZ|RF Sense is in 2.4 GHz band.|
|RAIL_RFSENSE_SUBGHZ|RF Sense is in Sub-GHz band.|
|RAIL_RFSENSE_ANY|RF Sense is in both bands.|
|RAIL_RFSENSE_MAX|A count of the basic choices in this enumeration.|
|RAIL_RFSENSE_2_4GHZ_LOW_SENSITIVITY|RF Sense is in low sensitivity 2.4 GHz band.|
|RAIL_RFSENSE_SUBGHZ_LOW_SENSITIVITY|RF Sense is in low sensitivity Sub-GHz band.|
|RAIL_RFSENSE_ANY_LOW_SENSITIVITY|RF Sense is in low sensitivity for both bands.|

###### sl_rail_rf_sense_band_t

```
enum sl_rail_rf_sense_band_t {
    SL_RAIL_RF_SENSE_OFF = 0u
    SL_RAIL_RF_SENSE_2P4_GHZ = 1u
    SL_RAIL_RF_SENSE_SUB_GHZ = 2u
    SL_RAIL_RF_SENSE_ANY = 3u
    SL_RAIL_RF_SENSE_MAX
    SL_RAIL_RF_SENSE_2P4_GHZ_LOW_SENSITIVITY =  (0x20U)  + SL_RAIL_RF_SENSE_2P4_GHZ
    SL_RAIL_RF_SENSE_SUB_GHZ_LOW_SENSITIVITY =  (0x20U)  + SL_RAIL_RF_SENSE_SUB_GHZ
    SL_RAIL_RF_SENSE_ANY_LOW_SENSITIVITY =  (0x20U)  + SL_RAIL_RF_SENSE_ANY
}
```

**Description:**

An enumeration for specifying the RF Sense frequency band.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RF_SENSE_OFF|RF Sense is disabled.|
|SL_RAIL_RF_SENSE_2P4_GHZ|RF Sense is in 2.4 GHz band.|
|SL_RAIL_RF_SENSE_SUB_GHZ|RF Sense is in Sub-GHz band.|
|SL_RAIL_RF_SENSE_ANY|RF Sense is in both bands.|
|SL_RAIL_RF_SENSE_MAX|A count of the basic choices in this enumeration.|
|SL_RAIL_RF_SENSE_2P4_GHZ_LOW_SENSITIVITY|RF Sense is in low sensitivity 2.4 GHz band.|
|SL_RAIL_RF_SENSE_SUB_GHZ_LOW_SENSITIVITY|RF Sense is in low sensitivity Sub-GHz band.|
|SL_RAIL_RF_SENSE_ANY_LOW_SENSITIVITY|RF Sense is in low sensitivity for both bands.|

##### Typedefs

###### RAIL_RfSense_CallbackPtr_t

`typedef void(* RAIL_RfSense_CallbackPtr_t) (void)`

**Description:**

A pointer to an RF Sense callback function.

**Details:**

Consider using the event [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed) as an alternative.

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_callback_t()](rf-sense#sl-rail-rf-sense-callback-t).

###### sl_rail_rf_sense_callback_t

`typedef void(* sl_rail_rf_sense_callback_t) (void)`

**Description:**

A pointer to an RF Sense callback function.

**Details:**

Consider using the event [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed) as an alternative.

##### Variables

###### sl_rail_rf_sense_high_sensitivity_value

```
uint8_t sl_rail_rf_sense_high_sensitivity_value
```

**Description:** The RF Sense high-sensitivity threshold value used by the next [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) or [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense) call, when not specifying a low-sensitivity [sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t).

**Details:** The units are platform-dependent and range from 0 (highest sensitivity) to 255 (lowest sensitivity). This should be less than [sl_rail_rf_sense_low_sensitivity_value](rf-sense#sl-rail-rf-sense-low-sensitivity-value). RAIL initializes this to a default setting.

###### sl_rail_rf_sense_low_sensitivity_value

```
uint8_t sl_rail_rf_sense_low_sensitivity_value
```

**Description:** The RF Sense low-sensitivity threshold value used by the next [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) or [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense) call, when specifying a low-sensitivity [sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t).

**Details:** The units are platform-dependent and range from 0 (highest sensitivity) to 255 (lowest sensitivity). This should be greater than [sl_rail_rf_sense_high_sensitivity_value](rf-sense#sl-rail-rf-sense-high-sensitivity-value). RAIL initializes this to a default setting.

##### Functions

###### RAIL_StartRfSense

`RAIL_Time_t RAIL_StartRfSense(RAIL_Handle_t railHandle, RAIL_RfSenseBand_t band, RAIL_Time_t senseTime, RAIL_RfSense_CallbackPtr_t cb)`

**Description:** Start/stop the RF Sense functionality in Energy Detection Mode for use during low-energy sleep modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RfSenseBand_t](rf-sense#rail-rf-sense-band-t)|[in]|band|The frequency band(s) on which to sense the RF energy. To stop RF Sense, specify [RAIL_RFSENSE_OFF](rf-sense#rail-rfsense-off).|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|senseTime|The time (in microseconds) the RF energy must be continually detected to be considered "sensed".|
|[RAIL_RfSense_CallbackPtr_t](rf-sense#rail-rf-sense-callback-ptr-t)|[in]|cb|[RAIL_RfSense_CallbackPtr_t()](rf-sense#rail-rf-sense-callback-ptr-t) is called when the RF is sensed. Set NULL if using [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed) or polling via [RAIL_IsRfSensed()](rf-sense#rail-is-rf-sensed).|

**Returns**

- The actual senseTime used, which may be different than requested due to limitations of the hardware. If 0, RF sense was disabled or could not be enabled (no callback or event will be issued).

Some EFR32 radios have the ability to sense the presence of RF energy above -20 dBm within either or both the 2.4 GHz and Sub-GHz bands and trigger an event if that energy is continuously present for certain durations of time. An application can check when RF energy is sensed either by enabling the event [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed), by polling on the [RAIL_IsRfSensed()](rf-sense#rail-is-rf-sensed) API, or by using the cb callback.

**Note**

- After RF energy has been sensed, the RF Sense is automatically disabled and [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) must be called again to reactivate it. If RF energy has not been sensed and to manually disable RF Sense, [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) must be called with band specified as [RAIL_RFSENSE_OFF](rf-sense#rail-rfsense-off) or with senseTime set to 0 microseconds.
- Packet reception is not guaranteed to work correctly once RF Sense is enabled, both in single protocol and multiprotocol RAIL. To be safe, an application should turn this on only after idling the radio to stop receive and turn it off before attempting to restart receive. Since EM4 sleep causes the chip to come up through the reset vector any wake from EM4 must also shut off RF Sense to ensure proper receive functionality.

**Warnings**

- For some radios, RF Sense functionality is only guaranteed within a specified temperature range. See chip-specific documentation for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense). 

###### RAIL_StartSelectiveOokRfSense

`RAIL_Status_t RAIL_StartSelectiveOokRfSense(RAIL_Handle_t railHandle, RAIL_RfSenseSelectiveOokConfig_t *config)`

**Description:** Start/stop the RF Sense functionality in Selective(OOK Based) Mode for use during low-energy sleep modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t) *|[in]|config|A pointer to a [RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t) which holds the RF Sense configuration for Selective(OOK) mode.|

**Returns**

- Status code indicating success of the function call.

Some radios support Selective RF energy detection (OOK mode) where the user can program the radio to look for a particular sync word pattern (1-4 bytes) sent using OOK and wake only when that is detected. See chip-specific documentation for more details.

The following code gives an example of how to use RF Sense functionality in Selective(OOK Based) Mode. 

```c
// Sync word length in bytes, 1-4 bytes.
#define NUM_SYNC_WORD_BYTES (2U)
// Sync word value.
#define SYNC_WORD           (0xB16FU)
// Desired RF band
RAIL_RfSenseBand_t rfBand = RAIL_RFSENSE_2_4GHZ;

// Configure the transmitting node for sending the wakeup packet.
RAIL_Idle(railHandle, RAIL_IDLE_ABORT, true);
RAIL_ConfigRfSenseSelectiveOokWakeupPhy(railHandle);
RAIL_SetRfSenseSelectiveOokWakeupPayload(railHandle, NUM_SYNC_WORD_BYTES, SYNC_WORD);
RAIL_StartTx(railHandle, channel, RAIL_TX_OPTIONS_DEFAULT, NULL);

// Configure the receiving node (EFR32xG22) for RF Sense.
RAIL_RfSenseSelectiveOokConfig_t config = {
 .band = rfBand,
 .syncWordNumBytes = NUM_SYNC_WORD_BYTES,
 .syncWord = SYNC_WORD,
 .cb = NULL // Use RAIL_EVENT_RF_SENSED event or poll RAIL_IsRfSensed()
};
RAIL_StartSelectiveOokRfSense(railHandle, &config);

```

**Note**

- After RF energy has been sensed, the RF Sense is automatically disabled and [RAIL_StartSelectiveOokRfSense()](rf-sense#rail-start-selective-ook-rf-sense) must be called again to reactivate. If RF energy has not been sensed and to manually disable RF Sense, [RAIL_StartSelectiveOokRfSense()](rf-sense#rail-start-selective-ook-rf-sense) must be called with band specified as [RAIL_RFSENSE_OFF](rf-sense#rail-rfsense-off) or with [RAIL_RfSenseSelectiveOokConfig_t](rail-rf-sense-selective-ook-config-t) as NULL.
- Packet reception is not guaranteed to work correctly once RF Sense is enabled, both in single protocol and multiprotocol RAIL. To be safe, an application should turn this on only after idling the radio to stop receive and turn it off before attempting to restart receive. Since EM4 sleep causes the chip to come up through the reset vector any wake from EM4 must also shut off RF Sense to ensure proper receive functionality.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense). 

###### RAIL_ConfigRfSenseSelectiveOokWakeupPhy

`RAIL_Status_t RAIL_ConfigRfSenseSelectiveOokWakeupPhy(RAIL_Handle_t railHandle)`

**Description:** Switch to RF Sense Selective(OOK) PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|

**Returns**

- Status code indicating success of the function call.

This function switches to the RF Sense Selective(OOK) PHY for transmitting a packet to wake up a chip that supports Selective RF energy detection (OOK mode). You may only call this function while the radio is idle. While the radio is configured for this PHY, receive functionality should not be used.

**Note**

- The user must also set up the transmit FIFO, via [RAIL_SetRfSenseSelectiveOokWakeupPayload](rf-sense#rail-set-rf-sense-selective-ook-wakeup-payload), post this function call to include the first byte as the Preamble byte, followed by the Sync word (1-4 bytes). See chip-specific documentation for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_rf_sense_selective_ook_wakeup_phy()](rf-sense#sl-rail-config-rf-sense-selective-ook-wakeup-phy). 

###### RAIL_SetRfSenseSelectiveOokWakeupPayload

`RAIL_Status_t RAIL_SetRfSenseSelectiveOokWakeupPayload(RAIL_Handle_t railHandle, uint8_t numSyncwordBytes, uint32_t syncword)`

**Description:** Set the transmit payload for waking up a node configured for RF Sense Selective(OOK).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A handle for RAIL instance.|
|uint8_t|[in]|numSyncwordBytes|Sync word length in bytes, 1-4 bytes.|
|uint32_t|[in]|syncword|Sync word value.|

**Returns**

- Status code indicating success of the function call.

**Note**

- You must call this function after the chip has been set up with the RF Sense Selective(OOK) PHY, using [RAIL_ConfigRfSenseSelectiveOokWakeupPhy](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy).

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rf_sense_selective_ook_wakeup_payload()](rf-sense#sl-rail-set-rf-sense-selective-ook-wakeup-payload). 

###### RAIL_IsRfSensed

`bool RAIL_IsRfSensed(RAIL_Handle_t railHandle)`

**Description:** Check whether the RF was sensed.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if RF was sensed since the last call to [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense). false otherwise.

This function is useful if [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) is called with a NULL callback. It is generally used after EM4 reboot but can be used any time.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_rf_sensed()](rf-sense#sl-rail-is-rf-sensed). 

###### sl_rail_start_rf_sense

`sl_rail_time_t sl_rail_start_rf_sense(sl_rail_handle_t rail_handle, sl_rail_rf_sense_band_t band, sl_rail_time_t sense_time_us, sl_rail_rf_sense_callback_t cb)`

**Description:** Start/stop the RF Sense functionality in Energy Detection Mode for use during low-energy sleep modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_rf_sense_band_t](rf-sense#sl-rail-rf-sense-band-t)|[in]|band|The frequency band(s) on which to sense the RF energy. To stop RF Sense, specify [SL_RAIL_RF_SENSE_OFF](rf-sense#sl-rail-rf-sense-off).|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|sense_time_us|The time (in microseconds) the RF energy must be continually detected to be considered "sensed".|
|[sl_rail_rf_sense_callback_t](rf-sense#sl-rail-rf-sense-callback-t)|[in]|cb|[sl_rail_rf_sense_callback_t()](rf-sense#sl-rail-rf-sense-callback-t) is called when the RF is sensed. Set NULL if using [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed) or polling via [sl_rail_is_rf_sensed()](rf-sense#sl-rail-is-rf-sensed).|

**Returns**

- The actual sense_time_us used, which may be different than requested due to limitations of the hardware. If 0, RF sense was disabled or could not be enabled (no callback or event will be issued).

Some EFR32 radios have the ability to sense the presence of RF energy above -20 dBm within either or both the 2.4 GHz and Sub-GHz bands and trigger an event if that energy is continuously present for certain durations of time. An application can check when RF energy is sensed either by enabling the event [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed), by polling on the [sl_rail_is_rf_sensed()](rf-sense#sl-rail-is-rf-sensed) API, or by using the cb callback.

**Note**

- After RF energy has been sensed, the RF Sense is automatically disabled and [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) must be called again to reactivate it. If RF energy has not been sensed and to manually disable RF Sense, [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) must be called with band specified as [SL_RAIL_RF_SENSE_OFF](rf-sense#sl-rail-rf-sense-off) or with sense_time_us set to 0 microseconds.
- Packet reception is not guaranteed to work correctly once RF Sense is enabled, both in single protocol and multiprotocol RAIL. To be safe, an application should turn this on only after idling the radio to stop receive and turn it off before attempting to restart receive. Since EM4 sleep causes the chip to come up through the reset vector any wake from EM4 must also shut off RF Sense to ensure proper receive functionality.

**Warnings**

- For some radios, RF Sense functionality is only guaranteed within a specified temperature range. See chip-specific documentation for more details.

###### sl_rail_start_selective_ook_rf_sense

`sl_rail_status_t sl_rail_start_selective_ook_rf_sense(sl_rail_handle_t rail_handle, sl_rail_rf_sense_selective_ook_config_t *p_config)`

**Description:** Start/stop the RF Sense functionality in Selective(OOK Based) Mode for use during low-energy sleep modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t) *|[in]|p_config|A pointer to a [sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t) which holds the RF Sense configuration for Selective(OOK) mode.|

**Returns**

- Status code indicating success of the function call.

Some radios support Selective RF energy detection (OOK mode) where the user can program the radio to look for a particular sync word pattern (1-4 bytes) sent using OOK and wake only when that is detected. See chip-specific documentation for more details.

The following code gives an example of how to use RF Sense functionality in Selective(OOK Based) Mode. 

```c
// Sync word length in bytes, 1-4 bytes.
#define NUM_SYNC_WORD_BYTES (2U)
// Sync word value.
#define SYNC_WORD           (0xB16FU)
// Desired RF band
sl_rail_rf_sense_band_t rf_band = SL_RAIL_RF_SENSE_2P4_GHZ;

// Configure the transmitting node for sending the wakeup packet.
sl_rail_idle(rail_handle, SL_RAIL_IDLE_ABORT, true);
sl_rail_config_rf_sense_selective_ook_wakeup_phy(rail_handle);
sl_rail_set_rf_sense_selective_ook_wakeup_payload(rail_handle, NUM_SYNC_WORD_BYTES, SYNC_WORD);
sl_rail_start_tx(rail_handle, channel, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);

// Configure the receiving node (EFR32xG22) for RF Sense.
sl_rail_rf_sense_selective_ook_config_t config = {
 .band = rf_band,
 .sync_word_bytes = NUM_SYNC_WORD_BYTES,
 .sync_word = SYNC_WORD,
 .cb = NULL // Use SL_RAIL_EVENT_RF_SENSED event or poll sl_rail_is_rf_sensed()
};
sl_rail_start_selective_ook_rf_sense(rail_handle, &config);

```

**Note**

- After RF energy has been sensed, the RF Sense is automatically disabled and [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense) must be called again to reactivate. If RF energy has not been sensed and to manually disable RF Sense, [sl_rail_start_selective_ook_rf_sense()](rf-sense#sl-rail-start-selective-ook-rf-sense) must be called with band specified as [SL_RAIL_RF_SENSE_OFF](rf-sense#sl-rail-rf-sense-off) or with [sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t) as NULL.
- Packet reception is not guaranteed to work correctly once RF Sense is enabled, both in single protocol and multiprotocol RAIL. To be safe, an application should turn this on only after idling the radio to stop receive and turn it off before attempting to restart receive. Since EM4 sleep causes the chip to come up through the reset vector any wake from EM4 must also shut off RF Sense to ensure proper receive functionality.

###### sl_rail_config_rf_sense_selective_ook_wakeup_phy

`sl_rail_status_t sl_rail_config_rf_sense_selective_ook_wakeup_phy(sl_rail_handle_t rail_handle)`

**Description:** Switch to RF Sense Selective(OOK) PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function switches to the RF Sense Selective(OOK) PHY for transmitting a packet to wake up a chip that supports Selective RF energy detection (OOK mode). You may only call this function while the radio is idle. While the radio is configured for this PHY, receive functionality should not be used.

**Note**

- The user must also set up the transmit FIFO, via [sl_rail_set_rf_sense_selective_ook_wakeup_payload](rf-sense#sl-rail-set-rf-sense-selective-ook-wakeup-payload), post this function call to include the first byte as the Preamble byte, followed by the Sync word (1-4 bytes). See chip-specific documentation for more details.

###### sl_rail_set_rf_sense_selective_ook_wakeup_payload

`sl_rail_status_t sl_rail_set_rf_sense_selective_ook_wakeup_payload(sl_rail_handle_t rail_handle, uint8_t sync_word_bytes, uint32_t sync_word)`

**Description:** Set the transmit payload for waking up a node configured for RF Sense Selective(OOK).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|sync_word_bytes|Sync word length in bytes, 1-4 bytes.|
|uint32_t|[in]|sync_word|Sync word value.|

**Returns**

- Status code indicating success of the function call.

**Note**

- You must call this function after the chip has been set up with the RF Sense Selective(OOK) PHY, using [sl_rail_config_rf_sense_selective_ook_wakeup_phy](rf-sense#sl-rail-config-rf-sense-selective-ook-wakeup-phy).

###### sl_rail_is_rf_sensed

`bool sl_rail_is_rf_sensed(sl_rail_handle_t rail_handle)`

**Description:** Check whether the RF was sensed.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- true if RF was sensed since the last call to [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense). false otherwise.

This function is useful if [sl_rail_start_rf_sense()](rf-sense#sl-rail-start-rf-sense) is called with a NULL callback. It is generally used after EM4 reboot but can be used any time. 

##### Macros

`#define RAIL_RFSENSE_LOW_SENSITIVITY_OFFSET (0x20U)`

**Description**: RF Sense low sensitivity offset.

`#define RAIL_RFSENSE_USE_HW_SYNCWORD (0U)`

**Description**: Use the MODEM default sync word.

`#define SL_RAIL_RF_SENSE_LOW_SENSITIVITY_OFFSET (0x20U)`

**Description**: RF Sense low sensitivity offset.

`#define SL_RAIL_RF_SENSE_USE_HW_SYNC_WORD (0U)`

**Description**: Use the MODEM default sync word.

Structure to configure RFSENSE Selective(OOK) mode. 

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t](sl-rail-rf-sense-selective-ook-config-t). 

###### Public Attributes

###### band (heading level 7)

```
RAIL_RfSenseBand_t RAIL_RfSenseSelectiveOokConfig_t::band
```

**Description:** The frequency band(s) on which to sense the RF energy.

**Details:** To stop RF Sense, specify [RAIL_RFSENSE_OFF](rf-sense#rail-rfsense-off).

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::band](sl-rail-rf-sense-selective-ook-config-t#band).

###### syncWordNumBytes (heading level 7)

```
uint8_t RAIL_RfSenseSelectiveOokConfig_t::syncWordNumBytes
```

**Description:** Sync word length in bytes, 1-4 bytes.

**Details:** **Note**

- When [syncWord](rail-rf-sense-selective-ook-config-t#sync-word) is set to use [RAIL_RFSENSE_USE_HW_SYNCWORD](rf-sense#rail-rfsense-use-hw-syncword), the [syncWordNumBytes](rail-rf-sense-selective-ook-config-t#sync-word-num-bytes) value will be ignored since we rely on the HW default settings for sync word.

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::sync_word_bytes](sl-rail-rf-sense-selective-ook-config-t#sync-word-bytes).

###### syncWord (heading level 7)

```
uint32_t RAIL_RfSenseSelectiveOokConfig_t::syncWord
```

**Description:** Sync Word Value.

**Details:** To use HW default sync word, set to [RAIL_RFSENSE_USE_HW_SYNCWORD](rf-sense#rail-rfsense-use-hw-syncword).

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::sync_word](sl-rail-rf-sense-selective-ook-config-t#sync-word).

###### cb (heading level 7)

```
RAIL_RfSense_CallbackPtr_t RAIL_RfSenseSelectiveOokConfig_t::cb
```

**Description:** The callback function, called when RF is sensed.

**Details:** **Note**

- Set to NULL and instead use [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed) or poll via [RAIL_IsRfSensed()](rf-sense#rail-is-rf-sensed).

**Deprecated**RAIL 2.x synonym of [sl_rail_rf_sense_selective_ook_config_t::cb](sl-rail-rf-sense-selective-ook-config-t#cb).

Structure to configure RF Sense Selective(OOK) mode. 

###### Public Attributes

###### band (heading level 7)

```
sl_rail_rf_sense_band_t sl_rail_rf_sense_selective_ook_config_t::band
```

**Description:** The frequency band(s) on which to sense the RF energy.

**Details:** To stop RF Sense, specify [SL_RAIL_RF_SENSE_OFF](rf-sense#sl-rail-rf-sense-off).

###### sync_word_bytes (heading level 7)

```
uint8_t sl_rail_rf_sense_selective_ook_config_t::sync_word_bytes
```

**Description:** Sync word length in bytes, 1-4 bytes.

**Details:** **Note**

- When [sync_word](sl-rail-rf-sense-selective-ook-config-t#sync-word) is set to use [SL_RAIL_RF_SENSE_USE_HW_SYNC_WORD](rf-sense#sl-rail-rf-sense-use-hw-sync-word), the [sync_word_bytes](sl-rail-rf-sense-selective-ook-config-t#sync-word-bytes) value will be ignored since we rely on the HW default settings for sync word.

###### sync_word (heading level 7)

```
uint32_t sl_rail_rf_sense_selective_ook_config_t::sync_word
```

**Description:** Sync Word Value.

**Details:** To use HW default sync word, set to [SL_RAIL_RF_SENSE_USE_HW_SYNC_WORD](rf-sense#sl-rail-rf-sense-use-hw-sync-word).

###### cb (heading level 7)

```
sl_rail_rf_sense_callback_t sl_rail_rf_sense_selective_ook_config_t::cb
```

**Description:** The callback function, called when RF is sensed.

**Details:** **Note**

- Set to NULL and instead use [SL_RAIL_EVENT_RF_SENSED](events#sl-rail-event-rf-sensed) or poll via [sl_rail_is_rf_sensed()](rf-sense#sl-rail-is-rf-sensed).

#### RX Channel Hopping

Hardware accelerated hopping between channels while waiting for a packet in receive. 

Channel hopping provides a hardware accelerated method for scanning across multiple channels quickly, as part of a receive protocol. While it is possible to call [RAIL_StartRx()](receive#rail-start-rx) on different channels, back to back, and listen on many channels sequentially in that way, the time it takes to switch channels with that method may be too long for some protocols. This API pre-computes necessary channel change operations for a given list of channels, so that the radio can move from channel to channel much faster. Additionally, it leads to more succinct code as channel changes will be done implicitly, without requiring numerous calls to [RAIL_StartRx()](receive#rail-start-rx). Currently, while this feature is enabled, the radio will hop channels in the given sequence each time it enters RX. Note that RX Channel hopping and EFR32xG25's concurrent mode / collision detection are mutually exclusive.

The channel hopping buffer requires [RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL](rx-channel-hopping-sixx3-xx#rail-channel-hopping-buffer-size-per-channel) number of 32-bit words of overhead per channel, plus 3 words overall plus the twice the size of the [RAIL_ChannelConfig_t::phyConfigDeltaSubtract](rail-channel-config-t#phy-config-delta-subtract) of the whole radio configuration, plus the twice the sum of the sizes of all the [RAIL_ChannelConfigEntry_t::phyConfigDeltaAdd](rail-channel-config-entry-t#phy-config-delta-add) in all the channel hopping channels.

The following code gives an example of how to use the RX Channel Hopping API. 

```c
#define CHANNEL_HOPPING_NUMBER_OF_CHANNELS 4
#define CHANNEL_HOPPING_BUFFER_SIZE do {        \
  3 +                                           \
  (RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL \
   * CHANNEL_HOPPING_NUMBER_OF_CHANNELS) +      \
  2 * (SIZEOF_UINT32_DELTA_SUBTRACT +           \
  SIZEOF_UINT32_DELTA_ADD_0 +                   \
  SIZEOF_UINT32_DELTA_ADD_1 +                   \
  SIZEOF_UINT32_DELTA_ADD_2 +                   \
  SIZEOF_UINT32_DELTA_ADD_3)                    \
} while (0)

RAIL_RxChannelHoppingConfigEntry_t channelHoppingEntries[CHANNEL_HOPPING_NUMBER_OF_CHANNELS];
uint32_t channelHoppingBuffer[CHANNEL_HOPPING_BUFFER_SIZE];

RAIL_RxChannelHoppingConfig_t channelHoppingConfig = {
  .buffer = channelHoppingBuffer,
  .bufferLength = CHANNEL_HOPPING_BUFFER_SIZE,
  .numberOfChannels = CHANNEL_HOPPING_NUMBER_OF_CHANNELS,
  .entries = channelHoppingEntries
};

channelHoppingEntries[0].channel = 1;
channelHoppingEntries[1].channel = 2;
channelHoppingEntries[2].channel = 3;

RAIL_ConfigRxChannelHopping(railHandle, &channelHoppingConfig);
RAIL_EnableRxChannelHopping(railHandle, true, true)

```

Channel hopping provides a hardware accelerated method for scanning across multiple channels quickly, as part of a receive protocol. While it is possible to call [sl_rail_start_rx()](receive#sl-rail-start-rx) on different channels, back to back, and listen on many channels sequentially in that way, the time it takes to switch channels with that method may be too long for some protocols. This API pre-computes necessary channel change operations for a given list of channels, so that the radio can move from channel to channel much faster. Additionally, it leads to more succinct code as channel changes will be done implicitly, without requiring numerous calls to [sl_rail_start_rx()](receive#sl-rail-start-rx). Currently, while this feature is enabled, the radio will hop channels in the given sequence each time it enters RX. Note that RX Channel hopping and EFR32xG25's concurrent mode / collision detection are mutually exclusive.

The channel hopping buffer requires [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL](rx-channel-hopping-sixx3-xx#sl-rail-channel-hopping-buffer-words-per-channel) number of 32-bit words of overhead per channel, plus 3 words overall plus the twice the size of the [sl_rail_channel_config_t::phy_config_delta_subtract](sl-rail-channel-config-t#phy-config-delta-subtract) of the whole radio configuration, plus the twice the sum of the sizes of all the [sl_rail_channel_config_entry_t::phy_config_delta_add](sl-rail-channel-config-entry-t#phy-config-delta-add) inall the channel hopping channels.

The following code gives an example of how to use the RX Channel Hopping API. 

```c
#define CHANNEL_HOPPING_NUMBER_OF_CHANNELS 4
#define CHANNEL_HOPPING_BUFFER_WORDS do {           \
  3 +                                               \
  (SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL \
   * CHANNEL_HOPPING_NUMBER_OF_CHANNELS) +          \
  2 * (SIZEOF_UINT32_DELTA_SUBTRACT +               \
  SIZEOF_UINT32_DELTA_ADD_0 +                       \
  SIZEOF_UINT32_DELTA_ADD_1 +                       \
  SIZEOF_UINT32_DELTA_ADD_2 +                       \
  SIZEOF_UINT32_DELTA_ADD_3)                        \
} while (0)

sl_rail_rx_channel_hopping_config_entry_t channel_hopping_entries[CHANNEL_HOPPING_NUMBER_OF_CHANNELS];
uint32_t channel_hopping_buffer[CHANNEL_HOPPING_BUFFER_WORDS];

sl_rail_rx_channel_hopping_config_t channel_hopping_config = {
  .buffer = channel_hopping_buffer,
  .buffer_words = CHANNEL_HOPPING_BUFFER_WORDS,
  .number_of_channels = CHANNEL_HOPPING_NUMBER_OF_CHANNELS,
  .entries = channel_hopping_entries,
};

channel_hopping.entries[0].channel = 1;
channel_hopping.entries[1].channel = 2;
channel_hopping_entries[2].channel = 3;

sl_rail_config_rx_channel_hopping(rail_handle, &channel_hopping_config);
sl_rail_enable_rx_channel_hopping(rail_handle, true, true)

```

##### Modules

[RAIL_RxChannelHoppingConfigMultiMode_t](rail-rx-channel-hopping-config-multi-mode-t)

[RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t)

[RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t)

[RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t)

[sl_rail_rx_channel_hopping_config_multi_mode_t](sl-rail-rx-channel-hopping-config-multi-mode-t)

[sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t)

[sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t)

[sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t)

[EFR32xG2x](rx-channel-hopping-efr32-xg2-x)

[SIxx3xx](rx-channel-hopping-sixx3-xx)

##### Enumerations

###### RAIL_RxChannelHoppingMode_t

```
enum RAIL_RxChannelHoppingMode_t {
    RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL = 0
    RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT = 1
    RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE = 2
    RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE = 3
    RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1 = 4
    RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE = 5
    RAIL_RX_CHANNEL_HOPPING_MODE_SQ = 6
    RAIL_RX_CHANNEL_HOPPING_MODE_CONC = 7
    RAIL_RX_CHANNEL_HOPPING_MODE_VT = 8
    RAIL_RX_CHANNEL_HOPPING_MODE_TX = 9
    RAIL_RX_CHANNEL_HOPPING_MODES_COUNT
    RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE = 0x80
    RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL)
    RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT)
    RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE)
    RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE)
    RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1)
    RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE)
    RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_SQ)
    RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_CONC)
    RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_VT)
    RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS = (RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + RAIL_RX_CHANNEL_HOPPING_MODE_TX)
}
```

**Description:**

Modes by which RAIL can determine when to proceed to the next channel during channel hopping.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_mode_t](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL|Switch to the next channel each time the radio re-enters RX after packet reception or a transmit based on the corresponding [State Transitions](state-transitions).|
|RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT|Switch to the next channel after a certain amount of time passes.|
|RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE|Listen in receive RX for at least a specified timeout.|
|RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE|Listen in receive RX for at least a specified timeout.|
|RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1|Placeholder for a reserved hopping mode that is not supported.|
|RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE|A mode that combines modes TIMING_SENSE, PREAMBLE_SENSE, and TIMEOUT (sync detect) all running in parallel.|
|RAIL_RX_CHANNEL_HOPPING_MODE_SQ|Switch to the next channel based on the demodulation settings in the PHY config.|
|RAIL_RX_CHANNEL_HOPPING_MODE_CONC|Marks that the channel is concurrent with another channel, and otherwise behaves identically to [RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#rail-rx-channel-hopping-mode-sq).|
|RAIL_RX_CHANNEL_HOPPING_MODE_VT|Indicates that this channel is a virtual channel that is concurrently detected with the channel indicated by the [RAIL_RxChannelHoppingConfigEntry_t::parameter](rail-rx-channel-hopping-config-entry-t#parameter).|
|RAIL_RX_CHANNEL_HOPPING_MODE_TX|This is the transmit channel used for Auto-Ack if the regular channel, specified in RAIL_RxChannelHoppingConfigEntry::parameter, is optimized for RX which may degrade some TX performance.|
|RAIL_RX_CHANNEL_HOPPING_MODES_COUNT|A count of the basic choices in this enumeration.|
|RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE|The start of equivalent modes requiring non-default [RAIL_RxDutyCycleConfig_t::options](rail-rx-duty-cycle-config-t#options), needed for backwards-compatibility with earlier [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) format.|
|RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#rail-rx-channel-hopping-mode-manual) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT](rx-channel-hopping#rail-rx-channel-hopping-mode-timeout) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-timing-sense) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-preamble-sense) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED1](rx-channel-hopping#rail-rx-channel-hopping-mode-reserved1) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#rail-rx-channel-hopping-mode-sq) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#rail-rx-channel-hopping-mode-conc) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#rail-rx-channel-hopping-mode-vt) with options.|
|RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS|Variant of [RAIL_RX_CHANNEL_HOPPING_MODE_TX](rx-channel-hopping#rail-rx-channel-hopping-mode-tx) with options.|

###### RAIL_RxChannelHoppingDelayMode_t

```
enum RAIL_RxChannelHoppingDelayMode_t {
    RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC = 0
}
```

**Details:**

**Deprecated**Set only to RAIL_RX_CHANNEL_DELAY_MODE_STATIC. This enum type has been eliminated in RAIL 3.

**Enumerator:**

|   |   |
|---|---|
|RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC|Always delay for exactly the amount of time specified in the delay parameter, regardless of how other channel hopping channels were extended via preamble sense or other means.|

###### RAIL_RxChannelHoppingOptions_t

```
enum RAIL_RxChannelHoppingOptions_t {
    RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT = 0
    RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT = 1
    RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT = 2
    RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT = 3
    RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT
}
```

**Description:**

Options that can customize channel hopping behavior on a per-hop basis.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_options_t](rx-channel-hopping#sl-rail-rx-channel-hopping-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT|Shift position of [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL](rx-channel-hopping#rail-rx-channel-hopping-option-skip-synth-cal) bit.|
|RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT|Shift position of [RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL](rx-channel-hopping#rail-rx-channel-hopping-option-skip-dc-cal) bit.|
|RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT|Shift position of [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) bit.|
|RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT|Shift position of [RAIL_RX_CHANNEL_HOPPING_OPTION_STOP](rx-channel-hopping#rail-rx-channel-hopping-option-stop) bit.|
|RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT|A count of the choices in this enumeration.|

###### sl_rail_rx_channel_hopping_mode_t

```
enum sl_rail_rx_channel_hopping_mode_t {
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL = 0u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT = 1u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE = 2u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE = 3u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4 = 4u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE = 5u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ = 6u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC = 7u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT = 8u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX = 9u
    SL_RAIL_RX_CHANNEL_HOPPING_MODES_COUNT
    SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE = 0x80u
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT)
    SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS = (SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE
       + SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX)
}
```

**Description:**

Modes by which RAIL can determine when to proceed to the next channel during channel hopping.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL|Switch to the next channel each time the radio re-enters RX after packet reception or a transmit based on the corresponding [State Transitions](state-transitions).|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT|Switch to the next channel after a certain amount of time passes.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE|Listen in receive RX for at least a specified timeout.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE|Listen in receive RX for at least a specified timeout.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4|Placeholder for a reserved hopping mode that is not supported.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE|A mode that combines modes TIMING_SENSE, PREAMBLE_SENSE, and TIMEOUT (sync detect) all running in parallel.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ|Switch to the next channel based on the demodulation settings in the PHY config.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC|Marks that the channel is concurrent with another channel, and otherwise behaves identically to [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq).|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT|Indicates that this channel is a virtual channel that is concurrently detected with the channel indicated by the [sl_rail_rx_channel_hopping_config_entry_t::parameter](sl-rail-rx-channel-hopping-config-entry-t#parameter).|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX|This is the transmit channel used for Auto-Ack if the regular channel, specified in sl_rail_rx_channel_hopping_config_entry::parameter, is optimized for RX which may degrade some TX performance.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODES_COUNT|A count of the basic choices in this enumeration.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODES_WITH_OPTIONS_BASE|The start of equivalent modes requiring non-default [sl_rail_rx_duty_cycle_config_t::options](sl-rail-rx-duty-cycle-config-t#options), needed for backwards-compatibility with earlier [sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t) format.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-manual) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timeout) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TIMING_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-timing-sense) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-preamble-sense) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_RESERVED_4](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-reserved-4) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-multi-sense) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_SQ](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-sq) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-conc) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-vt) with options.|
|SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX_WITH_OPTIONS|Variant of [SL_RAIL_RX_CHANNEL_HOPPING_MODE_TX](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-tx) with options.|

###### sl_rail_rx_channel_hopping_options_t

```
enum sl_rail_rx_channel_hopping_options_t {
    SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT = 0
    SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT = 1
    SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT = 2
    SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT = 3
    SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT
}
```

**Description:**

Options that can customize channel hopping behavior on a per-hop basis.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT|Shift position of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-synth-cal) bit.|
|SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT|Shift position of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL](rx-channel-hopping#sl-rail-rx-channel-hopping-option-skip-dc-cal) bit.|
|SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT|Shift position of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#sl-rail-rx-channel-hopping-option-rssi-threshold) bit.|
|SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT|Shift position of [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP](rx-channel-hopping#sl-rail-rx-channel-hopping-option-stop) bit.|
|SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_COUNT|A count of the choices in this enumeration.|

##### Typedefs

###### RAIL_RxChannelHoppingParameter_t

`RAIL_RxChannelHoppingParameter_t`

**Description:**

Rx channel hopping on-channel time.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_parameter_t](rx-channel-hopping#sl-rail-rx-channel-hopping-parameter-t).

###### sl_rail_rx_channel_hopping_parameter_t

`sl_rail_rx_channel_hopping_parameter_t`

**Description:**

Rx channel hopping on-channel time.

##### Functions

###### RAIL_ConfigRxChannelHopping

`RAIL_Status_t RAIL_ConfigRxChannelHopping(RAIL_Handle_t railHandle, RAIL_RxChannelHoppingConfig_t *config)`

**Description:** Configure RX channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t) *|[in]|config|A pointer to the configuration parameters for RX Channel Hopping.|

**Returns**

- Status code indicating success of the function call.

Configure channel hopping channels, conditions, and parameters. This API must be called before [RAIL_EnableRxChannelHopping()](rx-channel-hopping#rail-enable-rx-channel-hopping). This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1) or the runtime call [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping) to check whether the platform supports this feature.
- Calling this function will overwrite any settings configured with [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping). 

###### RAIL_EnableRxChannelHopping

`RAIL_Status_t RAIL_EnableRxChannelHopping(RAIL_Handle_t railHandle, bool enable, bool reset)`

**Description:** Enable RX channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Enable (true) or disable (false) RX Channel Hopping.|
|bool|[in]|reset|Start from the first channel of the channel hopping sequence (true) or from wherever hopping left off last time the code left RX.|

**Returns**

- Status code indicating success of the function call.

Enable or disable Channel Hopping. Additionally, specify whether hopping should be reset to start from the first channel index, or continue from the channel last hopped to. The radio should not be on when this API is called. [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) must be called successfully before this API is called.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1) or the runtime call [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping) to check whether the platform supports this feature.
- RX Channel Hopping may not be enabled while Auto-Acking is enabled.
- Calling this function will overwrite any settings configured with [RAIL_EnableRxDutyCycle()](rx-channel-hopping#rail-enable-rx-duty-cycle).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping). 

###### RAIL_TriggerRxChannelHop

`RAIL_Status_t RAIL_TriggerRxChannelHop(RAIL_Handle_t railHandle)`

**Description:** Manually trigger an Rx channel hop.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function facilitates a manual hop when using [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#rail-rx-channel-hopping-mode-manual). (It will also trigger a hop in other automatic hop modes as well, so use with caution.)

**Note**

- This function may cause [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete) to occur before it returns.

**Deprecated**RAIL 2.x synonym of [sl_rail_trigger_rx_channel_hop()](rx-channel-hopping#sl-rail-trigger-rx-channel-hop). 

###### RAIL_GetChannelHoppingRssi

`int16_t RAIL_GetChannelHoppingRssi(RAIL_Handle_t railHandle, uint8_t channelIndex)`

**Description:** Get RSSI in quarter-dBm of one channel in the channel hopping sequence, during channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|channelIndex|Index in the channel hopping sequence of the channel of interest.|

**Returns**

- Latest RSSI in quarter-dBm (dBm * 4) for the channel at the specified index.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1) or the runtime call [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping) to check whether the platform supports this feature.
- In multiprotocol, this function returns [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) immediately if railHandle is not the currently active [RAIL_Handle_t](general#rail-handle-t).
- [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) must be called successfully before this API is called.
- When the Z-Wave protocol is active, running [RAIL_GetChannelHoppingRssi()](rx-channel-hopping#rail-get-channel-hopping-rssi) on the 9.6 kbps PHY returns the RSSI measurement of the 40kpbs PHY. This is because the 9.6 kbps PHY has trouble with RSSI measurements on EFR32xG2x family of chips.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_channel_hopping_rssi()](rx-channel-hopping#sl-rail-get-channel-hopping-rssi). 

###### RAIL_ConfigRxDutyCycle

`RAIL_Status_t RAIL_ConfigRxDutyCycle(RAIL_Handle_t railHandle, const RAIL_RxDutyCycleConfig_t *config)`

**Description:** Configure RX duty cycle mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) *|[in]|config|A non-NULL pointer to a configuration structure specifying duty cycle parameters.|

**Returns**

- Status code indicating success of the function call.

Configure RX duty cycle mode. With this mode enabled, every time the radio enters RX, it will duty cycle on and off to save power. The duty cycle ratio can be altered dynamically and intelligently by the hardware by staying on longer if a preamble or other packet segments are detected in the air. This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled. For short delays (in the order of microseconds), [RAIL_RxDutyCycleConfig_t::delay](rail-rx-duty-cycle-config-t#delay), this can be used to save receive current while having little impact on the radio performance, for protocols with long preambles. For long delays (in the order of milliseconds or higher) the chip can be put into EM2 energy mode before re-entering RX, to save extra power, with some application hooks as shown below.

```c
#include "rail.h"

extern RAIL_Handle_t railHandle;
RAIL_Time_t periodicWakeupUs;

volatile bool dutyCycleEnd = true;

void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Omitting other event handlers
  if (events & RAIL_EVENT_RX_DUTY_CYCLE_RX_END) {
    dutyCycleEnd = true;
  }
}

void main(void)
{
  RAIL_Status_t status;
  bool shouldSleep = false;

  initializeRail(); // Call RAIL_Init() and such

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that
  // function will attempt to auto detect the clock.
  BoardSetupLFCLK();
  // Initialize Power Manager module
  sl_power_manager_init();
  // Initialize RAIL Power Manager
  RAIL_InitPowerManager();

  // Configure sleep for timer synchronization
  RAIL_TimerSyncConfig_t timerSyncConfig = RAIL_TIMER_SYNC_DEFAULT;
  status = RAIL_ConfigSleep(railHandle, &timerSyncConfig);
  assert(status == RAIL_STATUS_NO_ERROR);

  // Configure RX duty-cycling
  RAIL_RxDutyCycleConfig_t duty_cycle_config = {
    .mode = RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE,
    .parameter = DUTY_CYCLE_ON_TIME,
    .delay_us = DUTY_CYCLE_OFF_TIME,
    .delay_mode = RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC,
    .options = RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE,
  };
  status = RAIL_ConfigRxDutyCycle(rail_handle, &duty_cycle_config);
  assert(status == RAIL_STATUS_NO_ERROR);
  status = RAIL_EnableRxDutyCycle(rail_handle, true);
  assert(status == RAIL_STATUS_NO_ERROR);

  // Application main loop
  while (1) {
    if (dutyCycleEnd) {
      dutyCycleEnd = false;
      // Schedule the next receive.
      RAIL_ScheduleRxConfig_t rxConfig = {
        .start = periodicWakeupUs,
        .startMode = RAIL_TIME_DELAY,
        .end = 0U,
        .endMode = RAIL_TIME_DISABLED,
        .rxTransitionEndSchedule = 0U,
        .hardWindowEnd = 0U
      };
      RAIL_Idle(railHandle, RAIL_IDLE_ABORT, true);
      RAIL_StartScheduledRx(railHandle, channel, &rxConfig, NULL);
    }
    // ... do normal app stuff and set shouldSleep when we want to sleep
    if (shouldSleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1) or the runtime call [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping) to check whether the platform supports this feature.
- Calling this function will overwrite any settings configured with [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_rx_duty_cycle()](rx-channel-hopping#sl-rail-config-rx-duty-cycle). 

###### RAIL_EnableRxDutyCycle

`RAIL_Status_t RAIL_EnableRxDutyCycle(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable RX duty cycle mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Enable (true) or disable (false) RX Duty Cycling.|

**Returns**

- Status code indicating success of the function call.

Enable or disable RX duty cycle mode. After this is called, the radio will begin duty cycling each time it enters RX, based on the configuration passed to [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle). This API must not be called while the radio is on.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_CHANNEL_HOPPING](features#rail-supports-channel-hopping-1) or the runtime call [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping) to check whether the platform supports this feature.
- Calling this function will overwrite any settings configured with [RAIL_EnableRxChannelHopping()](rx-channel-hopping#rail-enable-rx-channel-hopping).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_rx_duty_cycle()](rx-channel-hopping#sl-rail-enable-rx-duty-cycle). 

###### RAIL_GetDefaultRxDutyCycleConfig

`RAIL_Status_t RAIL_GetDefaultRxDutyCycleConfig(RAIL_Handle_t railHandle, RAIL_RxDutyCycleConfig_t *config)`

**Description:** Get the default RX duty cycle configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) *|[out]|config|An application-provided non-NULL pointer to store the default RX duty cycle configuration.|

**Returns**

- Status code indicating success of the function call. Note that [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) will be returned if the current channel's radio configuration does not support the requested information.

To save power during RX, an application may want to go to low power as long as possible by periodically waking up and trying to "sense" if there are any incoming packets. This API returns the recommended RX duty cycle configuration, so the application can enter low power mode periodically without missing packets. To wake up earlier, the application can reduce the delay parameter. Note that these value might be different if any configuration / channel has changed.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_default_rx_duty_cycle_config()](rx-channel-hopping#sl-rail-get-default-rx-duty-cycle-config). 

###### sl_rail_config_rx_channel_hopping

`sl_rail_status_t sl_rail_config_rx_channel_hopping(sl_rail_handle_t rail_handle, sl_rail_rx_channel_hopping_config_t *p_rx_hopping_config)`

**Description:** Configure RX channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t) *|[in]|p_rx_hopping_config|A pointer to the configuration parameters for RX Channel Hopping.|

**Returns**

- Status code indicating success of the function call.

Configure channel hopping channels, conditions, and parameters. This API must be called before [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping). This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1) or the runtime call [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping) to check whether the platform supports this feature.
- Calling this function will overwrite any settings configured with [sl_rail_config_rx_duty_cycle()](rx-channel-hopping#sl-rail-config-rx-duty-cycle).

###### sl_rail_enable_rx_channel_hopping

`sl_rail_status_t sl_rail_enable_rx_channel_hopping(sl_rail_handle_t rail_handle, bool enable, bool reset)`

**Description:** Enable RX channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Enable (true) or disable (false) RX Channel Hopping.|
|bool|[in]|reset|Start from the first channel of the channel hopping sequence (true) or from wherever hopping left off last time the code left RX.|

**Returns**

- Status code indicating success of the function call.

Enable or disable Channel Hopping. Additionally, specify whether hopping should be reset to start from the first channel index, or continue from the channel last hopped to. The radio should not be on when this API is called. [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) must be called successfully before this API is called.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1) or the runtime call [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping) to check whether the platform supports this feature.
- RX Channel Hopping may not be enabled while Auto-Acking is enabled.
- Calling this function will overwrite any settings configured with [sl_rail_enable_rx_duty_cycle()](rx-channel-hopping#sl-rail-enable-rx-duty-cycle).

###### sl_rail_trigger_rx_channel_hop

`sl_rail_status_t sl_rail_trigger_rx_channel_hop(sl_rail_handle_t rail_handle)`

**Description:** Manually trigger an Rx channel hop.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function facilitates a manual hop when using [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-manual). (It will also trigger a hop in other automatic hop modes as well, so use with caution.)

**Note**

- This function may cause [SL_RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#sl-rail-event-rx-channel-hopping-complete) to occur before it returns.

###### sl_rail_get_channel_hopping_rssi

`int16_t sl_rail_get_channel_hopping_rssi(sl_rail_handle_t rail_handle, uint8_t channel_index)`

**Description:** Get RSSI in quarter-dBm of one channel in the channel hopping sequence, during channel hopping.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|channel_index|Index in the channel hopping sequence of the channel of interest.|

**Returns**

- Latest RSSI in quarter-dBm (dBm * 4) for the channel at the specified index.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1) or the runtime call [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping) to check whether the platform supports this feature.
- In multiprotocol, this function returns [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) immediately if rail_handle is not the currently active [sl_rail_handle_t](general#sl-rail-handle-t).
- [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) must be called successfully before this API is called.
- When the Z-Wave protocol is active, running [sl_rail_get_channel_hopping_rssi()](rx-channel-hopping#sl-rail-get-channel-hopping-rssi) on the 9.6 kbps PHY returns the RSSI measurement of the 40kpbs PHY. This is because the 9.6 kbps PHY has trouble with RSSI measurements on EFR32xG2x family of chips.

###### sl_rail_config_rx_duty_cycle

`sl_rail_status_t sl_rail_config_rx_duty_cycle(sl_rail_handle_t rail_handle, const sl_rail_rx_duty_cycle_config_t *p_rx_duty_cycle_config)`

**Description:** Configure RX duty cycle mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t) *|[in]|p_rx_duty_cycle_config|A non-NULL pointer to a configuration structure specifying duty cycle parameters.|

**Returns**

- Status code indicating success of the function call.

Configure RX duty cycle mode. With this mode enabled, every time the radio enters RX, it will duty cycle on and off to save power. The duty cycle ratio can be altered dynamically and intelligently by the hardware by staying on longer if a preamble or other packet segments are detected in the air. This API must never be called while the radio is on with RX Duty Cycle or Channel Hopping enabled. For short delays (in the order of microseconds), [sl_rail_rx_duty_cycle_config_t::delay_us](sl-rail-rx-duty-cycle-config-t#delay-us), this can be used to save receive current while having little impact on the radio performance, for protocols with long preambles. For long delays (in the order of milliseconds or higher) the chip can be put into EM2 energy mode before re-entering RX, to save extra power, with some application hooks as shown below.

```c
#include "sl_rail.h"

extern sl_rail_handle_t rail_handle;
sl_rail_time_t periodic_wakeup_us;

volatile bool duty_cycle_end = true;

void rail_events_callback(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Omitting other event handlers
  if (events & SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END) {
    duty_cycle_end = true;
  }
}

void main(void)
{
  sl_rail_status_t status;
  bool should_sleep = false;

  initialize_rail(); // Call sl_rail_init() and such

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that
  // function will attempt to auto detect the clock.
  Board_Setup_LFCLK();
  // Initialize Power Manager module
  sl_power_manager_init();
  // Initialize RAIL Power Manager
  sl_rail_init_power_manager();

  // Configure sleep for timer synchronization
  sl_rail_timer_sync_config_t timer_sync_config = SL_RAIL_TIMER_SYNC_DEFAULT;
  status = sl_rail_config_sleep(rail_handle, &timer_sync_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Configure RX duty-cycling
  sl_rail_rx_duty_cycle_config_t duty_cycle_config = {
    .mode = SL_RAIL_RX_CHANNEL_HOPPING_MODE_PREAMBLE_SENSE,
    .parameter = DUTY_CYCLE_ON_TIME,
    .delay_us = DUTY_CYCLE_OFF_TIME,
    .delay_mode = SL_RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC,
    .options = SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE,
  };
  status = sl_rail_config_rx_duty_cycle(rail_handle, &duty_cycle_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  status = sl_rail_enable_rx_duty_cycle(rail_handle, true);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Application main loop
  while (1) {
    if (duty_cycle_end) {
      duty_cycle_end = false;
      // Schedule the next receive.
      sl_rail_scheduled_rx_config_t rx_config = {
        .start = periodic_wakeup_us,
        .start_mode = SL_RAIL_TIME_DELAY,
        .end = 0U,
        .end_mode = SL_RAIL_TIME_DISABLED,
        .rx_transition_end_schedule = 0U,
        .hard_window_end = 0U,
      };
      sl_rail_idle(rail_handle, SL_RAIL_IDLE_ABORT, true);
      sl_rail_start_scheduled_rx(rail_handle, channel, &rx_config, NULL);
    }
    // ... do normal app stuff and set should_sleep when we want to sleep
    if (should_sleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1) or the runtime call [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping) to check whether the platform supports this feature.
- Calling this function will overwrite any settings configured with [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping).
- On Series 3 parts, to enable RX duty cycling, use the sl_rail_util_ieee802154_phy_select and sl_rail_util_ieee802154_rx_duty_cycling components instead.

###### sl_rail_enable_rx_duty_cycle

`sl_rail_status_t sl_rail_enable_rx_duty_cycle(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable RX duty cycle mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Enable (true) or disable (false) RX Duty Cycling.|

**Returns**

- Status code indicating success of the function call.

Enable or disable RX duty cycle mode. After this is called, the radio will begin duty cycling each time it enters RX, based on the configuration passed to [sl_rail_config_rx_duty_cycle()](rx-channel-hopping#sl-rail-config-rx-duty-cycle). This API must not be called while the radio is on.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_CHANNEL_HOPPING](features#sl-rail-supports-channel-hopping-1) or the runtime call [sl_rail_supports_channel_hopping()](features#sl-rail-supports-channel-hopping) to check whether the platform supports this feature.
- calling this function will overwrite any settings configured with [sl_rail_enable_rx_channel_hopping()](rx-channel-hopping#sl-rail-enable-rx-channel-hopping).
- On Series 3 parts, to enable RX duty cycling, use the sl_rail_util_ieee802154_phy_select and sl_rail_util_ieee802154_rx_duty_cycling components instead.

###### sl_rail_get_default_rx_duty_cycle_config

`sl_rail_status_t sl_rail_get_default_rx_duty_cycle_config(sl_rail_handle_t rail_handle, sl_rail_rx_duty_cycle_config_t *p_rx_duty_cycle_config)`

**Description:** Get the default RX duty cycle configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t) *|[out]|p_rx_duty_cycle_config|An application-provided non-NULL pointer to store the default RX duty cycle configuration.|

**Returns**

- Status code indicating success of the function call. Note that [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) will be returned if the current channel's radio configuration does not support the requested information.

To save power during RX, an application may want to go to low power as long as possible by periodically waking up and trying to "sense" if there are any incoming packets. This API returns the recommended RX duty cycle configuration, so the application can enter low power mode periodically without missing packets. To wake up earlier, the application can reduce the delay parameter. Note that these value might be different if any configuration / channel has changed. 

##### Macros

`#define RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US 0x08000000UL`

**Description**: The maximum sense time supported for those [RAIL_RxChannelHoppingMode_t](rx-channel-hopping#rail-rx-channel-hopping-mode-t) modes whose parameter(s) specify a sensing time.

`#define RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE 0U`

**Description**: A value representing no options enabled.

`#define RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE`

**Description**: All options disabled by default.

`#define RAIL_RX_CHANNEL_HOPPING_OPTION_DEFAULT RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT`

**Description**: **Deprecated**Please use [RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#rail-rx-channel-hopping-options-default) instead. Replaced by [SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT](rx-channel-hopping#sl-rail-rx-channel-hopping-options-default).

`#define RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL (1U << RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT)`

**Description**: An option to skip synth calibration while **hopping into** the channel specified in the current entry.

`#define RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL (1U << RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT)`

**Description**: An option to skip DC calibration while **hopping into** the channel specified in the current entry.

`#define RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD (1U << RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT)`

**Description**: An option to check RSSI after **hopping into** the channel specified in the current entry and hop if that RSSI is below the threshold specified in [RAIL_RxChannelHoppingConfigEntry_t::rssiThresholdDbm](rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm).

`#define RAIL_RX_CHANNEL_HOPPING_OPTION_STOP (1U << RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT)`

**Description**: An option to stop the hopping sequence at this entry in the hop table, which also idles the radio.

`#define RAIL_CHANNEL_HOPPING_INVALID_INDEX (0xFEU)`

**Description**: A sentinel value to flag an invalid channel hopping index.

`#define SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US 0x08000000UL`

**Description**: The maximum sense time supported for those [sl_rail_rx_channel_hopping_mode_t](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-t) modes whose parameter(s) specify a sensing time.

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE 0U`

**Description**: A value representing no options enabled.

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_DEFAULT SL_RAIL_RX_CHANNEL_HOPPING_OPTIONS_NONE`

**Description**: All options disabled by default.

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL (1U << SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_SYNTH_CAL_SHIFT)`

**Description**: An option to skip synth calibration while **hopping into** the channel specified in the current entry.

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL (1U << SL_RAIL_RX_CHANNEL_HOPPING_OPTION_SKIP_DC_CAL_SHIFT)`

**Description**: An option to skip DC calibration while **hopping into** the channel specified in the current entry.

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD (1U << SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD_SHIFT)`

**Description**: An option to check RSSI after **hopping into** the channel specified in the current entry and hop if that RSSI is below the threshold specified in [sl_rail_rx_channel_hopping_config_entry_t::rssi_threshold_dbm](sl-rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm).

`#define SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP (1U << SL_RAIL_RX_CHANNEL_HOPPING_OPTION_STOP_SHIFT)`

**Description**: An option to stop the hopping sequence at this entry in the hop table, which also idles the radio.

`#define SL_RAIL_CHANNEL_HOPPING_INVALID_INDEX (0xFEU)`

**Description**: A sentinel value to flag an invalid channel hopping index.

Structure that parameterizes [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense). 

Every [RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t) or [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) that uses [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense) must allocate one of these structures in global read-write memory to provide the settings for this mode and for RAIL to use during hopping or duty cycling. A pointer to this structure, cast appropriately, is what is passed in the corresponding [RAIL_RxChannelHoppingConfigEntry_t::parameter](rail-rx-channel-hopping-config-entry-t#parameter) or [RAIL_RxDutyCycleConfig_t::parameter](rail-rx-duty-cycle-config-t#parameter).

The contents of this structure must be initialized prior to each [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) or [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle) call and must not be touched thereafter until the next such call. RAIL may change these contents during configuration or operation.

This mode of operation functions algorithmically like this pseudocode: 

```c
extern bool channelHopping; // true if channel hopping, false if duty cycling
extern RAIL_RxChannelHoppingConfigEntry_t *hopConfigEntry; // current channel

static RAIL_RxChannelHoppingConfigMultiMode_t *multiParams;
static RAIL_Time_t rxStartTime;
static bool preambleSensed;

static void hopOrSuspendRx(uint32_t delay)
{
  disableDemodEvents();
  disableTimerEvents();
  stopTimer();
  if (channelHopping) {
    hopToNextChannel(delay, &hopConfigEntry); // updates hopConfigEntry
  } else {
    suspendRx(delay);
  }
  onStartRx(); // resume receive after delay (on new channel if hopping)
}

void onStartRx(void) // called upon entry to receive
{
  rxStartTime = RAIL_GetTime();
  multiParams = (RAIL_RxChannelHoppingConfigMultiMode_t *)
                (void *)hopConfigEntry->parameter;
  startTimer(rxStartTime + multiParams->timingSense);
  preambleSensed = false;
  enableTimerEvents(); // timer will trigger onTimerEvent() handler
  enableDemodEvents(); // demod will trigger onDemodEvent() handler
}

void onTimerEvent(void) // called when timer expires
{
  hopOrSuspendRx(hopConfigEntry->delay);
}

void onDemodEvent(void) // called when demodulator state changes
{
  if (DEMOD_TIMING_SENSED) {
    stopTimer();
    startTimer(rxStartTime + multiParams->syncDetect);
  }
  if (DEMOD_TIMING_LOST) {
    stopTimer();
    uint32_t newTimeout = RAIL_GetTime() + multiParams->timingReSense;
    uint32_t limitTimeout;
    if (preambleSensed) {
      limitTimeout = rxStartTime + multiParams->syncDetect;
    } else {
      limitTimeout = rxStartTime + multiParams->preambleSense;
    }
    if (newTimeout > limitTimeout) {
      newTimeout = limitTimeout;
    }
    if (newTimeout > RAIL_GetTime()) {
      startTimer(newTimeout);
    } else {
      hopOrSuspendRx(hopConfigEntry->delay);
    }
  }
  if (DEMOD_PREAMBLE_SENSED) {
    preambleSensed = true;
  }
  if (DEMOD_PREAMBLE_LOST) {
    preambleSensed = false;
  }
  if (DEMOD_SYNC_DETECTED) {
    disableDemodEvents();
    disableTimerEvents();
    stopTimer();
    receivePacket(); // stay on channel to receive frame
    hopOrSuspendRx(0); // continue RX per state transitions with no delay
  }
}

```

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t](sl-rail-rx-channel-hopping-config-multi-mode-t). 

###### Public Attributes

###### syncDetect (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigMultiMode_t::syncDetect
```

**Description:** Switch to the next channel if sync is not detected before this time, in microseconds, measured from entry to Rx.

**Details:** This must be greater than preambleSense and less than [RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#rail-rx-channel-hopping-max-sense-time-us).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::sync_detect_us](sl-rail-rx-channel-hopping-config-multi-mode-t#sync-detect-us).

###### preambleSense (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigMultiMode_t::preambleSense
```

**Description:** Switch to the next channel if timing was sensed but then lost after this time, in microseconds, measured from entry to Rx – unless preamble had been sensed in which case any switching is deferred to timingReSense and, if timing is regained, to syncDetect.

**Details:** This must be greater than timingSense and less than [RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#rail-rx-channel-hopping-max-sense-time-us).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::preamble_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#preamble-sense-us).

###### timingSense (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigMultiMode_t::timingSense
```

**Description:** Switch to the next channel if timing is not sensed before this time, in microseconds, measured from entry to Rx.

**Details:** This must be greater than 2 and less than [RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#rail-rx-channel-hopping-max-sense-time-us).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::timing_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#timing-sense-us).

###### timingReSense (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigMultiMode_t::timingReSense
```

**Description:** Switch to the next channel if timing was sensed but then lost and not regained before this time, in microseconds, measured from when timing was lost.

**Details:** This must be less than [RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#rail-rx-channel-hopping-max-sense-time-us).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::timing_re_sense_us](sl-rail-rx-channel-hopping-config-multi-mode-t#timing-re-sense-us).

###### status (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigMultiMode_t::status
```

**Description:** Set this to 0.

**Details:** This field, along with the others, may be used internally by RAIL during configuration or operation.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_multi_mode_t::status](sl-rail-rx-channel-hopping-config-multi-mode-t#status).

Structure that represents one of the channels that is part of a [RAIL_RxChannelHoppingConfig_t](rail-rx-channel-hopping-config-t) sequence of channels used in channel hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t). 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t RAIL_RxChannelHoppingConfigEntry_t::channel
```

**Description:** The channel number to be used for this entry in the channel hopping sequence.

**Details:** If this is an invalid channel for the current PHY, the call to [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) will fail.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::channel](sl-rail-rx-channel-hopping-config-entry-t#channel).

###### mode (heading level 7)

```
RAIL_RxChannelHoppingMode_t RAIL_RxChannelHoppingConfigEntry_t::mode
```

**Description:** The mode by which RAIL determines when to hop to the next channel.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::mode](sl-rail-rx-channel-hopping-config-entry-t#mode).

###### parameter (heading level 7)

```
RAIL_RxChannelHoppingParameter_t RAIL_RxChannelHoppingConfigEntry_t::parameter
```

**Description:** Depending on the 'mode' parameter that was specified, this member is used to parameterize that mode.

**Details:** See the comments on each value of [RAIL_RxChannelHoppingMode_t](rx-channel-hopping#rail-rx-channel-hopping-mode-t) to learn what to specify here.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::parameter](sl-rail-rx-channel-hopping-config-entry-t#parameter).

###### delay (heading level 7)

```
uint32_t RAIL_RxChannelHoppingConfigEntry_t::delay
```

**Description:** Idle time in microseconds to wait before hopping into the channel indicated by this entry.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::delay_us](sl-rail-rx-channel-hopping-config-entry-t#delay-us).

###### delayMode (heading level 7)

```
RAIL_RxChannelHoppingDelayMode_t RAIL_RxChannelHoppingConfigEntry_t::delayMode
```

**Details:** **Deprecated**Set delayMode to [RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-static). See [sl_rail_rx_channel_hopping_config_entry_t::reserved_0](sl-rail-rx-channel-hopping-config-entry-t#reserved-0).

###### options (heading level 7)

```
RAIL_RxChannelHoppingOptions_t RAIL_RxChannelHoppingConfigEntry_t::options
```

**Description:** Bitmask of various options that can be applied to the current channel hop.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::options](sl-rail-rx-channel-hopping-config-entry-t#options).

###### rssiThresholdDbm (heading level 7)

```
int8_t RAIL_RxChannelHoppingConfigEntry_t::rssiThresholdDbm
```

**Description:** The RSSI threshold (in dBm) below which a hop will occur in any mode when [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) is specified.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::rssi_threshold_dbm](sl-rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm).

###### reserved2 (heading level 7)

```
uint8_t RAIL_RxChannelHoppingConfigEntry_t::reserved2[1]
```

**Description:** Pad bytes reserved for future use and currently ignored.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_entry_t::reserved_1](sl-rail-rx-channel-hopping-config-entry-t#reserved-1).

Wrapper struct that will contain the sequence of [RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t) that represents the channel sequence to use during RX Channel Hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t). 

###### Public Attributes

###### buffer (heading level 7)

```
uint32_t* RAIL_RxChannelHoppingConfig_t::buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

**Note**

- The size of this buffer must be at least as large as 3 + [RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL](rx-channel-hopping-sixx3-xx#rail-channel-hopping-buffer-size-per-channel) * numberOfChannels, plus the sum of the sizes of the radioConfigDeltaAdd's of the required channels, plus the size of the radioConfigDeltaSubtract. In the case that one channel appears two or more times in your channel sequence (e.g., 1, 2, 3, 2), you must account for the radio configuration size that number of times (i.e., need to count channel 2's radio configuration size twice for the given example). The buffer is for internal use to the library.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::p_buffer](sl-rail-rx-channel-hopping-config-t#p-buffer).

###### bufferLength (heading level 7)

```
uint16_t RAIL_RxChannelHoppingConfig_t::bufferLength
```

**Description:** This parameter must be set to the length of the buffer array, in 32 bit words.

**Details:** This way, during configuration, the software can confirm it's writing within the bounds of the buffer. The configuration API will return an error or trigger [RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT](assertions#rail-assert-channel-hopping-buffer-too-short) if bufferLength is insufficient.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::buffer_words](sl-rail-rx-channel-hopping-config-t#buffer-words).

###### numberOfChannels (heading level 7)

```
uint8_t RAIL_RxChannelHoppingConfig_t::numberOfChannels
```

**Description:** The number of channels in the channel hopping sequence, which is the number of elements in the array that entries points to.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::number_of_channels](sl-rail-rx-channel-hopping-config-t#number-of-channels).

###### entries (heading level 7)

```
RAIL_RxChannelHoppingConfigEntry_t* RAIL_RxChannelHoppingConfig_t::entries
```

**Description:** A pointer to the first element of an array of [RAIL_RxChannelHoppingConfigEntry_t](rail-rx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** This array must have numberOfChannels entries.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_channel_hopping_config_t::p_entries](sl-rail-rx-channel-hopping-config-t#p-entries).

Structure to configure duty cycled receive mode. 

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t). 

###### Public Attributes

###### mode (heading level 7)

```
RAIL_RxChannelHoppingMode_t RAIL_RxDutyCycleConfig_t::mode
```

**Description:** The mode by which RAIL determines when to exit RX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::mode](sl-rail-rx-duty-cycle-config-t#mode).

###### parameter (heading level 7)

```
RAIL_RxChannelHoppingParameter_t RAIL_RxDutyCycleConfig_t::parameter
```

**Description:** Depending on the 'mode' parameter that was specified, this member is used to parameterize that mode.

**Details:** See the comments on each value of [RAIL_RxChannelHoppingMode_t](rx-channel-hopping#rail-rx-channel-hopping-mode-t) to learn what to specify here.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::parameter](sl-rail-rx-duty-cycle-config-t#parameter).

###### delay (heading level 7)

```
uint32_t RAIL_RxDutyCycleConfig_t::delay
```

**Description:** Idle time in microseconds to wait before re-entering RX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::delay_us](sl-rail-rx-duty-cycle-config-t#delay-us).

###### delayMode (heading level 7)

```
RAIL_RxChannelHoppingDelayMode_t RAIL_RxDutyCycleConfig_t::delayMode
```

**Details:** **Deprecated**Set delayMode to [RAIL_RX_CHANNEL_HOPPING_DELAY_MODE_STATIC](rx-channel-hopping#rail-rx-channel-hopping-delay-mode-static). See [sl_rail_rx_duty_cycle_config_t::reserved_0](sl-rail-rx-duty-cycle-config-t#reserved-0).

###### options (heading level 7)

```
RAIL_RxChannelHoppingOptions_t RAIL_RxDutyCycleConfig_t::options
```

**Description:** Bitmask of various options that can be applied to the current duty cycle operation when the mode is >= [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-manual-with-options) (ignored otherwise).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::options](sl-rail-rx-duty-cycle-config-t#options).

###### rssiThresholdDbm (heading level 7)

```
int8_t RAIL_RxDutyCycleConfig_t::rssiThresholdDbm
```

**Description:** The RSSI threshold (in dBm) below which Rx will end in any mode when [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) is specified.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::rssi_threshold_dbm](sl-rail-rx-duty-cycle-config-t#rssi-threshold-dbm).

###### reserved2 (heading level 7)

```
uint8_t RAIL_RxDutyCycleConfig_t::reserved2[1]
```

**Description:** Pad bytes reserved for future use and currently ignored.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_duty_cycle_config_t::reserved_1](sl-rail-rx-duty-cycle-config-t#reserved-1).

Structure that parameterizes [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-multi-sense). 

Every [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t) or [sl_rail_rx_duty_cycle_config_t](sl-rail-rx-duty-cycle-config-t) that uses [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-multi-sense) must allocate one of these structures in global read-write memory to provide the settings for this mode and for RAIL to use during hopping or duty cycling. A pointer to this structure, cast appropriately, is what is passed in the corresponding [sl_rail_rx_channel_hopping_config_entry_t::parameter](sl-rail-rx-channel-hopping-config-entry-t#parameter) or [sl_rail_rx_duty_cycle_config_t::parameter](sl-rail-rx-duty-cycle-config-t#parameter).

The contents of this structure must be initialized prior to each [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) or [sl_rail_config_rx_duty_cycle()](rx-channel-hopping#sl-rail-config-rx-duty-cycle) call and must not be touched thereafter until the next such call. RAIL may change these contents during configuration or operation.

This mode of operation functions algorithmically like this pseudocode: 

```c
extern bool channel_hopping; // true if channel hopping, false if duty cycling
extern sl_rail_rx_channel_hopping_config_entry_t *hop_config_entry; // current channel

static sl_rail_rx_channel_hopping_config_multi_mode_t *multi_params;
static sl_rail_time_t rx_start_time;
static bool preamble_sensed;

static void hop_or_suspend_rx(uint32_t delay)
{
  disable_demod_events();
  disable_timer_events();
  stop_timer();
  if (channel_hopping) {
    hop_to_next_channel(delay, &hop_config_entry); // updates hop_config_entry
  } else {
    suspend_rx(delay);
  }
  on_start_rx(); // resume receive after delay (on new channel if hopping)
}

void on_start_rx(void) // called upon entry to receive
{
  rx_start_time = sl_rail_get_time(SL_RAIL_EFR32_HANDLE);
  multi_params = (sl_rail_rx_channel_hopping_config_multi_mode_t *)
                 (void *)hop_config_entry->parameter;
  start_timer(rx_start_time + multi_params->timing_sense);
  preamble_sensed = false;
  enable_timer_events(); // timer will trigger on_timer_event() handler
  enable_demod_events(); // demod will trigger on_demod_event() handler
}

void on_timer_event(void) // called when timer expires
{
  hop_or_suspend_rx(hop_config_entry->delay);
}

void on_demod_event(void) // called when demodulator state changes
{
  if (DEMOD_TIMING_SENSED) {
    stop_timer();
    start_timer(rx_start_time + multi_params->sync_detect);
  }
  if (DEMOD_TIMING_LOST) {
    stop_timer();
    uint32_t new_timeout = sl_rail_get_time(SL_RAIL_EFR32_HANDLE) + multi_params->timing_re_sense;
    uint32_t limit_timeout;
    if (preamble_sensed) {
      limit_timeout = rx_start_time + multi_params->sync_detect;
    } else {
      limit_timeout = rx_start_time + multi_params->preamble_sense;
    }
    if (new_timeout > limit_timeout) {
      new_timeout = limit_timeout;
    }
    if (new_timeout > sl_rail_get_time(SL_RAIL_EFR32_HANDLE)) {
      start_timer(new_timeout);
    } else {
      hop_or_suspend_rx(hop_config_entry->delay);
    }
  }
  if (DEMOD_PREAMBLE_SENSED) {
    preamble_sensed = true;
  }
  if (DEMOD_PREAMBLE_LOST) {
    preamble_sensed = false;
  }
  if (DEMOD_SYNC_DETECTED) {
    disable_demod_events();
    disable_timer_events();
    stop_timer();
    receive_packet(); // stay on channel to receive frame
    hop_or_suspend_rx(0); // continue RX per state transitions with no delay
  }
}

```

###### Public Attributes

###### sync_detect_us (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_multi_mode_t::sync_detect_us
```

**Description:** Switch to the next channel if sync is not detected before this time, in microseconds, measured from entry to Rx.

**Details:** This must be greater than preamble_sense and less than [SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#sl-rail-rx-channel-hopping-max-sense-time-us).

###### preamble_sense_us (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_multi_mode_t::preamble_sense_us
```

**Description:** Switch to the next channel if timing was sensed but then lost after this time, in microseconds, measured from entry to Rx – unless preamble had been sensed in which case any switching is deferred to timing_re_sense and, if timing is regained, to sync_detect.

**Details:** This must be greater than timing_sense and less than [SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#sl-rail-rx-channel-hopping-max-sense-time-us).

###### timing_sense_us (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_multi_mode_t::timing_sense_us
```

**Description:** Switch to the next channel if timing is not sensed before this time, in microseconds, measured from entry to Rx.

**Details:** This must be greater than 2 and less than [SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#sl-rail-rx-channel-hopping-max-sense-time-us).

###### timing_re_sense_us (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_multi_mode_t::timing_re_sense_us
```

**Description:** Switch to the next channel if timing was sensed but then lost and not regained before this time, in microseconds, measured from when timing was lost.

**Details:** This must be less than [SL_RAIL_RX_CHANNEL_HOPPING_MAX_SENSE_TIME_US](rx-channel-hopping#sl-rail-rx-channel-hopping-max-sense-time-us).

###### status (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_multi_mode_t::status
```

**Description:** Set this to 0.

**Details:** This field, along with the others, may be used internally by RAIL during configuration or operation.

Structure that represents one of the channels that is part of a [sl_rail_rx_channel_hopping_config_t](sl-rail-rx-channel-hopping-config-t) sequence of channels used in channel hopping. 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t sl_rail_rx_channel_hopping_config_entry_t::channel
```

**Description:** The channel number to be used for this entry in the channel hopping sequence.

**Details:** If this is an invalid channel for the current PHY, the call to [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) will fail.

###### mode (heading level 7)

```
sl_rail_rx_channel_hopping_mode_t sl_rail_rx_channel_hopping_config_entry_t::mode
```

**Description:** The mode by which RAIL determines when to hop to the next channel.

###### parameter (heading level 7)

```
sl_rail_rx_channel_hopping_parameter_t sl_rail_rx_channel_hopping_config_entry_t::parameter
```

**Description:** Depending on the 'mode' parameter that was specified, this member is used to parameterize that mode.

**Details:** See the comments on each value of [sl_rail_rx_channel_hopping_mode_t](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-t) to learn what to specify here.

###### delay_us (heading level 7)

```
uint32_t sl_rail_rx_channel_hopping_config_entry_t::delay_us
```

**Description:** Idle time in microseconds to wait before hopping into the channel indicated by this entry.

###### reserved_0 (heading level 7)

```
uint8_t sl_rail_rx_channel_hopping_config_entry_t::reserved_0
```

**Description:** Reserved for future use.

###### options (heading level 7)

```
sl_rail_rx_channel_hopping_options_t sl_rail_rx_channel_hopping_config_entry_t::options
```

**Description:** Bitmask of various options that can be applied to the current channel hop.

###### rssi_threshold_dbm (heading level 7)

```
int8_t sl_rail_rx_channel_hopping_config_entry_t::rssi_threshold_dbm
```

**Description:** The RSSI threshold (in dBm) below which a hop will occur in any mode when [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#sl-rail-rx-channel-hopping-option-rssi-threshold) is specified.

###### reserved_1 (heading level 7)

```
uint8_t sl_rail_rx_channel_hopping_config_entry_t::reserved_1[1]
```

**Description:** Pad bytes reserved for future use and currently ignored.

Wrapper struct that will contain the sequence of [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t) that represents the channel sequence to use during RX Channel Hopping. 

###### Public Attributes

###### p_buffer (heading level 7)

```
uint32_t* sl_rail_rx_channel_hopping_config_t::p_buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

**Note**

- The size of this buffer must be at least as large as 3 + [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL](rx-channel-hopping-sixx3-xx#sl-rail-channel-hopping-buffer-words-per-channel) * number_of_channels, plus the sum of the sizes of the radio_config_delta_add's of the required channels, plus the size of the radio_config_delta_subtract. In the case that one channel appears two or more times in your channel sequence (e.g., 1, 2, 3, 2), you must account for the radio configuration size that number of times (i.e., need to count channel 2's radio configuration size twice for the given example). The buffer is for internal use to the library.

###### buffer_words (heading level 7)

```
uint16_t sl_rail_rx_channel_hopping_config_t::buffer_words
```

**Description:** This parameter must be set to the length of the buffer array, in 32 bit words.

**Details:** This way, during configuration, the software can confirm it's writing within the bounds of the buffer. The configuration API will return an error or trigger [SL_RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT](assertions#sl-rail-assert-channel-hopping-buffer-too-short) if buffer_words is insufficient.

###### number_of_channels (heading level 7)

```
uint8_t sl_rail_rx_channel_hopping_config_t::number_of_channels
```

**Description:** The number of channels in the channel hopping sequence, which is the number of elements in the array that entries points to.

###### p_entries (heading level 7)

```
sl_rail_rx_channel_hopping_config_entry_t* sl_rail_rx_channel_hopping_config_t::p_entries
```

**Description:** A pointer to the first element of an array of [sl_rail_rx_channel_hopping_config_entry_t](sl-rail-rx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** This array must have number_of_channels entries.

Structure to configure duty cycled receive mode. 

###### Public Attributes

###### mode (heading level 7)

```
sl_rail_rx_channel_hopping_mode_t sl_rail_rx_duty_cycle_config_t::mode
```

**Description:** The mode by which RAIL determines when to exit RX.

###### parameter (heading level 7)

```
sl_rail_rx_channel_hopping_parameter_t sl_rail_rx_duty_cycle_config_t::parameter
```

**Description:** Depending on the 'mode' parameter that was specified, this member is used to parameterize that mode.

**Details:** See the comments on each value of [sl_rail_rx_channel_hopping_mode_t](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-t) to learn what to specify here.

###### delay_us (heading level 7)

```
uint32_t sl_rail_rx_duty_cycle_config_t::delay_us
```

**Description:** Idle time in microseconds to wait before re-entering RX.

###### reserved_0 (heading level 7)

```
uint8_t sl_rail_rx_duty_cycle_config_t::reserved_0
```

**Description:** Reserved for future use.

###### options (heading level 7)

```
sl_rail_rx_channel_hopping_options_t sl_rail_rx_duty_cycle_config_t::options
```

**Description:** Bitmask of various options that can be applied to the current duty cycle operation when the mode is >= [SL_RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL_WITH_OPTIONS](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-manual-with-options) (ignored otherwise).

###### rssi_threshold_dbm (heading level 7)

```
int8_t sl_rail_rx_duty_cycle_config_t::rssi_threshold_dbm
```

**Description:** The RSSI threshold (in dBm) below which Rx will end in any mode when [SL_RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#sl-rail-rx-channel-hopping-option-rssi-threshold) is specified.

###### reserved_1 (heading level 7)

```
uint8_t sl_rail_rx_duty_cycle_config_t::reserved_1[1]
```

**Description:** Pad bytes reserved for future use and currently ignored.

##### EFR32xG2x

EFR32xG2x-specific RX channel hopping. 

###### Macros

`#define RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL (56U)`

**Description**: The static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

`#define SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL (56U)`

**Description**: The static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

##### SIxx3xx

SIxx3xx-specific RX channel hopping. 

###### Macros

`#define RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL (54U)`

**Description**: The static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

`#define SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL (54U)`

**Description**: The static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

#### Radio Configuration

Routines for setting up and querying radio configuration information. 

These routines allow for runtime flexibility in the radio configuration. Some of the parameters, however, are meant to be generated from the radio calculator in Simplicity Studio. The basic code to configure the radio from this calculator output looks like the example below. 

```c
// Associate a specific channel configuration with a particular RAIL instance and
// load the settings that correspond to the first usable channel.
RAIL_ConfigChannels(railHandle, channelConfigs[0]);

```

For more information about the types of parameters that can be changed in the other functions and how to use them, see their individual documentation.

These routines allow for runtime flexibility in the radio configuration. Some of the parameters, however, are meant to be generated from the radio calculator in Simplicity Studio. The basic code to configure the radio from this calculator output looks like the example below. 

```c
// Associate a specific channel configuration with a particular RAIL instance.
sl_rail_config_channels(rail_handle, channel_configs[0], NULL);
// If want RAIL 2.x behavior where the first channel is prepared by default
// then do:
sl_rail_prepare_channel(rail_handle,
                        sl_rail_get_first_channel(rail_handle,
                                                  channel_configs[0]));
// Otherwise channel preparation is deferred to the first API call that
// specifies a particular channel.

```

For more information about the types of parameters that can be changed in the other functions and how to use them, see their individual documentation. 

##### Modules

[RAIL_FrameType_t](rail-frame-type-t)

[RAIL_AlternatePhy_t](rail-alternate-phy-t)

[RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t)

[RAIL_ChannelConfig_t](rail-channel-config-t)

[RAIL_ChannelMetadata_t](rail-channel-metadata-t)

[RAIL_StackInfoCommon_t](rail-stack-info-common-t)

[sl_rail_frame_type_t](sl-rail-frame-type-t)

[sl_rail_alternate_phy_t](sl-rail-alternate-phy-t)

[sl_rail_channel_config_group_t](sl-rail-channel-config-group-t)

[sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t)

[sl_rail_channel_config_t](sl-rail-channel-config-t)

[sl_rail_channel_metadata_t](sl-rail-channel-metadata-t)

[sl_rail_stack_info_common_t](sl-rail-stack-info-common-t)

[RAIL_ChannelConfigEntryAttr_t](rail-channel-config-entry-attr-t)

[sl_rail_channel_config_entry_attr_t](sl-rail-channel-config-entry-attr-t)

##### Enumerations

###### RAIL_ChannelConfigEntryType_t

```
enum RAIL_ChannelConfigEntryType_t {
    RAIL_CH_TYPE_NORMAL
    RAIL_CH_TYPE_CONC_BASE
    RAIL_CH_TYPE_CONC_VIRTUAL
}
```

**Description:**

Define if the channel support using concurrent PHY during channel hopping.

**Details:**

[RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#rail-rx-channel-hopping-mode-conc) and [RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#rail-rx-channel-hopping-mode-vt) can only be used if the channel supports it.

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_type_t](radio-configuration#sl-rail-channel-config-entry-type-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_CH_TYPE_NORMAL|Not a concurrent PHY.|
|RAIL_CH_TYPE_CONC_BASE|Base concurrent PHY.|
|RAIL_CH_TYPE_CONC_VIRTUAL|Virtual concurrent PHY.|

###### sl_rail_channel_config_entry_type_t

```
enum sl_rail_channel_config_entry_type_t {
    SL_RAIL_CH_TYPE_NORMAL = 0
    SL_RAIL_CH_TYPE_CONC_BASE = 1
    SL_RAIL_CH_TYPE_CONC_VIRTUAL = 2
}
```

**Description:**

Define if the channel support using concurrent PHY during channel hopping.

**Details:**

[SL_RAIL_RX_CHANNEL_HOPPING_MODE_CONC](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-conc) and [SL_RAIL_RX_CHANNEL_HOPPING_MODE_VT](rx-channel-hopping#sl-rail-rx-channel-hopping-mode-vt) can only be used if the channel supports it.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_CH_TYPE_NORMAL|Not a concurrent PHY.|
|SL_RAIL_CH_TYPE_CONC_BASE|Base concurrent PHY.|
|SL_RAIL_CH_TYPE_CONC_VIRTUAL|Virtual concurrent PHY.|

##### Typedefs

###### RAIL_RadioConfig_t

`typedef const uint32_t* RAIL_RadioConfig_t`

**Description:**

Pointer to a radio configuration array.

**Details:**

The radio configuration properly configures the radio for operation on a protocol. These configurations are very chip-specific should not be created or edited by hand.

**Deprecated**RAIL 2.x synonym of [sl_rail_radio_config_t](radio-configuration#sl-rail-radio-config-t).

###### RAIL_RadioConfigChangedCallback_t

`RAIL_RadioConfigChangedCallback_t`

**Description:**

A pointer to a function called whenever a radio configuration change occurs.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|railHandle|The corresponding RAIL instance handle.|
||[in]|entry|A pointer to the radio configuration entry being changed to.|

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_radio_config_changed_callback_t()](radio-configuration#sl-rail-radio-config-changed-callback-t).

###### sl_rail_radio_config_t

`typedef const uint32_t* sl_rail_radio_config_t`

**Description:**

Pointer to a radio configuration array.

**Details:**

The radio configuration properly configures the radio for operation on a protocol. These configurations are very chip-specific should not be created or edited by hand.

###### sl_rail_packet_duration_t

`sl_rail_packet_duration_t`

**Description:**

A pointer to a function that processes packet duration on air.

###### sl_rail_radio_config_changed_callback_t

`sl_rail_radio_config_changed_callback_t`

**Description:**

A pointer to a function called whenever a radio configuration change occurs.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|rail_handle|The corresponding real RAIL instance handle.|
||[in]|p_entry|A pointer to the radio configuration entry being changed to.|

**Details:**

##### Functions

###### RAIL_SetFixedLength

`uint16_t RAIL_SetFixedLength(RAIL_Handle_t railHandle, uint16_t length)`

**Description:** Modify the currently configured fixed frame length in bytes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|length|The expected fixed frame length. A value of 0 is infinite. A value of [RAIL_SETFIXEDLENGTH_INVALID](radio-configuration#rail-setfixedlength-invalid) restores the frame's length back to the length specified by the default frame type configuration.|

**Returns**

- The new frame length configured into the hardware for use: 0 if in infinite mode, or [RAIL_SETFIXEDLENGTH_INVALID](radio-configuration#rail-setfixedlength-invalid) if the frame length has not yet been overridden by a valid value.

Sets the fixed-length configuration for transmit and receive. Be careful when using this function in receive and transmit as this function changes the default frame configuration and remains in force until it is called again with an input value of [RAIL_SETFIXEDLENGTH_INVALID](radio-configuration#rail-setfixedlength-invalid). This function will override any fixed or variable length settings from a radio configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_fixed_length()](radio-configuration#sl-rail-set-fixed-length). 

###### RAIL_ConfigChannels

`uint16_t RAIL_ConfigChannels(RAIL_Handle_t railHandle, const RAIL_ChannelConfig_t *config, RAIL_RadioConfigChangedCallback_t cb)`

**Description:** Configure the channels supported by this device.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ChannelConfig_t](rail-channel-config-t) *|[in]|config|A pointer to the channel configuration for your device. This pointer will be cached in the library so it must exist for the runtime of the application. Typically, this should be what is stored in Flash by the configuration tool.|
|[RAIL_RadioConfigChangedCallback_t](radio-configuration#rail-radio-config-changed-callback-t)|[in]|cb|A pointer to a function called whenever a radio configuration change occurs. May be NULL if do not need a callback.|

**Returns**

- The first available channel in the configuration, or [SL_RAIL_CHANNEL_INVALID](radio-configuration#sl-rail-channel-invalid) if an error occurs during configuration.

When configuring channels on EFR32, the radio tuner is reconfigured based on the frequency and channel spacing in the channel configuration and the first channel in the configuration is implicitly prepared as if [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel) were called.

**Note**

- config can be NULL to simply register or unregister the cb callback function when using RAIL internal protocol-specific radio configuration APIs for BLE, IEEE 802.15.4, or Z-Wave, which lack callback specification. In this use case, 0 is returned.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) which does not implicitly prepare any channel in the configuration. Use [sl_rail_get_first_channel()](radio-configuration#sl-rail-get-first-channel) and [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel) to achieve equivalent functionality.

###### RAIL_ConfigChannelsAlt

`RAIL_Status_t RAIL_ConfigChannelsAlt(RAIL_Handle_t railHandle, const RAIL_ChannelConfig_t *config, RAIL_RadioConfigChangedCallback_t cb)`

**Description:** Configure the channels supported by this device.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_ChannelConfig_t](rail-channel-config-t) *|[in]|config|A pointer to the channel configuration for your device. This pointer will be cached in the library so it must exist for the runtime of the application. Typically, this should be what is stored in Flash by the configuration tool.|
|[RAIL_RadioConfigChangedCallback_t](radio-configuration#rail-radio-config-changed-callback-t)|[in]|cb|A pointer to a function called whenever a radio configuration change occurs. May be NULL if do not need a callback.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Unlike [RAIL_ConfigChannels()](radio-configuration#rail-config-channels), this function only caches the configuration and does not prepare any channel in the configuration. That action is deferred to the next call to a RAIL API where channel is passed as a parameter, namely [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel), [RAIL_StartTx()](packet-tx#rail-start-tx), [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx), [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx), [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx), [RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx), [RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx), [RAIL_StartRx()](receive#rail-start-rx), [RAIL_ScheduleRx()](receive#rail-schedule-rx), [RAIL_StartAverageRssi()](receive#rail-start-average-rssi), [RAIL_StartTxStream()](diagnostic#rail-start-tx-stream).
- config can be NULL to simply register or unregister the cb callback function when using RAIL internal protocol-specific radio configuration APIs for BLE, IEEE 802.15.4, or Z-Wave, which lack callback specification.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels). 

###### RAIL_GetChannelMetadata

`RAIL_Status_t RAIL_GetChannelMetadata(RAIL_Handle_t railHandle, RAIL_ChannelMetadata_t *channelMetadata, uint16_t *length, uint16_t minChannel, uint16_t maxChannel)`

**Description:** Get verbose listing of channel metadata for the current channel configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ChannelMetadata_t](rail-channel-metadata-t) *|[out]|channelMetadata|A pointer to an app-allocated array that will be populated with channel metadata.|
|uint16_t *|[inout]|length|A pointer to the number of entries available in the channelMetadata array. This value will be updated to the number of channels written to the array, not to exceed the length number passed in.|
|uint16_t|[in]|minChannel|Minimum channel number about which to collect data.|
|uint16_t|[in]|maxChannel|Maximum channel number about which to collect data.|

**Returns**

- Status code indicating success of the function call. [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) means that, based on the currently active radio configuration, there are more channels to write than there is space provided in the allocated channelMetadata. However, the channel metadata that was written is valid. [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) indicates that the channel configuration has not been configured. [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) indicates complete success.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_channel_metadata()](radio-configuration#sl-rail-get-channel-metadata). 

###### RAIL_IsValidChannel

`RAIL_Status_t RAIL_IsValidChannel(RAIL_Handle_t railHandle, uint16_t channel)`

**Description:** Check whether the channel exists in the current RAIL channel configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|A channel number to check.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if channel exists or [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if the given channel does not exist.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_valid_channel()](radio-configuration#sl-rail-is-valid-channel). 

###### RAIL_PrepareChannel

`RAIL_Status_t RAIL_PrepareChannel(RAIL_Handle_t railHandle, uint16_t channel)`

**Description:** Cause radio settings associated with a particular channel to be applied to hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to prepare for use.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success or [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if the given channel does not have an associated channel configuration entry.

This function walks the current [RAIL_ChannelConfig_t::configs](rail-channel-config-t#configs) list and applies the configuration associated with the specified channel if found. This function manually changes channels without starting a TX or RX operation.

When successful, the radio is idled. When unsuccessful, the radio state will not be altered.

**Deprecated**RAIL 2.x synonym of [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel). 

###### RAIL_GetChannel

`RAIL_Status_t RAIL_GetChannel(RAIL_Handle_t railHandle, uint16_t *channel)`

**Description:** Return the most-recently requested RAIL channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t *|[out]|channel|A pointer to the channel for which RAIL was most-recently configured.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success or [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if the radio is not configured for any channel or [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if channel parameter is NULL.

This function returns the channel most recently specified in API calls that pass in a channel to tune to, namely [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel), [RAIL_StartTx()](packet-tx#rail-start-tx), [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx), [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx), [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx), [RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx), [RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx), [RAIL_StartRx()](receive#rail-start-rx), [RAIL_ScheduleRx()](receive#rail-schedule-rx), [RAIL_StartAverageRssi()](receive#rail-start-average-rssi), [RAIL_StartTxStream()](diagnostic#rail-start-tx-stream), [RAIL_StartTxStreamAlt()](diagnostic#rail-start-tx-stream-alt). It doesn't follow changes RAIL performs implicitly during channel hopping and mode switch.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_channel()](radio-configuration#sl-rail-get-channel). 

###### RAIL_GetChannelAlt

`RAIL_Status_t RAIL_GetChannelAlt(RAIL_Handle_t railHandle, uint16_t *channel)`

**Description:** Return the RAIL channel to which the radio is currently tuned.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t *|[out]|channel|A pointer to the currently-tuned channel.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success or [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if the radio is not configured for any channel or [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if channel parameter is NULL.

This function returns the channel to which the radio is currently tuned if the specified RAIL handle is active. It returns the channel to which it will be tuned during the next protocol switch if the handle is inactive. The channel returned may be different than what [RAIL_GetChannel](radio-configuration#rail-get-channel) returns when channel hopping or mode switch are involved.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tuned_channel()](radio-configuration#sl-rail-get-tuned-channel). 

###### RAIL_GetSymbolRate

`uint32_t RAIL_GetSymbolRate(RAIL_Handle_t railHandle)`

**Description:** Return the symbol rate for the current PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The symbol rate in symbols per second or 0.

The symbol rate is the rate of symbol changes over the air. For non-DSSS PHYs, this is the same as the baudrate. For DSSS PHYs, it is the baudrate divided by the length of a chipping sequence. For more information, see the modem calculator documentation. If the rate cannot be calculated, this function returns 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_symbol_rate()](radio-configuration#sl-rail-get-symbol-rate). 

###### RAIL_GetBitRate

`uint32_t RAIL_GetBitRate(RAIL_Handle_t railHandle)`

**Description:** Return the bit rate for the current PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The bit rate in bits per second or 0.

The bit rate is the effective over-the-air data rate. It does not account for extra spreading for forward error correction, and so on, but accounts for modulation schemes, DSSS, and other configurations. For more information, see the modem calculator documentation. If the rate cannot be calculated, this function returns 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_bit_rate()](radio-configuration#sl-rail-get-bit-rate). 

###### RAIL_SetPaCTune

`RAIL_Status_t RAIL_SetPaCTune(RAIL_Handle_t railHandle, uint8_t txPaCtuneValue, uint8_t rxPaCtuneValue)`

**Description:** Set the PA capacitor tune value for transmit and receive.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|txPaCtuneValue|PA Ctune value for TX mode.|
|uint8_t|[in]|rxPaCtuneValue|PA Ctune value for RX mode.|

**Returns**

- Status code indicating success of the function call.

Tunes the impedance of the transmit and receive modes by changing the amount of capacitance at the PA output. Changes made to the TX Power configuration, e.g., calling [RAIL_ConfigTxPower](pa#rail-config-tx-power), will undo changes made to PA capacitor tune value for transmit and receive via [RAIL_SetPaCTune](radio-configuration#rail-set-pa-c-tune).

**Note**

- This function does nothing on EFR32 Series 2 devices.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3; it only applied to devices no longer supported. 

###### RAIL_GetSyncWords

`RAIL_Status_t RAIL_GetSyncWords(RAIL_Handle_t railHandle, RAIL_SyncWordConfig_t *syncWordConfig)`

**Description:** Get the sync words and their length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_SyncWordConfig_t](rail-sync-word-config-t) *|[out]|syncWordConfig|An application-provided non-NULL pointer to store [RAIL_SyncWordConfig_t](rail-sync-word-config-t) sync word information.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_sync_words()](radio-configuration#sl-rail-get-sync-words). 

###### RAIL_ConfigSyncWords

`RAIL_Status_t RAIL_ConfigSyncWords(RAIL_Handle_t railHandle, const RAIL_SyncWordConfig_t *syncWordConfig)`

**Description:** Set the selected sync words and their length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_SyncWordConfig_t](rail-sync-word-config-t) *|[in]|syncWordConfig|A non-NULL pointer to [RAIL_SyncWordConfig_t](rail-sync-word-config-t) specifying the sync words and their length. The desired length should be between 2 and 32 bits inclusive, however it is recommended to not change the length below what the PHY sync word length is configured to be. Changing the sync word length, especially to that which is lower than the default length, may result in a decrease in packet reception rate or may not work at all. Other values will result in [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter). The default sync word continues to be valid.|

**Returns**

- Status code indicating success of the function call.

When the custom sync word(s) applied by this API are no longer needed, or to revert to default sync word, calling [RAIL_ConfigChannels()](radio-configuration#rail-config-channels) will re-establish the sync words specified in the radio configuration.

This function will return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if called when BLE has been enabled for this railHandle. When changing sync words in BLE mode, use [RAIL_BLE_ConfigChannelRadioParams()](ble#rail-ble-config-channel-radio-params) instead.

**Note**

- If multiple protocols share the same radio configuration, the user should not set custom sync words in any of those protocols as these sync words could leak into the other protocol sharing the same radio configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_sync_words()](radio-configuration#sl-rail-config-sync-words). 

###### RAIL_GetWhiteningInitVal

`uint16_t RAIL_GetWhiteningInitVal(RAIL_Handle_t railHandle)`

**Description:** Sets the whitening initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The whitening initialization value currently being used.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_whitening_init_val()](radio-configuration#sl-rail-get-whitening-init-val). 

###### RAIL_GetCrcInitVal

`uint32_t RAIL_GetCrcInitVal(RAIL_Handle_t railHandle)`

**Description:** Returns the CRC initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The CRC initialization value currently being used.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_crc_init_val()](radio-configuration#sl-rail-get-crc-init-val). 

###### RAIL_SetWhiteningInitVal

`RAIL_Status_t RAIL_SetWhiteningInitVal(RAIL_Handle_t railHandle, uint16_t whiteInit)`

**Description:** Sets the whitening initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|whiteInit|A whitening initialization value.|

**Returns**

- Status code indicating success of the function call.

Use this function to override the whitening initialization value defined by the current PHY's radio configuration. The new value will persist until this function is called again, [RAIL_ResetWhiteningInitVal()](radio-configuration#rail-reset-whitening-init-val) is called, or the PHY is changed.

**Note**

- Overriding a PHY's whitening initialization value will break communication with peers unless they effect a similar change.

**Warnings**

- This API must not be used when either 802.15.4 or BLE modes are enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_whitening_init_val()](radio-configuration#sl-rail-set-whitening-init-val). 

###### RAIL_SetCrcInitVal

`RAIL_Status_t RAIL_SetCrcInitVal(RAIL_Handle_t railHandle, uint32_t crcInit)`

**Description:** Sets the CRC initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint32_t|[in]|crcInit|A CRC initialization value.|

**Returns**

- Status code indicating success of the function call.

Use this function to override the CRC initialization value defined by the current PHY's radio configuration. The new value will persist until this function is called again, [RAIL_ResetCrcInitVal()](radio-configuration#rail-reset-crc-init-val) is called, or the PHY is changed.

**Note**

- Overriding a PHY's CRC initialization value will break communication with peers unless they effect a similar change.

**Warnings**

- This API must not be used when either 802.15.4 or BLE modes are enabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_crc_init_val()](radio-configuration#sl-rail-set-crc-init-val). 

###### RAIL_ResetWhiteningInitVal

`RAIL_Status_t RAIL_ResetWhiteningInitVal(RAIL_Handle_t railHandle)`

**Description:** Restores the whitening initialization value to its initial setting from the Radio Configurator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Can use this function after using [RAIL_SetWhiteningInitVal()](radio-configuration#rail-set-whitening-init-val).

**Deprecated**RAIL 2.x synonym of [sl_rail_reset_whitening_init_val()](radio-configuration#sl-rail-reset-whitening-init-val). 

###### RAIL_ResetCrcInitVal

`RAIL_Status_t RAIL_ResetCrcInitVal(RAIL_Handle_t railHandle)`

**Description:** Restores the CRC initialization value to its initial setting from the Radio Configurator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Can use this function after using [RAIL_SetCrcInitVal()](radio-configuration#rail-set-crc-init-val).

**Deprecated**RAIL 2.x synonym of [sl_rail_reset_crc_init_val()](radio-configuration#sl-rail-reset-crc-init-val). 

###### sl_rail_get_first_channel

`uint16_t sl_rail_get_first_channel(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_config)`

**Description:** Returns the first channel in the given configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_channel_config_t](sl-rail-channel-config-t) *|[in]|p_config|A pointer to the channel configuration to use. If NULL, the protocol's currently-configured channel configuration is used.|

**Returns**

- Returns the first available channel in the configuration.

###### sl_rail_set_fixed_length

`uint16_t sl_rail_set_fixed_length(sl_rail_handle_t rail_handle, uint16_t bytes)`

**Description:** Modify the currently configured fixed frame length in bytes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|bytes|The expected fixed frame length in bytes. A value of 0 is infinite. A value of [SL_RAIL_SET_FIXED_LENGTH_INVALID](radio-configuration#sl-rail-set-fixed-length-invalid) restores the frame's length back to that specified by the default frame type configuration.|

**Returns**

- The new frame length in bytes configured into the hardware for use: 0 if in infinite mode, or [SL_RAIL_SET_FIXED_LENGTH_INVALID](radio-configuration#sl-rail-set-fixed-length-invalid) if the frame length has not yet been overridden by a valid value.

Sets the fixed-length configuration for transmit and receive. Be careful when using this function in receive and transmit as this function changes the default frame configuration and remains in force until it is called again with an input value of [SL_RAIL_SET_FIXED_LENGTH_INVALID](radio-configuration#sl-rail-set-fixed-length-invalid). This function will override any fixed or variable length settings from a radio configuration. 

###### sl_rail_config_channels

`sl_rail_status_t sl_rail_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_config, sl_rail_radio_config_changed_callback_t config_changed_callback)`

**Description:** Configure the channels supported by this device.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_channel_config_t](sl-rail-channel-config-t) *|[in]|p_config|A pointer to the channel configuration for your device. This pointer will be cached in the library so it must exist for the runtime of the application. Typically, this should be what is stored in Flash by the configuration tool.|
|[sl_rail_radio_config_changed_callback_t](radio-configuration#sl-rail-radio-config-changed-callback-t)|[in]|config_changed_callback|A pointer to a function called whenever a radio configuration change occurs. May be NULL if do not need a callback.|

**Returns**

- Status code indicating success of the function call.

**Note**

- Unlike RAIL 2.x [RAIL_ConfigChannels()](radio-configuration#rail-config-channels), this function only caches the configuration and does not prepare any channel in the configuration. That action is deferred to the next call to a RAIL API where channel is passed as a parameter, namely [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel), [sl_rail_start_tx()](packet-tx#sl-rail-start-tx), [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx), [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx), [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx), [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx), [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx), [sl_rail_start_rx()](receive#sl-rail-start-rx), [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx), [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi), [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream).
- config can be NULL to simply register or unregister the cb callback function when using RAIL internal protocol-specific radio configuration APIs for BLE, IEEE 802.15.4, or Z-Wave, which lack callback specification.

###### sl_rail_get_channel_metadata

`sl_rail_status_t sl_rail_get_channel_metadata(sl_rail_handle_t rail_handle, sl_rail_channel_metadata_t *p_channel_metadata, uint16_t *p_number_of_entries, uint16_t min_channel, uint16_t max_channel)`

**Description:** Get verbose listing of channel metadata for the current channel configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_channel_metadata_t](sl-rail-channel-metadata-t) *|[out]|p_channel_metadata|A pointer to an app-allocated array that will be populated with channel metadata.|
|uint16_t *|[inout]|p_number_of_entries|A pointer to the number of entries available in the p_channel_metadata array. This value will be updated to the number of channels written to the array, not to exceed the length number passed in.|
|uint16_t|[in]|min_channel|Minimum channel number about which to collect data.|
|uint16_t|[in]|max_channel|Maximum channel number about which to collect data.|

**Returns**

- Status code indicating success of the function call. [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) means that, based on the currently active radio configuration, there are more channels to write than there is space provided in the allocated p_channel_metadata. However, the channel metadata that was written is valid. [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) indicates that the channel configuration has not been configured. [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) indicates complete success.

###### sl_rail_is_valid_channel

`sl_rail_status_t sl_rail_is_valid_channel(sl_rail_handle_t rail_handle, uint16_t channel)`

**Description:** Check whether the channel exists in the current RAIL channel configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|A channel number to check.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if channel exists or [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if the given channel does not exist.

###### sl_rail_prepare_channel

`sl_rail_status_t sl_rail_prepare_channel(sl_rail_handle_t rail_handle, uint16_t channel)`

**Description:** Cause radio settings associated with a particular channel to be applied to hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to prepare for use.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success or [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if the given channel does not have an associated channel configuration entry.

This function walks the current [sl_rail_channel_config_t::p_entries](sl-rail-channel-config-t#p-entries) list and applies the configuration associated with the specified channel if found. This function manually changes channels without starting a TX or RX operation.

When successful, the radio is idled. When unsuccessful, the radio state will not be altered. 

###### sl_rail_get_channel

`sl_rail_status_t sl_rail_get_channel(sl_rail_handle_t rail_handle, uint16_t *p_channel)`

**Description:** Return the most-recently requested RAIL channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t *|[out]|p_channel|A pointer to the channel for which RAIL was most-recently configured.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success or [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if the radio is not configured for any channel or [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if p_channel is NULL.

This function returns the channel most recently specified in API calls that pass in a channel to tune to, namely [sl_rail_prepare_channel()](radio-configuration#sl-rail-prepare-channel), [sl_rail_start_tx()](packet-tx#sl-rail-start-tx), [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx), [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx), [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx), [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx), [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx), [sl_rail_start_rx()](receive#sl-rail-start-rx), [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx), [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi), [sl_rail_start_tx_stream()](diagnostic#sl-rail-start-tx-stream). It doesn't follow changes RAIL performs implicitly during channel hopping and mode switch. 

###### sl_rail_get_tuned_channel

`sl_rail_status_t sl_rail_get_tuned_channel(sl_rail_handle_t rail_handle, uint16_t *p_channel)`

**Description:** Return the RAIL channel to which the radio is currently tuned.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t *|[out]|p_channel|A pointer to the currently-tuned channel.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success or [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if the radio is not configured for any channel or [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if p_channel is NULL.

This function returns the channel to which the radio is currently tuned if the specified RAIL handle is active. It returns the channel to which it will be tuned during the next protocol switch if the handle is inactive. The channel returned may be different than what [sl_rail_get_channel()](radio-configuration#sl-rail-get-channel) returns when channel hopping or mode switch are involved. 

###### sl_rail_get_symbol_rate

`uint32_t sl_rail_get_symbol_rate(sl_rail_handle_t rail_handle)`

**Description:** Return the symbol rate for the current PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The symbol rate in symbols per second or 0.

The symbol rate is the rate of symbol changes over the air. For non-DSSS PHYs, this is the same as the baudrate. For DSSS PHYs, it is the baudrate divided by the length of a chipping sequence. For more information, see the modem calculator documentation. If the rate cannot be calculated, this function returns 0. 

###### sl_rail_get_bit_rate

`uint32_t sl_rail_get_bit_rate(sl_rail_handle_t rail_handle)`

**Description:** Return the bit rate for the current PHY.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The bit rate in bits per second or 0.

The bit rate is the effective over-the-air data rate. It does not account for extra spreading for forward error correction, and so on, but accounts for modulation schemes, DSSS, and other configurations. For more information, see the modem calculator documentation. If the rate cannot be calculated, this function returns 0. 

###### sl_rail_get_sync_words

`sl_rail_status_t sl_rail_get_sync_words(sl_rail_handle_t rail_handle, sl_rail_sync_word_config_t *p_sync_word_config)`

**Description:** Get the sync words and their length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_sync_word_config_t](sl-rail-sync-word-config-t) *|[out]|p_sync_word_config|An application-provided non-NULL pointer to store [sl_rail_sync_word_config_t](sl-rail-sync-word-config-t) sync word information.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_config_sync_words

`sl_rail_status_t sl_rail_config_sync_words(sl_rail_handle_t rail_handle, const sl_rail_sync_word_config_t *p_sync_word_config)`

**Description:** Set the selected sync words and their length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_sync_word_config_t](sl-rail-sync-word-config-t) *|[in]|p_sync_word_config|A non-NULL pointer to [sl_rail_sync_word_config_t](sl-rail-sync-word-config-t) specifying the sync words and their length. The desired length should be between 2 and 32 bits inclusive, however it is recommended to not change the length below what the PHY sync word length is configured to be. Changing the sync word length, especially to that which is lower than the default length, may result in a decrease in packet reception rate or may not work at all. Other values will result in [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter). The default sync word continues to be valid.|

**Returns**

- Status code indicating success of the function call.

When the custom sync word(s) applied by this API are no longer needed, or to revert to default sync word, calling [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) will re-establish the sync words specified in the radio configuration.

This function will return [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if called when BLE has been enabled for this rail_handle. When changing sync words in BLE mode, use [sl_rail_ble_config_channel_radio_params()](ble#sl-rail-ble-config-channel-radio-params) instead.

**Note**

- If multiple protocols share the same radio configuration, the user should not set custom sync words in any of those protocols as these sync words could leak into the other protocol sharing the same radio configuration.

###### sl_rail_get_whitening_init_val

`uint16_t sl_rail_get_whitening_init_val(sl_rail_handle_t rail_handle)`

**Description:** Sets the whitening initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The whitening initialization value currently being used.

###### sl_rail_get_crc_init_val

`uint32_t sl_rail_get_crc_init_val(sl_rail_handle_t rail_handle)`

**Description:** Returns the CRC initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The CRC initialization value currently being used.

###### sl_rail_set_whitening_init_val

`sl_rail_status_t sl_rail_set_whitening_init_val(sl_rail_handle_t rail_handle, uint16_t white_init)`

**Description:** Sets the whitening initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|white_init|A whitening initialization value.|

**Returns**

- Status code indicating success of the function call.

Use this function to override the whitening initialization value defined by the current PHY's radio configuration. The new value will persist until this function is called again, [sl_rail_reset_whitening_init_val()](radio-configuration#sl-rail-reset-whitening-init-val) is called, or the PHY is changed.

**Note**

- Overriding a PHY's whitening initialization value will break communication with peers unless they effect a similar change.

**Warnings**

- This API must not be used when either 802.15.4 or BLE modes are enabled.

###### sl_rail_set_crc_init_val

`sl_rail_status_t sl_rail_set_crc_init_val(sl_rail_handle_t rail_handle, uint32_t crc_init)`

**Description:** Sets the CRC initialization value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint32_t|[in]|crc_init|A CRC initialization value.|

**Returns**

- Status code indicating success of the function call.

Use this function to override the CRC initialization value defined by the current PHY's radio configuration. The new value will persist until this function is called again, [sl_rail_reset_crc_init_val()](radio-configuration#sl-rail-reset-crc-init-val) is called, or the PHY is changed.

**Note**

- Overriding a PHY's CRC initialization value will break communication with peers unless they effect a similar change.

**Warnings**

- This API must not be used when either 802.15.4 or BLE modes are enabled.

###### sl_rail_reset_whitening_init_val

`sl_rail_status_t sl_rail_reset_whitening_init_val(sl_rail_handle_t rail_handle)`

**Description:** Restores the whitening initialization value to its initial setting from the Radio Configurator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Can use this function after using [sl_rail_set_whitening_init_val()](radio-configuration#sl-rail-set-whitening-init-val). 

###### sl_rail_reset_crc_init_val

`sl_rail_status_t sl_rail_reset_crc_init_val(sl_rail_handle_t rail_handle)`

**Description:** Restores the CRC initialization value to its initial setting from the Radio Configurator.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Can use this function after using [sl_rail_set_crc_init_val()](radio-configuration#sl-rail-set-crc-init-val). 

##### Macros

`#define RAIL_SETFIXEDLENGTH_INVALID (0xFFFFU)`

**Description**: An invalid return value when calling [RAIL_SetFixedLength()](radio-configuration#rail-set-fixed-length).

`#define RADIO_CONFIG_ENABLE_CONC_PHY 1`

**Description**: Indicates this version of RAIL supports concurrent PHY information in radio configurator output.

`#define RADIO_CONFIG_ENABLE_STACK_INFO `

**Description**: Indicates this version of RAIL supports stack info feature in radio configurator output.

`#define SL_RAIL_SET_FIXED_LENGTH_INVALID (0xFFFFU)`

**Description**: An invalid return value when calling [sl_rail_set_fixed_length()](radio-configuration#sl-rail-set-fixed-length).

`#define SL_RAIL_RADIO_CONFIG_ENABLE_CONC_PHY 1`

**Description**: Indicates this version of RAIL supports concurrent PHY information in radio configurator output.

`#define SL_RAIL_RADIO_CONFIG_ENABLE_STACK_INFO `

**Description**: Indicates this version of RAIL supports stack info feature in radio configurator output.

`#define SL_RAIL_CHANNEL_INVALID (0xFFFFU)`

**Description**: A value representing an invalid channel, used for APIs that return or output a channel when none can be identified.

Configures if there is a frame type in your frame and the lengths of each frame. 

The number of bits set in the mask determines the number of elements in frameLen. A maximum of 8 different frame types may be specified.

**Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t](sl-rail-frame-type-t). 

###### Public Attributes

###### frameLen (heading level 7)

```
uint16_t* RAIL_FrameType_t::frameLen
```

**Description:** A pointer to an array of frame byte lengths for each frame type.

**Details:** The number of elements in this array should be equal to the number of frame types. The memory to which frameLen points should not change location or be modified.

**Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t::p_frame_byte_lengths](sl-rail-frame-type-t#p-frame-byte-lengths).

###### offset (heading level 7)

```
uint8_t RAIL_FrameType_t::offset
```

**Description:** Zero-indexed byte offset location of the byte containing the frame type field.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t::offset_bytes](sl-rail-frame-type-t#offset-bytes).

###### mask (heading level 7)

```
uint8_t RAIL_FrameType_t::mask
```

**Description:** A bitmask of the frame type field, which determines a number of frames expected based on the number of bits set.

**Details:** No more than 3 bits can be set in the mask and they must be contiguous ones. For example, if the highest three bits of the byte specified by offset constitute the frame type, then mask should be 0xE0, which has 3 bits set, indicating 8 possible frame types.

**Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t::mask](sl-rail-frame-type-t#mask).

###### isValid (heading level 7)

```
uint8_t RAIL_FrameType_t::isValid
```

**Description:** A bitmask that marks if each frame is valid or should be filtered.

**Details:** Frame type 0 corresponds to the lowest bit in isValid. If the frame is filtered, a [RAIL_EVENT_RX_PACKET_ABORTED](events#rail-event-rx-packet-aborted) will be raised.

**Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t::is_valid](sl-rail-frame-type-t#is-valid).

###### addressFilter (heading level 7)

```
uint8_t RAIL_FrameType_t::addressFilter
```

**Description:** A bitmask that marks if each frame should have the address filter applied.

**Details:** Frame type 0 corresponds to the least significant bit in addressFilter.

**Deprecated**RAIL 2.x synonym of [sl_rail_frame_type_t::address_filter_mask](sl-rail-frame-type-t#address-filter-mask).

Alternate PHY configuration entry structure, which gathers some info on the alternate PHY in the context of concurrent mode. 

**Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t](sl-rail-alternate-phy-t). 

###### Public Attributes

###### baseFrequency (heading level 7)

```
uint32_t RAIL_AlternatePhy_t::baseFrequency
```

**Description:** A base frequency in Hz of this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::base_frequency_hz](sl-rail-alternate-phy-t#base-frequency-hz).

###### channelSpacing (heading level 7)

```
uint32_t RAIL_AlternatePhy_t::channelSpacing
```

**Description:** A channel spacing in Hz of this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::channel_spacing_hz](sl-rail-alternate-phy-t#channel-spacing-hz).

###### numberOfChannels (heading level 7)

```
uint16_t RAIL_AlternatePhy_t::numberOfChannels
```

**Description:** The number of channels (and not the channel number !)

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::number_of_channels](sl-rail-alternate-phy-t#number-of-channels).

###### minIf_kHz (heading level 7)

```
uint16_t RAIL_AlternatePhy_t::minIf_kHz
```

**Description:** minimum IF for the alternate PHY in kHz.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::min_if_khz](sl-rail-alternate-phy-t#min-if-khz).

###### minBaseIf_kHz (heading level 7)

```
uint16_t RAIL_AlternatePhy_t::minBaseIf_kHz
```

**Description:** minimum IF for the base PHY in kHz.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::min_base_if_khz](sl-rail-alternate-phy-t#min-base-if-khz).

###### isOfdmModem (heading level 7)

```
bool RAIL_AlternatePhy_t::isOfdmModem
```

**Description:** Indicates that OFDM modem is used by this alternate PHY.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::is_ofdm_modem](sl-rail-alternate-phy-t#is-ofdm-modem).

###### rateInfo (heading level 7)

```
uint32_t RAIL_AlternatePhy_t::rateInfo
```

**Description:** Rate info of the alternate PHY.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::rate_info](sl-rail-alternate-phy-t#rate-info).

###### hwModemAgcCtrl1 (heading level 7)

```
uint32_t RAIL_AlternatePhy_t::hwModemAgcCtrl1
```

**Description:** Used to adjust the AGC for CCA between hard and soft modems.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_alternate_phy_t::hw_modem_agc_ctrl1](sl-rail-alternate-phy-t#hw-modem-agc-ctrl1).

A channel configuration entry structure, which defines a channel range and parameters across which a corresponding radio configuration is valid. 

operating frequency hz = baseFrequency

- channelSpacing * (channel - physicalChannelOffset);

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t). 

###### Public Attributes

###### phyConfigDeltaAdd (heading level 7)

```
RAIL_RadioConfig_t RAIL_ChannelConfigEntry_t::phyConfigDeltaAdd
```

**Description:** The minimum radio configuration to apply to the base configuration for this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::phy_config_delta_add](sl-rail-channel-config-entry-t#phy-config-delta-add).

###### baseFrequency (heading level 7)

```
uint32_t RAIL_ChannelConfigEntry_t::baseFrequency
```

**Description:** A base frequency in Hz of this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::base_frequency_hz](sl-rail-channel-config-entry-t#base-frequency-hz).

###### channelSpacing (heading level 7)

```
uint32_t RAIL_ChannelConfigEntry_t::channelSpacing
```

**Description:** A channel spacing in Hz of this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_spacing_hz](sl-rail-channel-config-entry-t#channel-spacing-hz).

###### physicalChannelOffset (heading level 7)

```
uint16_t RAIL_ChannelConfigEntry_t::physicalChannelOffset
```

**Description:** The offset to subtract from the logical channel to align them with the zero based physical channels which are relative to baseFrequency.

**Details:** (i.e., By default ch 0 = base freq, but if offset = 11, ch 11 = base freq.)

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::physical_channel_offset](sl-rail-channel-config-entry-t#physical-channel-offset).

###### channelNumberStart (heading level 7)

```
uint16_t RAIL_ChannelConfigEntry_t::channelNumberStart
```

**Description:** The first valid RAIL channel number for this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_number_start](sl-rail-channel-config-entry-t#channel-number-start).

###### channelNumberEnd (heading level 7)

```
uint16_t RAIL_ChannelConfigEntry_t::channelNumberEnd
```

**Description:** The last valid RAIL channel number for this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::channel_number_end](sl-rail-channel-config-entry-t#channel-number-end).

###### maxPower (heading level 7)

```
RAIL_TxPower_t RAIL_ChannelConfigEntry_t::maxPower
```

**Description:** The maximum power allowed in this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::max_power_ddbm](sl-rail-channel-config-entry-t#max-power-ddbm).

###### attr (heading level 7)

```
RAIL_ChannelConfigEntryAttr_t* RAIL_ChannelConfigEntry_t::attr
```

**Description:** A pointer to a structure containing attributes specific to this channel set.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_attr](sl-rail-channel-config-entry-t#p-attr).

###### entryType (heading level 7)

```
RAIL_ChannelConfigEntryType_t RAIL_ChannelConfigEntry_t::entryType
```

**Description:** Indicates channel config type.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::entry_type](sl-rail-channel-config-entry-t#entry-type).

###### reserved (heading level 7)

```
uint8_t RAIL_ChannelConfigEntry_t::reserved[3]
```

**Description:** to align to 32-bit boundary.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::reserved](sl-rail-channel-config-entry-t#reserved).

###### stackInfo (heading level 7)

```
const uint8_t* RAIL_ChannelConfigEntry_t::stackInfo
```

**Description:** Array containing information according to the [RAIL_PtiProtocol_t](pti#rail-pti-protocol-t) in the first byte of this array.

**Details:** The first 2 fields are common to all protocols and accessible by RAIL, others are ignored by RAIL and only used by the application. Common fields are listed in [RAIL_StackInfoCommon_t](rail-stack-info-common-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_stack_info](sl-rail-channel-config-entry-t#p-stack-info).

###### alternatePhy (heading level 7)

```
RAIL_AlternatePhy_t* RAIL_ChannelConfigEntry_t::alternatePhy
```

**Description:** Pointer to alternate PHY.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_t::p_alternate_phy](sl-rail-channel-config-entry-t#p-alternate-phy).

A channel configuration structure, which defines the channel meaning when a channel number is passed into a RAIL function, e.g., [RAIL_StartTx()](packet-tx#rail-start-tx) and [RAIL_StartRx()](receive#rail-start-rx). 

A [RAIL_ChannelConfig_t](rail-channel-config-t) structure defines the channel scheme that an application uses when registered in [RAIL_ConfigChannels()](radio-configuration#rail-config-channels).

These are a few examples of different channel configurations: 

```c
// 21 channels starting at 2.45 GHz with channel spacing of 1 MHz
// ... generated by Simplicity Studio (i.e., rail_config.c) ...
const uint32_t generated[] = { ... };
RAIL_ChannelConfigEntryAttr_t generated_entryAttr = { ... };
const RAIL_ChannelConfigEntry_t generated_channels[] = {
  {
    .phyConfigDeltaAdd = NULL, // Add this to default configuration for this entry
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated_entryAttr,
  },
};
const RAIL_ChannelConfig_t generated_channelConfig = {
  .phyConfigBase = generated, // Default radio configuration for all entries
  .phyConfigDeltaSubtract = NULL, // Subtract this to restore the default configuration
  .configs = generated_channels,
  .length = 1, // There are this many channel configuration entries
};
const RAIL_ChannelConfig_t *channelConfigs[] = {
  &generated_channelConfig,
  NULL,
};
// ... in main code ...
// Associate a specific channel configuration with a particular RAIL instance.
RAIL_ConfigChannels(railHandle, channelConfigs[0]);

// 4 nonlinear channels
// ... in rail_config.c ...
const uint32_t generated[] = { ... };
RAIL_ChannelConfigEntryAttr_t generated_entryAttr = { ... };
const RAIL_ChannelConfigEntry_t generated_channels[] = {
  {
    .phyConfigDeltaAdd = NULL, // Add this to default configuration for this entry
    .baseFrequency = 910123456,
    .channelSpacing = 0,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 0,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated_entryAttr,
  },
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 911654789,
    .channelSpacing = 0,
    .physicalChannelOffset = 0, // Since ch spacing = 0, offset can be 0
    .channelNumberStart = 1,
    .channelNumberEnd = 1,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated_entryAttr,
  },
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 912321456,
    .channelSpacing = 100000,
    .physicalChannelOffset = 2, // Since ch spacing != 0, offset = 2
    .channelNumberStart = 2, // ch 2 = baseFrequency
    .channelNumberEnd = 2,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated_entryAttr,
  },
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 913147852,
    .channelSpacing = 0,
    .physicalChannelOffset = 0,
    .channelNumberStart = 3,
    .channelNumberEnd = 3,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated_entryAttr,
  },
};
const RAIL_ChannelConfig_t generated_channelConfig = {
  .phyConfigBase = generated, // Default radio configuration for all entries
  .phyConfigDeltaSubtract = NULL, // Subtract this to restore the default configuration
  .configs = generated_channels,
  .length = 4, // There are this many channel configuration entries
};
const RAIL_ChannelConfig_t *channelConfigs[] = {
  &generated_channelConfig,
  NULL,
};
// ... in main code ...
// Associate a specific channel configuration with a particular RAIL instance.
RAIL_ConfigChannels(railHandle, channelConfigs[0]);

// Multiple radio configurations
// ... in rail_config.c ...
const uint32_t generated0[] = { ... };
RAIL_ChannelConfigEntryAttr_t generated0_entryAttr = { ... };
const RAIL_ChannelConfigEntry_t generated0_channels[] = {
  {
    .phyConfigDeltaAdd = NULL, // Add this to the default configuration for this entry
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated0_entryAttr,
  },
};
const RAIL_ChannelConfig_t generated0_channelConfig = {
  .phyConfigBase = generated0, // Default radio configuration for all entries
  .phyConfigDeltaSubtract = NULL, // Subtract this to restore default configuration
  .configs = generated0_channels,
  .length = 1, // There are this many channel configuration entries
};
const uint32_t generated1[] = { ... };
RAIL_ChannelConfigEntryAttr_t generated1_entryAttr = { ... };
const RAIL_ChannelConfigEntry_t generated1_channels[] = {
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = -100, // Use this entry when TX power <= -10dBm
    .attr = &generated1_entryAttr,
  },
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = 15, // Use this entry when TX power > -10dBm
                    // and TX power <= 1.5dBm
    .attr = &generated1_entryAttr,
  },
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = RAIL_TX_POWER_MAX, // Use this entry when TX power > 1.5dBm
    .attr = &generated1_entryAttr,
  },
};
const RAIL_ChannelConfig_t generated1_channelConfig = {
  .phyConfigBase = generated1,
  .phyConfigDeltaSubtract = NULL,
  .configs = generated1_channels,
  .length = 3,
};
const uint32_t generated2[] = { ... };
RAIL_ChannelConfigEntryAttr_t generated2_entryAttr = { ... };
const RAIL_ChannelConfigEntry_t generated2_channels[] = {
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 2450000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &generated2_entryAttr,
  },
};
const RAIL_ChannelConfig_t generated2_channelConfig = {
  .phyConfigBase = generated2,
  .phyConfigDeltaSubtract = NULL,
  .configs = generated2_channels,
  .length = 1,
};
const RAIL_ChannelConfig_t *channelConfigs[] = {
  &generated0_channelConfig,
  &generated1_channelConfig,
  &generated2_channelConfig,
  NULL,
};
// ... in main code ...
// Create a unique RAIL handle for each unique channel configuration.
railHandle0 = RAIL_Init(&railCfg0, &RAILCb_RfReady0);
railHandle1 = RAIL_Init(&railCfg1, &RAILCb_RfReady1);
railHandle2 = RAIL_Init(&railCfg2, &RAILCb_RfReady2);
// Associate each channel configuration with its corresponding RAIL handle.
RAIL_ConfigChannels(railHandle0, channelConfigs[0]);
RAIL_ConfigChannels(railHandle1, channelConfigs[1]);
RAIL_ConfigChannels(railHandle2, channelConfigs[2]);
// Use a RAIL handle and channel to access the desired channel configuration entry.
RAIL_SetTxPowerDbm(railHandle1, 100); // set 10.0 dBm TX power
RAIL_StartRx(railHandle1, 0, &schedInfo); // RX using generated1_channels[2]
RAIL_SetTxPowerDbm(railHandle1, 0); // set 0 dBm TX power
RAIL_StartRx(railHandle1, 0, &schedInfo); // RX using generated1_channels[1]
RAIL_StartRx(railHandle2, 0, &schedInfo); // RX using generated2_channels[0]

```

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t](sl-rail-channel-config-t). 

###### Public Attributes

###### phyConfigBase (heading level 7)

```
RAIL_RadioConfig_t RAIL_ChannelConfig_t::phyConfigBase
```

**Description:** Base radio configuration for the corresponding channel configuration entries.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::phy_config_base](sl-rail-channel-config-t#phy-config-base).

###### phyConfigDeltaSubtract (heading level 7)

```
RAIL_RadioConfig_t RAIL_ChannelConfig_t::phyConfigDeltaSubtract
```

**Description:** Minimum radio configuration to restore channel entries back to base configuration.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::phy_config_delta_subtract](sl-rail-channel-config-t#phy-config-delta-subtract).

###### configs (heading level 7)

```
const RAIL_ChannelConfigEntry_t* RAIL_ChannelConfig_t::configs
```

**Description:** Pointer to an array of [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) entries.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::p_entries](sl-rail-channel-config-t#p-entries).

###### length (heading level 7)

```
uint32_t RAIL_ChannelConfig_t::length
```

**Description:** Number of [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) entries.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::number_of_entries](sl-rail-channel-config-t#number-of-entries).

###### signature (heading level 7)

```
uint32_t RAIL_ChannelConfig_t::signature
```

**Description:** Signature for this structure.

**Details:** Only used on modules.

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::signature](sl-rail-channel-config-t#signature).

###### xtalFrequencyHz (heading level 7)

```
uint32_t RAIL_ChannelConfig_t::xtalFrequencyHz
```

**Description:** Crystal Frequency for the channel config.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_t::xtal_frequency_hz](sl-rail-channel-config-t#xtal-frequency-hz).

Container for individual channel metadata. 

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_metadata_t](sl-rail-channel-metadata-t). 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t RAIL_ChannelMetadata_t::channel
```

**Description:** Channel number.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_metadata_t::channel](sl-rail-channel-metadata-t#channel).

###### reserved (heading level 7)

```
uint16_t RAIL_ChannelMetadata_t::reserved
```

**Description:** Word alignment.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_metadata_t::reserved](sl-rail-channel-metadata-t#reserved).

###### frequency (heading level 7)

```
uint32_t RAIL_ChannelMetadata_t::frequency
```

**Description:** Channel frequency, in Hz.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_channel_metadata_t::frequency_hz](sl-rail-channel-metadata-t#frequency-hz).

Stack info fields common to all protocols. 

**Deprecated**RAIL 2.x synonym of [sl_rail_stack_info_common_t](sl-rail-stack-info-common-t). 

###### Public Attributes

###### protocolId (heading level 7)

```
uint8_t RAIL_StackInfoCommon_t::protocolId
```

**Description:** Same as [RAIL_PtiProtocol_t](pti#rail-pti-protocol-t).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_stack_info_common_t::protocol_id](sl-rail-stack-info-common-t#protocol-id).

###### phyId (heading level 7)

```
uint8_t RAIL_StackInfoCommon_t::phyId
```

**Description:** PHY Id depending on the protocolId value.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_stack_info_common_t::phy_id](sl-rail-stack-info-common-t#phy-id).

Configures if there is a frame type in your frame and the lengths of each frame. 

The number of bits set in the mask determines the number of elements in p_frame_byte_lengths. A maximum of 8 different frame types may be specified.

This structure is provided for the radio calculator. 

###### Public Attributes

###### p_frame_byte_lengths (heading level 7)

```
uint16_t* sl_rail_frame_type_t::p_frame_byte_lengths
```

**Description:** A pointer to an array of frame byte lengths for each frame type.

**Details:** The number of elements in this array should be equal to the number of frame types. The memory to which p_frame_byte_lengths points should not change location or be modified.

###### offset_bytes (heading level 7)

```
uint8_t sl_rail_frame_type_t::offset_bytes
```

**Description:** Zero-indexed byte offset location of the byte containing the frame type field.

###### mask (heading level 7)

```
uint8_t sl_rail_frame_type_t::mask
```

**Description:** A bitmask of the frame type field, which determines a number of frames expected based on the number of bits set.

**Details:** No more than 3 bits can be set in the mask and they must be contiguous ones. For example, if the highest three bits of the byte specified by offset constitute the frame type, then mask should be 0xE0, which has 3 bits set, indicating 8 possible frame types.

###### is_valid (heading level 7)

```
uint8_t sl_rail_frame_type_t::is_valid
```

**Description:** A bitmask that marks if each frame is valid or should be filtered.

**Details:** Frame type 0 corresponds to the lowest bit in isValid. If the frame is filtered, a [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted) will be raised.

###### address_filter_mask (heading level 7)

```
uint8_t sl_rail_frame_type_t::address_filter_mask
```

**Description:** A bitmask that marks if each frame should have the address filter applied.

**Details:** Frame type 0 corresponds to the least significant bit in address_filter.

Alternate PHY configuration entry structure, which gathers some info on the alternate PHY in the context of concurrent mode. 

###### Public Attributes

###### base_frequency_hz (heading level 7)

```
uint32_t sl_rail_alternate_phy_t::base_frequency_hz
```

**Description:** A base frequency in Hz of this channel set.

###### channel_spacing_hz (heading level 7)

```
uint32_t sl_rail_alternate_phy_t::channel_spacing_hz
```

**Description:** A channel spacing in Hz of this channel set.

###### number_of_channels (heading level 7)

```
uint16_t sl_rail_alternate_phy_t::number_of_channels
```

**Description:** The number of channels (and not the channel number !)

###### min_if_khz (heading level 7)

```
uint16_t sl_rail_alternate_phy_t::min_if_khz
```

**Description:** minimum IF for the alternate PHY in kHz.

###### min_base_if_khz (heading level 7)

```
uint16_t sl_rail_alternate_phy_t::min_base_if_khz
```

**Description:** minimum IF for the base PHY in kHz.

###### is_ofdm_modem (heading level 7)

```
bool sl_rail_alternate_phy_t::is_ofdm_modem
```

**Description:** Indicates that OFDM modem is used by this alternate PHY.

###### rate_info (heading level 7)

```
uint32_t sl_rail_alternate_phy_t::rate_info
```

**Description:** Rate info of the alternate PHY.

###### hw_modem_agc_ctrl1 (heading level 7)

```
uint32_t sl_rail_alternate_phy_t::hw_modem_agc_ctrl1
```

**Description:** Used to adjust the AGC for CCA between hard and soft modems.

A channel configuration group structure, which defines a group of radio configurations. 

This structure allows grouping multiple radio PHY configurations together, enabling switching between them during runtime. 

###### Public Attributes

###### phy_config_group (heading level 7)

```
sl_rail_radio_config_t sl_rail_channel_config_group_t::phy_config_group
```

**Description:** The array of radio PHY configurations in this group.

**Details:** Each configuration defines the parameters for a specific radio setup.

###### phy_config_group_length (heading level 7)

```
uint32_t sl_rail_channel_config_group_t::phy_config_group_length
```

**Description:** The number of radio PHY configurations (words) in the phy_config_group array.

A channel configuration entry structure, which defines a channel range and parameters across which a corresponding radio configuration is valid. 

operating frequency hz = base_frequency_hz

- channel_spacing_hz * (channel - physical_channel_offset);

###### Public Attributes

###### phy_config_delta_add (heading level 7)

```
sl_rail_radio_config_t sl_rail_channel_config_entry_t::phy_config_delta_add
```

**Description:** The minimum radio configuration to apply to the base configuration for this channel set.

###### base_frequency_hz (heading level 7)

```
uint32_t sl_rail_channel_config_entry_t::base_frequency_hz
```

**Description:** A base frequency in Hz of this channel set.

###### channel_spacing_hz (heading level 7)

```
uint32_t sl_rail_channel_config_entry_t::channel_spacing_hz
```

**Description:** A channel spacing in Hz of this channel set.

###### physical_channel_offset (heading level 7)

```
uint16_t sl_rail_channel_config_entry_t::physical_channel_offset
```

**Description:** The offset to subtract from the logical channel to align them with the zero based physical channels which are relative to base_frequency_hz.

**Details:** (i.e., By default ch 0 = base freq, but if offset = 11, ch 11 = base freq.)

###### channel_number_start (heading level 7)

```
uint16_t sl_rail_channel_config_entry_t::channel_number_start
```

**Description:** The first valid RAIL channel number for this channel set.

###### channel_number_end (heading level 7)

```
uint16_t sl_rail_channel_config_entry_t::channel_number_end
```

**Description:** The last valid RAIL channel number for this channel set.

###### max_power_ddbm (heading level 7)

```
sl_rail_tx_power_t sl_rail_channel_config_entry_t::max_power_ddbm
```

**Description:** The maximum power allowed in this channel set.

###### p_attr (heading level 7)

```
sl_rail_channel_config_entry_attr_t* sl_rail_channel_config_entry_t::p_attr
```

**Description:** A pointer to a structure containing attributes specific to this channel set.

###### entry_type (heading level 7)

```
sl_rail_channel_config_entry_type_t sl_rail_channel_config_entry_t::entry_type
```

**Description:** Indicates channel config type.

###### reserved (heading level 7)

```
uint8_t sl_rail_channel_config_entry_t::reserved[3]
```

**Description:** to align to 32-bit boundary.

###### p_stack_info (heading level 7)

```
const uint8_t* sl_rail_channel_config_entry_t::p_stack_info
```

**Description:** Array containing information according to the [sl_rail_pti_protocol_t](pti#sl-rail-pti-protocol-t) in the first byte of this array.

**Details:** The first 2 fields are common to all protocols and accessible by RAIL, others are ignored by RAIL and only used by the application. Common fields are listed in [sl_rail_stack_info_common_t](sl-rail-stack-info-common-t).

###### p_alternate_phy (heading level 7)

```
sl_rail_alternate_phy_t* sl_rail_channel_config_entry_t::p_alternate_phy
```

**Description:** Pointer to alternate PHY.

A channel configuration structure, which defines the channel meaning when a channel number is passed into a RAIL function, e.g., [sl_rail_start_tx()](packet-tx#sl-rail-start-tx) and [sl_rail_start_rx()](receive#sl-rail-start-rx). 

A [sl_rail_channel_config_t](sl-rail-channel-config-t) structure defines the channel scheme that an application uses when registered in [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels).

These are a few examples of different channel configurations: 

```c
// 21 channels starting at 2.45 GHz with channel spacing of 1 MHz
// ... generated by Simplicity Studio (i.e., rail_config.c) ...
const uint32_t generated[] = { ... };
sl_rail_channel_config_entry_attr_t generated_entry_attr = { ... };
const sl_rail_channel_config_entry_t generated_channels[] = {
  {
    .phy_config_delta_add = NULL, // Add this to default configuration for this entry
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_entry_attr,
  },
};
const sl_rail_channel_config_t generated_channel_config = {
  .phy_config_base = generated, // Default radio configuration for all entries
  .phy_config_delta_subtract = NULL, // Subtract this to restore the default configuration
  .p_entries = generated_channels,
  .length = 1, // There are this many channel configuration entries
};
const sl_rail_channel_config_t *channel_configs[] = {
  &generated_channel_config,
  NULL,
};
// ... in main code ...
// Associate a specific channel configuration with a particular RAIL instance.
sl_rail_config_channels(rail_handle, channel_configs[0]);

// 4 nonlinear channels
// ... in rail_config.c ...
const uint32_t generated[] = { ... };
sl_rail_channel_config_entry_attr_t generated_entry_attr = { ... };
const sl_rail_channel_config_entry_t generated_channels[] = {
  {
    .phy_config_delta_add = NULL, // Add this to default configuration for this entry
    .base_frequency_hz = 910123456,
    .channel_spacing_hz = 0,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 0,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_entry_attr,
  },
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 911654789,
    .channel_spacing_hz = 0,
    .physical_channel_offset = 0, // Since ch spacing = 0, offset can be 0
    .channel_number_start = 1,
    .channel_number_end = 1,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_entry_attr,
  },
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 912321456,
    .channel_spacing_hz = 100000,
    .physical_channel_offset = 2, // Since ch spacing != 0, offset = 2
    .channel_number_start = 2, // ch 2 = base_frequency
    .channel_number_end = 2,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_entry_attr,
  },
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 913147852,
    .channel_spacing_hz = 0,
    .physical_channel_offset = 0,
    .channel_number_start = 3,
    .channel_number_end = 3,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_entry_attr,
  },
};
const sl_rail_channel_config_t generated_channel_config = {
  .phy_config_base = generated, // Default radio configuration for all entries
  .phy_config_delta_subtract = NULL, // Subtract this to restore the default configuration
  .p_entries = generated_channels,
  .length = 4, // There are this many channel configuration entries
};
const sl_rail_channel_config_t *channel_configs[] = {
  &generated_channel_config,
  NULL,
};
// ... in main code ...
// Associate a specific channel configuration with a particular RAIL instance.
sl_rail_config_channels(rail_handle, channel_configs[0]);

// Multiple radio configurations
// ... in rail_config.c ...
const uint32_t generated_0[] = { ... };
sl_rail_channel_config_entry_attr_t generated_0_entry_attr = { ... };
const sl_rail_channel_config_entry_t generated_0_channels[] = {
  {
    .phy_config_delta_add = NULL, // Add this to the default configuration for this entry
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_0_entry_attr,
  },
};
const sl_rail_channel_config_t generated_0_channel_config = {
  .phy_config_base = generated_0, // Default radio configuration for all entries
  .phy_config_delta_subtract = NULL, // Subtract this to restore default configuration
  .p_entries = generated_0_channels,
  .length = 1 // There are this many channel configuration entries
};
const uint32_t generated_1[] = { ... };
sl_rail_channel_config_entry_attr_t generated_1_entry_attr = { ... };
const sl_rail_channel_config_entry_t generated_1_channels[] = {
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = -100, // Use this entry when TX power <= -10dBm
    .p_attr = &generated_1_entry_attr,
  },
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = 15, // Use this entry when TX power > -10dBm
                     // and TX power <= 1.5dBm
    .p_attr = &generated_1_entry_attr,
  },
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX, // Use this entry when TX power > 1.5dBm
    .p_attr = &generated_1_entry_attr,
  },
};
const sl_rail_channel_config_t generated_1_channel_config = {
  .phy_config_base = generated_1,
  .phy_config_delta_subtract = NULL,
  .p_entries = generated_1_channels,
  .length = 3,
};
const uint32_t generated_2[] = { ... };
sl_rail_channel_config_entry_attr_t generated_2_entry_attr = { ... };
const sl_rail_channel_config_entry_t generated_2_channels[] = {
  {
    .phy_config_delta_add = NULL,
    .base_frequency_hz = 2450000000,
    .channel_spacing_hz = 1000000,
    .physical_channel_offset = 0,
    .channel_number_start = 0,
    .channel_number_end = 20,
    .max_power_ddbm = SL_RAIL_TX_POWER_MAX,
    .p_attr = &generated_2_entry_attr,
  },
};
const sl_rail_channel_config_t generated_2_channel_config = {
  .phy_config_base = generated_2,
  .phy_config_delta_subtract = NULL,
  .p_entries = generated_2_channels,
  .length = 1,
};
const sl_rail_channel_config_t *channel_configs[] = {
  &generated_0_channel_config,
  &generated_1_channel_config,
  &generated_2_channel_config,
  NULL,
};
// ... in main code ...
// Create a unique RAIL handle for each unique channel configuration.
sl_rail_handle_t rail_handle_0 = SL_RAIL_EFR32_HANDLE;
sl_rail_init(&rail_handle_0, &rail_config_0, NULL);
sl_rail_handle_t rail_handle_1 = SL_RAIL_EFR32_HANDLE;
sl_rail_init(&rail_handle_1, &rail_config_1, NULL);
sl_rail_handle_t rail_handle_2 = SL_RAIL_EFR32_HANDLE;
sl_rail_init(&rail_handle_2, &rail_config_2, NULL);
// Associate each channel configuration with its corresponding RAIL handle.
sl_rail_config_channels(rail_handle_0, channel_configs[0]);
sl_rail_config_channels(rail_handle_1, channel_configs[1]);
sl_rail_config_channels(rail_handle_2, channel_configs[2]);
// Use a RAIL handle and channel to access the desired channel configuration entry.
sl_rail_set_tx_power_dbm(rail_handle_1, 100); // set 10.0 dBm TX power
sl_rail_start_rx(rail_handle_1, 0, &sched_info); // RX using generated_1_channels[2]
sl_rail_set_tx_power_dbm(rail_handle_1, 0); // set 0 dBm TX power
sl_rail_start_rx(rail_handle_1, 0, &sched_info); // RX using generated_1_channels[1]
sl_rail_start_rx(rail_handle_2, 0, &sched_info); // RX using generated_2_channels[0]

```

###### Public Attributes

###### phy_config_base (heading level 7)

```
sl_rail_radio_config_t sl_rail_channel_config_t::phy_config_base
```

**Description:** Base radio configuration for the corresponding channel configuration entries.

###### phy_config_delta_subtract (heading level 7)

```
sl_rail_radio_config_t sl_rail_channel_config_t::phy_config_delta_subtract
```

**Description:** Minimum radio configuration to restore channel entries back to base configuration.

###### p_entries (heading level 7)

```
const sl_rail_channel_config_entry_t* sl_rail_channel_config_t::p_entries
```

**Description:** Pointer to an array of [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t) entries.

###### number_of_entries (heading level 7)

```
uint32_t sl_rail_channel_config_t::number_of_entries
```

**Description:** Number of [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t) entries.

###### signature (heading level 7)

```
uint32_t sl_rail_channel_config_t::signature
```

**Description:** Signature for this structure.

**Details:** Only used on modules.

###### xtal_frequency_hz (heading level 7)

```
uint32_t sl_rail_channel_config_t::xtal_frequency_hz
```

**Description:** Crystal Frequency for the channel config.

Container for individual channel metadata. 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t sl_rail_channel_metadata_t::channel
```

**Description:** Channel number.

###### reserved (heading level 7)

```
uint16_t sl_rail_channel_metadata_t::reserved
```

**Description:** Word alignment.

###### frequency_hz (heading level 7)

```
uint32_t sl_rail_channel_metadata_t::frequency_hz
```

**Description:** Channel frequency, in Hz.

Stack info fields common to all protocols. 

###### Public Attributes

###### protocol_id (heading level 7)

```
sl_rail_pti_protocol_t sl_rail_stack_info_common_t::protocol_id
```

**Description:** Protocol ID as per [sl_rail_pti_protocol_t](pti#sl-rail-pti-protocol-t).

###### phy_id (heading level 7)

```
uint8_t sl_rail_stack_info_common_t::phy_id
```

**Description:** PHY Id depending on the protocol_id value.

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time.

**Deprecated**RAIL 2.x synonym of [sl_rail_channel_config_entry_attr_t](sl-rail-channel-config-entry-attr-t).

A channel configuration entry attribute structure. 

Items listed are designed to be altered and updated during run-time.

#### Receive

APIs related to packet receive. 

##### Modules

[RAIL_ScheduleRxConfig_t](rail-schedule-rx-config-t)

[RAIL_RxPacketInfo_t](rail-rx-packet-info-t)

[RAIL_RxPacketDetails_t](rail-rx-packet-details-t)

[RAIL_PrsLnaBypassConfig_t](rail-prs-lna-bypass-config-t)

[sl_rail_scheduled_rx_config_t](sl-rail-scheduled-rx-config-t)

[sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t)

[sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t)

[sl_rail_prs_lna_bypass_config_t](sl-rail-prs-lna-bypass-config-t)

[Address Filtering](address-filtering)

[Packet Information](packet-information)

##### Enumerations

###### RAIL_RxOptions_t

```
enum RAIL_RxOptions_t {
    RAIL_RX_OPTION_STORE_CRC_SHIFT = 0
    RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT = 1
    RAIL_RX_OPTION_ENABLE_DUALSYNC_SHIFT = 2
    RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT = 3
    RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT = 4
    RAIL_RX_OPTION_ANTENNA0_SHIFT = 5
    RAIL_RX_OPTION_ANTENNA1_SHIFT = 6
    RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT = 7
    RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT = 10
    RAIL_RX_OPTION_FAST_RX2RX_SHIFT = 11
    RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT = 12
}
```

**Description:**

Receive options, in reality a bitmask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_options_t](receive#sl-rail-rx-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RX_OPTION_STORE_CRC_SHIFT|Shift position of [RAIL_RX_OPTION_STORE_CRC](receive#rail-rx-option-store-crc) bit.|
|RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT|Shift position of [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) bit.|
|RAIL_RX_OPTION_ENABLE_DUALSYNC_SHIFT|Shift position of [RAIL_RX_OPTION_ENABLE_DUALSYNC](receive#rail-rx-option-enable-dualsync) bit.|
|RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT|Shift position of [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#rail-rx-option-track-aborted-frames) bit.|
|RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT|Shift position of [RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info) bit.|
|RAIL_RX_OPTION_ANTENNA0_SHIFT|Shift position of [RAIL_RX_OPTION_ANTENNA0](receive#rail-rx-option-antenna0) bit.|
|RAIL_RX_OPTION_ANTENNA1_SHIFT|Shift position of [RAIL_RX_OPTION_ANTENNA1](receive#rail-rx-option-antenna1) bit.|
|RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT|Shift position of [RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#rail-rx-option-disable-frame-detection) bit.|
|RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT|Shift position of [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching) bit.|
|RAIL_RX_OPTION_FAST_RX2RX_SHIFT|Shift position of [RAIL_RX_OPTION_FAST_RX2RX](receive#rail-rx-option-fast-rx2-rx) bit.|
|RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT|Shift position of [RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#rail-rx-option-enable-collision-detection) bit.|

###### RAIL_RxPacketStatus_t

```
enum RAIL_RxPacketStatus_t {
    RAIL_RX_PACKET_NONE = 0
    RAIL_RX_PACKET_ABORT_FORMAT = 1
    RAIL_RX_PACKET_ABORT_FILTERED = 2
    RAIL_RX_PACKET_ABORT_ABORTED = 3
    RAIL_RX_PACKET_ABORT_OVERFLOW = 4
    RAIL_RX_PACKET_ABORT_CRC_ERROR = 5
    RAIL_RX_PACKET_READY_CRC_ERROR = 6
    RAIL_RX_PACKET_READY_SUCCESS = 7
    RAIL_RX_PACKET_RECEIVING = 8
}
```

**Description:**

The packet status code associated with a packet received or currently being received.

**Details:**

**Note**

- RECEIVING implies some packet data may be available, but is untrustworthy (not CRC-verified) and might disappear if the packet is rolled back on error. No packet details are yet available.
- In RX [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), ABORT statuses imply some packet data may be available, but it's incomplete and not trustworthy.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RX_PACKET_NONE|The radio is idle or searching for a packet.|
|RAIL_RX_PACKET_ABORT_FORMAT|The packet was aborted during filtering because of illegal frame length, CRC or block decoding errors, other RAIL built-in protocol-specific packet content errors, or by the application or multiprotocol scheduler idling the radio with [RAIL_IDLE_ABORT](state-transitions#rail-idle-abort) or higher.|
|RAIL_RX_PACKET_ABORT_FILTERED|The packet failed address filtering.|
|RAIL_RX_PACKET_ABORT_ABORTED|The packet passed any filtering but was aborted by the application or multiprotocol scheduler idling the radio with [RAIL_IDLE_ABORT](state-transitions#rail-idle-abort) or higher.|
|RAIL_RX_PACKET_ABORT_OVERFLOW|The packet overflowed the receive buffer.|
|RAIL_RX_PACKET_ABORT_CRC_ERROR|The packet passed any filtering but subsequently failed CRC check(s) block decoding, or illegal frame length, and was aborted.|
|RAIL_RX_PACKET_READY_CRC_ERROR|The packet passed any filtering but subsequently failed CRC check(s) with [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) in effect.|
|RAIL_RX_PACKET_READY_SUCCESS|The packet was successfully received, passing CRC check(s).|
|RAIL_RX_PACKET_RECEIVING|A packet is being received and is not yet complete.|

###### sl_rail_rx_options_t

```
enum sl_rail_rx_options_t {
    SL_RAIL_RX_OPTION_STORE_CRC_SHIFT = 0
    SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT = 1
    SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC_SHIFT = 2
    SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT = 3
    SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT = 4
    SL_RAIL_RX_OPTION_ANTENNA_0_SHIFT = 5
    SL_RAIL_RX_OPTION_ANTENNA_1_SHIFT = 6
    SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT = 7
    SL_RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT = 10
    SL_RAIL_RX_OPTION_FAST_RX_TO_RX_SHIFT = 11
    SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT = 12
}
```

**Description:**

Receive options, in reality a bitmask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RX_OPTION_STORE_CRC_SHIFT|Shift position of [SL_RAIL_RX_OPTION_STORE_CRC](receive#sl-rail-rx-option-store-crc) bit.|
|SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT|Shift position of [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#sl-rail-rx-option-ignore-crc-errors) bit.|
|SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC_SHIFT|Shift position of [SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC](receive#sl-rail-rx-option-enable-dual-sync) bit.|
|SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT|Shift position of [SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#sl-rail-rx-option-track-aborted-frames) bit.|
|SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT|Shift position of [SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#sl-rail-rx-option-remove-appended-info) bit.|
|SL_RAIL_RX_OPTION_ANTENNA_0_SHIFT|Shift position of [SL_RAIL_RX_OPTION_ANTENNA_0](receive#sl-rail-rx-option-antenna-0) bit.|
|SL_RAIL_RX_OPTION_ANTENNA_1_SHIFT|Shift position of [SL_RAIL_RX_OPTION_ANTENNA_1](receive#sl-rail-rx-option-antenna-1) bit.|
|SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT|Shift position of [SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#sl-rail-rx-option-disable-frame-detection) bit.|
|SL_RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT|Shift position of [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching) bit.|
|SL_RAIL_RX_OPTION_FAST_RX_TO_RX_SHIFT|Shift position of [SL_RAIL_RX_OPTION_FAST_RX_TO_RX](receive#sl-rail-rx-option-fast-rx-to-rx) bit.|
|SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT|Shift position of [SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION](receive#sl-rail-rx-option-enable-collision-detection) bit.|

###### sl_rail_rx_packet_status_t

```
enum sl_rail_rx_packet_status_t {
    SL_RAIL_RX_PACKET_NONE = 0u
    SL_RAIL_RX_PACKET_ABORT_FORMAT = 1u
    SL_RAIL_RX_PACKET_ABORT_FILTERED = 2u
    SL_RAIL_RX_PACKET_ABORT_ABORTED = 3u
    SL_RAIL_RX_PACKET_ABORT_OVERFLOW = 4u
    SL_RAIL_RX_PACKET_ABORT_CRC_ERROR = 5u
    SL_RAIL_RX_PACKET_READY_CRC_ERROR = 6u
    SL_RAIL_RX_PACKET_READY_SUCCESS = 7u
    SL_RAIL_RX_PACKET_RECEIVING = 8u
}
```

**Description:**

The packet status code associated with a packet received or currently being received.

**Details:**

**Note**

- RECEIVING implies some packet data may be available, but is untrustworthy (not CRC-verified) and might disappear if the packet is rolled back on error. No packet details are yet available.
- In RX [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), ABORT statuses imply some packet data may be available, but it's incomplete and not trustworthy.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RX_PACKET_NONE|The radio is idle or searching for a packet.|
|SL_RAIL_RX_PACKET_ABORT_FORMAT|The packet was aborted during filtering because of illegal frame length, CRC or block decoding errors, other RAIL built-in protocol-specific packet content errors, or by the application or multiprotocol scheduler idling the radio with [SL_RAIL_IDLE_ABORT](state-transitions#sl-rail-idle-abort) or higher.|
|SL_RAIL_RX_PACKET_ABORT_FILTERED|The packet failed address filtering.|
|SL_RAIL_RX_PACKET_ABORT_ABORTED|The packet passed any filtering but was aborted by the application or multiprotocol scheduler idling the radio with [SL_RAIL_IDLE_ABORT](state-transitions#sl-rail-idle-abort) or higher.|
|SL_RAIL_RX_PACKET_ABORT_OVERFLOW|The packet overflowed the receive buffer.|
|SL_RAIL_RX_PACKET_ABORT_CRC_ERROR|The packet passed any filtering but subsequently failed CRC check(s) block decoding, or illegal frame length, and was aborted.|
|SL_RAIL_RX_PACKET_READY_CRC_ERROR|The packet passed any filtering but subsequently failed CRC check(s) with [SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#sl-rail-rx-option-ignore-crc-errors) in effect.|
|SL_RAIL_RX_PACKET_READY_SUCCESS|The packet was successfully received, passing CRC check(s).|
|SL_RAIL_RX_PACKET_RECEIVING|A packet is being received and is not yet complete.|

##### Typedefs

###### RAIL_RxPacketHandle_t

`RAIL_RxPacketHandle_t`

**Description:**

A handle used to reference a packet during reception processing.

**Details:**

There are several sentinel handle values that pertain to certain circumstances: [RAIL_RX_PACKET_HANDLE_INVALID](receive#rail-rx-packet-handle-invalid), [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest), [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) and [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t).

###### RAIL_ConvertLqiCallback_t

`RAIL_ConvertLqiCallback_t`

**Description:**

A pointer to a function called before LQI is copied into the [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) structure.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|lqi|The LQI value obtained by hardware and being readied for application consumption. This LQI value is in integral units ranging from 0 to 255.|
||[in]|rssi|The RSSI value corresponding to the packet from which the hardware LQI value was obtained. This RSSI value is in integral dBm units.|

**Details:**

**Returns**

- uint8_t The converted LQI value that will be loaded into the [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) structure in preparation for application consumption. This value should likewise be in integral units ranging from 0 to 255.

**Deprecated**RAIL 2.x synonym of [sl_rail_convert_lqi_callback_t()](receive#sl-rail-convert-lqi-callback-t).

###### sl_rail_rx_packet_handle_t

`sl_rail_rx_packet_handle_t`

**Description:**

A handle used to reference a packet during reception processing.

**Details:**

There are several sentinel handle values that pertain to certain circumstances: [SL_RAIL_RX_PACKET_HANDLE_INVALID](receive#sl-rail-rx-packet-handle-invalid), [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest), [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete) and [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest).

###### sl_rail_convert_lqi_callback_t

`sl_rail_convert_lqi_callback_t`

**Description:**

A pointer to a function called before LQI is copied into the [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) structure.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|lqi|The LQI value obtained by hardware and being readied for application consumption. This LQI value is in integral units ranging from 0 to 255.|
||[in]|rssi_dbm|The RSSI value corresponding to the packet from which the hardware LQI value was obtained. This RSSI value is in integral dBm units.|

**Details:**

**Returns**

- uint8_t The converted LQI value that will be loaded into the [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) structure in preparation for application consumption. This value should likewise be in integral units ranging from 0 to 255.

##### Functions

###### RAIL_ConfigRxOptions

`RAIL_Status_t RAIL_ConfigRxOptions(RAIL_Handle_t railHandle, RAIL_RxOptions_t mask, RAIL_RxOptions_t options)`

**Description:** Configure receive options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxOptions_t](receive#rail-rx-options-t)|[in]|mask|A bitmask containing which options should be modified.|
|[RAIL_RxOptions_t](receive#rail-rx-options-t)|[in]|options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [RAIL_RxOptions_t](receive#rail-rx-options-t).|

**Returns**

- Status code indicating success of the function call.

Configure the radio receive flow based on the list of available options. Only the options indicated by the mask parameter will be affected. Pass [RAIL_RX_OPTIONS_ALL](receive#rail-rx-options-all) to set all parameters. The previous settings may affect the current frame if a packet is received during this configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_rx_options()](receive#sl-rail-config-rx-options). 

###### RAIL_IncludeFrameTypeLength

`RAIL_Status_t RAIL_IncludeFrameTypeLength(RAIL_Handle_t railHandle)`

**Description:** Include the code necessary for frame type based length decoding.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function must be called before [RAIL_ConfigChannels()](radio-configuration#rail-config-channels) to allow configurations using a frame type based length setup. It is called by default in the [RAILCb_ConfigFrameTypeLength()](receive#rail-cb-config-frame-type-length) API which can be overridden to save code space.

**Deprecated**RAIL 2.x synonym of [sl_rail_include_frame_type_length()](receive#sl-rail-include-frame-type-length). 

###### RAILCb_ConfigFrameTypeLength

`void RAILCb_ConfigFrameTypeLength(RAIL_Handle_t railHandle, const RAIL_FrameType_t *frameType)`

**Description:** Handle frame type length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_FrameType_t](rail-frame-type-t) *|[in]|frameType|A pointer to a frame type configuration structure.|

This function is implemented in the radio configuration. Currently, the frame type passed in only handles packet length decoding. If NULL is passed into this function, it clears any currently configured frame type settings. This will either be implemented as an empty function in the radio configuration if it is not needed, to assist in dead code elimination.

**Deprecated**This RAIL 2.x callback has been eliminated in RAIL 3. Applications needing frame type length decoding must call [sl_rail_include_frame_type_length()](receive#sl-rail-include-frame-type-length). 

###### RAIL_StartRx

`RAIL_Status_t RAIL_StartRx(RAIL_Handle_t railHandle, uint16_t channel, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Start the receiver on a specific channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to listen on.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this receive appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

This is a non-blocking function. Whenever a packet is received, [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) will fire with [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) set. If you call this while not idle but with a different channel, any ongoing receive or transmit operation will be aborted.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_rx()](receive#sl-rail-start-rx). 

###### RAIL_ScheduleRx

`RAIL_Status_t RAIL_ScheduleRx(RAIL_Handle_t railHandle, uint16_t channel, const RAIL_ScheduleRxConfig_t *cfg, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Schedule a receive window for some future time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|A channel to listen on.|
|const [RAIL_ScheduleRxConfig_t](rail-schedule-rx-config-t) *|[in]|cfg|A pointer to a configuration structure to define the receive window.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this receive appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

This API immediately changes the channel and schedules receive to start at the specified time and end at the given end time. If you do not specify an end time, you may call this API later with an end time as long as you set the start time to disabled. You can also terminate the receive operation immediately using the [RAIL_Idle()](state-transitions#rail-idle-1) function. Note that relative end times are always relative to the start unless no start time is specified. If changing channels, the channel is changed immediately and will abort any ongoing packet transmission or reception.

Returns an error if a CSMA or LBT transmit is still in progress.

In multiprotocol, ensure that you properly yield the radio after this call. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx). 

###### RAIL_EnablePrsLnaBypass

`RAIL_Status_t RAIL_EnablePrsLnaBypass(RAIL_Handle_t railHandle, bool enable, const RAIL_PrsLnaBypassConfig_t *pPrsLnaBypassConfig)`

**Description:** Enable automatic PRS LNA bypass for external FEM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|bool|[in]|enable|Enable/Disable automatic PRS LNA bypass.|
|const [RAIL_PrsLnaBypassConfig_t](rail-prs-lna-bypass-config-t) *|[in]|pPrsLnaBypassConfig|A pointer to an automatic PRS LNA bypass configuration structure. It must be non-NULL to enable the feature.|

**Returns**

- Status code indicating success of the function call.

If automatic PRS LNA bypass is enabled on chip that supports the feature ([RAIL_SUPPORTS_PRS_LNA_BYPASS](features#rail-supports-prs-lna-bypass-1)), a level is generated on a PRS channel when the received power exceed a threshold. It is turned off after frame reception or after timeout if no frame has been detected and power is below the threshold.

**Warnings**

- Calling this function before [RAIL_Init()](general#rail-init) won't enable the the feature now. It will return [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) but the feature will be enabled by [RAIL_Init()](general#rail-init).
- As this function relies on PRS access and RAIL is meant to run in TrustZone non-secure world, it is not supported if PRS is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_prs_lna_bypass()](receive#sl-rail-enable-prs-lna-bypass). 

###### RAIL_HoldRxPacket

`RAIL_RxPacketHandle_t RAIL_HoldRxPacket(RAIL_Handle_t railHandle)`

**Description:** Place a temporary hold on this packet's data in the receive FIFO and internal packet metadata FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

This function can only be called from within RAIL callback context. It can be used in any RX mode.

Normally, when RAIL issues its callback indicating a packet is ready or aborted, it expects the application's callback to retrieve and copy (or discard) the packet's information and data, and will free the packet data and metadata after the callback returns. This function tells RAIL to hold onto those resources in the receive FIFO and internal metadata FIFO after the callback returns in case the application wants to defer processing the packet to a later time, e.g., outside of callback context.

**Returns**

- The packet handle for the packet associated with the callback, [RAIL_RX_PACKET_HANDLE_INVALID](receive#rail-rx-packet-handle-invalid) if no such packet yet exists or railHandle is not active.

**Note**

- When using multiprotocol the receive FIFO and internal receive metadata FIFO are reset during protocol switches losing any held packets. It is best to avoid using [RAIL_HoldRxPacket](receive#rail-hold-rx-packet) in DMP or to at least invalidate any held packet handles and related [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) information when the [RAIL_EVENT_CONFIG_UNSCHEDULED](events#rail-event-config-unscheduled) occurs.

**Deprecated**RAIL 2.x synonym of [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet). 

###### RAIL_PeekRxPacket

`uint16_t RAIL_PeekRxPacket(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, uint8_t *pDst, uint16_t len, uint16_t offset)`

**Description:** Copy 'len' bytes of packet data starting from 'offset' from the receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)|[in]|packetHandle|A packet handle as returned from a previous [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) or [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet) call, or sentinel values [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest), [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) or [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest).|
|uint8_t *|[out]|pDst|A pointer to the location where the received bytes will be copied. If NULL, no copying occurs.|
|uint16_t|[in]|len|A number of packet data bytes to copy.|
|uint16_t|[in]|offset|A byte offset within remaining packet data from which to copy.|

Those bytes remain valid for re-peeking.

**Returns**

- Number of packet bytes copied.

**Note**

- Peek does not permit peeking beyond the requested packet's available packet data (though there is a small chance it might for a [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest) packet at the very end of still being received). Nor can one peek into already-consumed data read by [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo). len and offset are relative to the remaining data available in the packet, if any was already consumed by [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo).

**Deprecated**RAIL 2.x synonym of [sl_rail_peek_rx_packet()](receive#sl-rail-peek-rx-packet). 

###### RAIL_ReleaseRxPacket

`RAIL_Status_t RAIL_ReleaseRxPacket(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle)`

**Description:** Release RAIL's resources for a packet previously held in the receive FIFO and internal receive metadata FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)|[in]|packetHandle|A packet handle as returned from a previous [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet) call, or sentinel values [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest), [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) or [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest). The latter might be used within RAIL callback context to explicitly release the packet associated with the callback early, before it's released automatically by RAIL on callback return (unless explicitly held).|

This function must be called for any packet previously held via [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet). It may optionally be called within a callback context to release RAIL resources sooner than at callback completion time when not holding the packet. This function can be used in any RX mode.

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the held packet was released or an appropriate error code otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_release_rx_packet()](receive#sl-rail-release-rx-packet). 

###### RAIL_GetRssi

`int16_t RAIL_GetRssi(RAIL_Handle_t railHandle, bool wait)`

**Description:** Return the current raw RSSI.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|wait|if false returns instant RSSI with no checks.|

**Returns**

- [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) if the receiver is disabled and an RSSI value can't be obtained. Otherwise, return the RSSI in quarter dBm, dbm*4.

Gets the current RSSI value. This value represents the current energy of the channel. It can change rapidly and will be low if no RF energy is in the current channel. The function from the value reported to dBm is an offset dependent on the PHY and the PCB layout. Characterize the RSSI received on your hardware and apply an offset in the application to account for board and PHY parameters. When 'wait' is false, the radio needs to be currently in RX and have been in there for a sufficient amount of time for a fresh RSSI value to be read and returned. Otherwise, the RSSI is considered stale and [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) is returned instead. When 'wait' is true, if the radio is transitioning to or already in RX, this function will wait for a valid RSSI to be read and return it. Otherwise, if the radio is in or transitions to IDLE or TX, [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) will be returned. On low datarate PHYs, this function can take a significantly longer time when wait is true.

In multiprotocol, this function returns [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) immediately if railHandle is not the currently active [RAIL_Handle_t](general#rail-handle-t). Additionally, 'wait' should never be set 'true' in multiprotocol as the wait time is not consistent, so scheduling a scheduler slot cannot be done accurately. Rather if waiting for a valid RSSI is desired, use [RAIL_GetRssiAlt](receive#rail-get-rssi-alt) instead to apply a bounded time period.

**Note**

- If RX Antenna Diversity is enabled via [RAIL_ConfigRxOptions()](receive#rail-config-rx-options), pass true for the wait parameter otherwise it's very likely [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) will be returned.
- If RX channel hopping is turned on, do not use this API. Instead, see [RAIL_GetChannelHoppingRssi()](rx-channel-hopping#rail-get-channel-hopping-rssi).
- When 'wait' is false, this API is equivalent to [RAIL_GetRssiAlt](receive#rail-get-rssi-alt) with 'waitTimeout' set to [RAIL_GET_RSSI_NO_WAIT](receive#rail-get-rssi-no-wait). When 'wait' is true, this API is equivalent to [RAIL_GetRssiAlt](receive#rail-get-rssi-alt) with 'waitTimeout' set to [RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#rail-get-rssi-wait-without-timeout). Consider using [RAIL_GetRssiAlt](receive#rail-get-rssi-alt) if a bounded maximum wait timeout is desired.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rssi()](receive#sl-rail-get-rssi) with a different parameter. 

###### RAIL_GetRssiAlt

`int16_t RAIL_GetRssiAlt(RAIL_Handle_t railHandle, RAIL_Time_t waitTimeout)`

**Description:** Return the current raw RSSI in quarter-dBm within a definitive time period.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|waitTimeout|Sets the maximum time in microseconds to wait for a valid RSSI. If equal to [RAIL_GET_RSSI_NO_WAIT](receive#rail-get-rssi-no-wait) returns instant RSSI with no checks. If equal to [RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#rail-get-rssi-wait-without-timeout) waits for a valid RSSI with no maximum timeout.|

**Returns**

- [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) if the receiver is disabled and an RSSI value can't be obtained. Otherwise, return the RSSI in quarter dBm (dBm*4).

Gets the current RSSI value. This value represents the current energy of the channel. It can change rapidly, and will be low if no RF energy is in the current channel. The function from the value reported to dBm is an offset dependent on the PHY and the PCB layout. Characterize the RSSI received on your hardware and apply an offset in the application to account for board and PHY parameters. If a value of [RAIL_GET_RSSI_NO_WAIT](receive#rail-get-rssi-no-wait) is given for waitTimeout, the radio needs to be currently in RX and have been in there for a sufficient amount of time for a fresh RSSI value to be read and returned. Otherwise the RSSI is considered stale and [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) is returned instead. For non-zero values of waitTimeout, if the radio is transitioning to or already in RX, this function will wait a maximum time equal to waitTimeout (or indefinitely if waitTimeout is set to [RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#rail-get-rssi-wait-without-timeout)) for a valid RSSI to be read and return it. Otherwise, if the waitTimeout is reached, or the radio is in or transitions to IDLE or TX, [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) will be returned. On low datarate PHYs, this function can take a significantly longer time when waitTimeout is non-zero.

In multiprotocol, this function returns [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) immediately if railHandle is not the currently active [RAIL_Handle_t](general#rail-handle-t). Additionally, waitTimeout should never be set to a value other than [RAIL_GET_RSSI_NO_WAIT](receive#rail-get-rssi-no-wait) in multiprotocol as the integration between this feature and the radio scheduler has not been implemented.

**Note**

- If RX Antenna Diversity is enabled via [RAIL_ConfigRxOptions()](receive#rail-config-rx-options), pass true for the wait parameter otherwise it's very likely [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) will be returned.
- If RX Antenna Diversity is enabled via [RAIL_ConfigRxOptions()](receive#rail-config-rx-options), the RSSI value returned could come from either antenna and vary between antennas.
- If RX channel hopping is turned on, do not use this API. Instead, see [RAIL_GetChannelHoppingRssi()](rx-channel-hopping#rail-get-channel-hopping-rssi).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rssi()](receive#sl-rail-get-rssi). 

###### RAIL_StartAverageRssi

`RAIL_Status_t RAIL_StartAverageRssi(RAIL_Handle_t railHandle, uint16_t channel, RAIL_Time_t averagingTimeUs, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Start the RSSI averaging over a specified time in us.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The physical channel to set.|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|averagingTimeUs|Averaging time in microseconds.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this operation appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

Starts a non-blocking hardware-based RSSI averaging mechanism. Only a single instance of RSSI averaging can be run at any time and the radio must be idle to start.

In multiprotocol, this is a scheduled event. It will start when railHandle becomes active. railHandle needs to stay active until the averaging completes. If the averaging is interrupted, calls to [RAIL_GetAverageRssi()](receive#rail-get-average-rssi) will return [RAIL_RSSI_INVALID](receive#rail-rssi-invalid).

Also in multiprotocol, the user is required to call [RAIL_YieldRadio()](multiprotocol#rail-yield-radio) after this event completes (i.e., when [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done) occurs).

**Note**

- If the radio is idled while RSSI averaging is still in effect, a [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done) event may not occur and [RAIL_IsAverageRssiReady()](receive#rail-is-average-rssi-ready) may never return true.
- Completion of RSSI averaging, marked by RAIL event [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done), will return the radio to idle state.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi). 

###### RAIL_IsAverageRssiReady

`bool RAIL_IsAverageRssiReady(RAIL_Handle_t railHandle)`

**Description:** Query whether the RSSI averaging is done.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if done and false otherwise.

This function can be used to poll for completion of the RSSI averaging to avoid relying on an interrupt-based callback.

**Note**

- If the radio is idled while RSSI averaging is still in effect, this function may never return true.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_average_rssi_ready()](receive#sl-rail-is-average-rssi-ready). 

###### RAIL_GetAverageRssi

`int16_t RAIL_GetAverageRssi(RAIL_Handle_t railHandle)`

**Description:** Get the RSSI in quarter-dBm averaged over a specified time in microseconds.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The RSSI in quarter-dBm (dBm * 4), or [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) if the receiver is disabled or an an RSSI value couldn't be obtained.

Gets the hardware RSSI average after issuing [RAIL_StartAverageRssi()](receive#rail-start-average-rssi). Use after [RAIL_StartAverageRssi()](receive#rail-start-average-rssi).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_average_rssi()](receive#sl-rail-get-average-rssi). 

###### RAIL_SetRssiOffset

`RAIL_Status_t RAIL_SetRssiOffset(RAIL_Handle_t railHandle, int8_t rssiOffset)`

**Description:** Set an RSSI offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|
|int8_t|[in]|rssiOffset|desired dB offset to be added to the RSSI measurements.|

**Returns**

- Status code indicating success of the function call. [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if called with radio-generic handle, such as [RAIL_EFR32_HANDLE](general#rail-efr32-handle), after RAIL initialization. [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if the RSSI offset is deemed large enough to cause the RSSI readings to underflow or overflow.

Adds an offset to the RSSI in dBm. This offset affects all functionality that depends on RSSI values, such as CCA functions. Do not modify the offset dynamically during packet reception. This function can only be called while the radio is off, or in the case of multiprotocol, on an inactive protocol.

**Note**

- : Prior to RAIL being initialized, a radio-wide protocol-independent offset can be established using a radio-generic handle like [RAIL_EFR32_HANDLE](general#rail-efr32-handle). The radio RSSI offset can range from -50 to +20 dB.<br />  
   After RAIL has been initialized a real RAIL protocol handle must be provided to set a protocol-specific RSSI offset, which is added to any radio offset (plus a per-PHY offset set by the radio calculator). The absolute value of the overall sum of all these offsets cannot exceed [RAIL_RSSI_OFFSET_MAX](receive#rail-rssi-offset-max) otherwise RSSIs could underflow or overflow.
- : During [RX Channel Hopping](rx-channel-hopping) this API will not update the RSSI offset immediately if channel hopping has already been configured. A subsequent call to [RAIL_ZWAVE_ConfigRxChannelHopping()](z-wave#rail-zwave-config-rx-channel-hopping) or [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping) is required for the new RSSI offset to take effect.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rssi_offset()](receive#sl-rail-set-rssi-offset). 

###### RAIL_GetRssiOffset

`int8_t RAIL_GetRssiOffset(RAIL_Handle_t railHandle)`

**Description:** Get the radio or protocol RSSI offset in dB.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A radio-generic or real RAIL instance handle.|

**Returns**

- The RSSI offset in dB corresponding to the railHandle.

**Note**

- : A radio-generic handle, such as [RAIL_EFR32_HANDLE](general#rail-efr32-handle), can be used to get the radio's RSSI offset otherwise this will return the RSSI offset value associated with the RAIL protocol instance handle, exclusive of any radio or PHY-specific RSSI offset correction, if any.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rssi_offset()](receive#sl-rail-get-rssi-offset). 

###### RAIL_SetRssiDetectThreshold

`RAIL_Status_t RAIL_SetRssiDetectThreshold(RAIL_Handle_t railHandle, int8_t rssiThresholdDbm)`

**Description:** Set the RSSI detection threshold in dBm to trigger [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int8_t|[in]|rssiThresholdDbm|desired RSSI threshold in dBm over which the event [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) is triggered.|

**Returns**

- Status code indicating success of the function call. Returns [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) in multiprotocol, if the requested railHandle is not active. Returns [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if called on parts on which this function is not supported.

When in receive, RSSI is sampled and if it exceeds the threshold, [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) is triggered.

**Note**

- : If the radio is idled or this function is called with rssiThresholdDbm as [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm) while RSSI detect is still in effect, a [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) may not occur and the detection is disabled. If the RSSI is already above threshold when this function is called then [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) will occur. Once the RSSI goes over the configured threshold and [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) occurs, this function needs to be called again to reactivate the RSSI threshold detection.

This function is only available on EFR32 Series 2 Sub-GHz parts EFR32xG23 and EFR32xG25.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold). 

###### RAIL_GetRssiDetectThreshold

`int8_t RAIL_GetRssiDetectThreshold(RAIL_Handle_t railHandle)`

**Description:** Get the RSSI detection threshold in dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|a RAIL instance handle.|

**Returns**

- The RSSI threshold in dBm corresponding to the railHandle.

**Note**

- : The function returns [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm) when [RAIL_SetRssiDetectThreshold()](receive#rail-set-rssi-detect-threshold) is not supported or disabled. In multiprotocol, the function returns [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm) if railHandle is not active.

This function is only available on EFR32 Series 2 Sub-GHz parts EFR32xG23 and EFR32xG25.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rssi_detect_threshold()](receive#sl-rail-get-rssi-detect-threshold). 

###### RAIL_GetRxIncomingPacketRssi

`int8_t RAIL_GetRxIncomingPacketRssi(RAIL_Handle_t railHandle)`

**Description:** Return the RSSI associated with the incoming packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The RSSI on the incoming packet in dBm, or [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm) if not available.

This function can only be called from callback context, e.g., when handling [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed) or [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_incoming_packet_rssi()](receive#sl-rail-get-rx-incoming-packet-rssi). 

###### RAIL_ConvertLqi

`RAIL_Status_t RAIL_ConvertLqi(RAIL_Handle_t railHandle, RAIL_ConvertLqiCallback_t cb)`

**Description:** Set up a callback function capable of converting a RX packet's LQI value before being consumed by application code.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_ConvertLqiCallback_t](receive#rail-convert-lqi-callback-t)|[in]|cb|A callback of type [RAIL_ConvertLqiCallback_t()](receive#rail-convert-lqi-callback-t) that is called before the RX packet LQI value is loaded into the [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) structure for application consumption.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_convert_lqi()](receive#sl-rail-convert-lqi). 

###### sl_rail_config_rx_options

`sl_rail_status_t sl_rail_config_rx_options(sl_rail_handle_t rail_handle, sl_rail_rx_options_t rx_options_mask, sl_rail_rx_options_t rx_options)`

**Description:** Configure receive options.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_options_t](receive#sl-rail-rx-options-t)|[in]|rx_options_mask|A bitmask containing which options should be modified.|
|[sl_rail_rx_options_t](receive#sl-rail-rx-options-t)|[in]|rx_options|A bitmask containing desired configuration settings. Bit positions for each option are found in the [sl_rail_rx_options_t](receive#sl-rail-rx-options-t).|

**Returns**

- Status code indicating success of the function call.

Configure the radio receive flow based on the list of available options. Only the options indicated by the mask parameter will be affected. Pass [SL_RAIL_RX_OPTIONS_ALL](receive#sl-rail-rx-options-all) to set all parameters. The previous settings may affect the current frame if a packet is received during this configuration. 

###### sl_rail_include_frame_type_length

`sl_rail_status_t sl_rail_include_frame_type_length(sl_rail_handle_t rail_handle)`

**Description:** Include the code necessary for frame type based length decoding.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

This function must be called before [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) to allow configurations using a frame type based length setup. It may be called before [sl_rail_init()](general#sl-rail-init) by using a radio-generic handle like [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle). 

###### sl_rail_start_rx

`sl_rail_status_t sl_rail_start_rx(sl_rail_handle_t rail_handle, uint16_t channel, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Start the receiver on a specific channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to listen on.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this receive appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

This is a non-blocking function. Whenever a packet is received, [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) will fire with [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) set. If you call this while not idle but with a different channel, any ongoing receive or transmit operation will be aborted.

Returns an error if no receive FIFO or Packet Queue have been configured. 

###### sl_rail_start_scheduled_rx

`sl_rail_status_t sl_rail_start_scheduled_rx(sl_rail_handle_t rail_handle, uint16_t channel, const sl_rail_scheduled_rx_config_t *p_scheduled_rx_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Schedule a receive window for some future time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|A channel to listen on.|
|const [sl_rail_scheduled_rx_config_t](sl-rail-scheduled-rx-config-t) *|[in]|p_scheduled_rx_config|A pointer to a configuration structure to define the receive window.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this receive appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

This API immediately changes the channel and schedules receive to start at the specified time and end at the given end time. If you do not specify an end time, you may call this API later with an end time as long as you set the start time to disabled. You can also terminate the receive operation immediately using the [sl_rail_idle()](state-transitions#sl-rail-idle-1) function. Note that relative end times are always relative to the start unless no start time is specified. If changing channels, the channel is changed immediately and will abort any ongoing packet transmission or reception.

Returns an error if a CSMA or LBT transmit is still in progress.

Returns an error if no receive FIFO or Packet Queue have been configured.

In multiprotocol, ensure that you properly yield the radio after this call. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Note**

- Unlike RAIL 2.x [RAIL_ScheduleRx()](receive#rail-schedule-rx), in RAIL 3 the [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) occurs regardless of [sl_rail_scheduled_rx_config_t::rx_transition_end_schedule](sl-rail-scheduled-rx-config-t#rx-transition-end-schedule) setting. See that event for details.

###### sl_rail_enable_prs_lna_bypass

`sl_rail_status_t sl_rail_enable_prs_lna_bypass(sl_rail_handle_t rail_handle, bool enable, const sl_rail_prs_lna_bypass_config_t *p_prs_lna_bypass_config)`

**Description:** Enable automatic PRS LNA bypass for external FEM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|bool|[in]|enable|Enable/Disable automatic PRS LNA bypass.|
|const [sl_rail_prs_lna_bypass_config_t](sl-rail-prs-lna-bypass-config-t) *|[in]|p_prs_lna_bypass_config|A pointer to an automatic PRS LNA bypass configuration structure. It must be non-NULL to enable the feature.|

**Returns**

- Status code indicating success of the function call.

If automatic PRS LNA bypass is enabled on chip that supports the feature ([SL_RAIL_SUPPORTS_PRS_LNA_BYPASS](features#sl-rail-supports-prs-lna-bypass-1)), a level is generated on a PRS channel when the received power exceed a threshold. It is turned off after frame reception or after timeout if no frame has been detected and power is below the threshold.

**Warnings**

- Calling this function before [sl_rail_init()](general#sl-rail-init) won't enable the the feature now. It will return [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) but the feature will be enabled by [sl_rail_init()](general#sl-rail-init).
- As this function relies on PRS access and RAIL is meant to run in TrustZone non-secure world, it is not supported if PRS is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_hold_rx_packet

`sl_rail_rx_packet_handle_t sl_rail_hold_rx_packet(sl_rail_handle_t rail_handle)`

**Description:** Place a temporary hold on this packet's data and metadata in the receive FIFO and receive Packet Queue.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

This function can only be called from within RAIL callback context. It can be used in any RX mode.

Normally, when RAIL issues its callback indicating a packet is ready or aborted, it expects the application's callback to retrieve and copy (or discard) the packet's information and data, and will free the packet data and metadata after the callback returns. This function tells RAIL to hold onto those resources in the receive FIFO and receive Packet Queue after the callback returns in case the application wants to defer processing the packet to a later time, e.g., outside of callback context.

**Returns**

- The packet handle for the packet associated with the callback, [SL_RAIL_RX_PACKET_HANDLE_INVALID](receive#sl-rail-rx-packet-handle-invalid) if no such packet yet exists or rail_handle is not active.

**Note**

- When using multiprotocol and either the receive FIFO or receive Packet Queue are shared with another protocol, both are reset during protocol switches losing any held packets. To avoid this, either give each protocol its own receive FIFO and receive Packet Queue, or make sure to invalidate any held packet handles or related [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) information when the [SL_RAIL_EVENT_CONFIG_UNSCHEDULED](events#sl-rail-event-config-unscheduled) occurs.

###### sl_rail_peek_rx_packet

`uint16_t sl_rail_peek_rx_packet(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, uint8_t *p_dest, uint16_t peek_bytes, uint16_t offset_bytes)`

**Description:** Copy 'len_bytes' of packet data starting from 'byte_offset' from the receive FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t)|[in]|packet_handle|A packet handle as returned from a previous [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) or [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet) call, or sentinel values [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest), [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete) or [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest).|
|uint8_t *|[out]|p_dest|A pointer to the location where the received bytes will be copied. If NULL, no copying occurs.|
|uint16_t|[in]|peek_bytes|A number of packet data bytes to copy.|
|uint16_t|[in]|offset_bytes|A byte offset within remaining packet data from which to copy.|

Those bytes remain valid for re-peeking.

**Returns**

- Number of packet bytes copied.

**Note**

- Peek does not permit peeking beyond the requested packet's available packet data (though there is a small chance it might for a [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest) packet at the very end of still being received). Nor can one peek into already-consumed data read by [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo). len and offset are relative to the remaining data available in the packet, if any was already consumed by [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo).

###### sl_rail_release_rx_packet

`sl_rail_status_t sl_rail_release_rx_packet(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle)`

**Description:** Release RAIL's resources for a packet previously held in the receive FIFO and receive Packet Queue.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t)|[in]|packet_handle|A packet handle as returned from a previous [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet) call, or sentinel values [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest), [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete) or [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest). The latter might be used within RAIL callback context to explicitly release the packet associated with the callback early, before it's released automatically by RAIL on callback return (unless explicitly held).|

This function must be called for any packet previously held via [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet). It may optionally be called within a callback context to release RAIL resources sooner than at callback completion time when not holding the packet. This function can be used in any RX mode.

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the held packet was released or an appropriate error code otherwise.

###### sl_rail_get_rssi

`int16_t sl_rail_get_rssi(sl_rail_handle_t rail_handle, sl_rail_time_t wait_timeout_us)`

**Description:** Return the current raw RSSI in quarter-dBm within a definitive time period.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|wait_timeout_us|Sets the maximum time in microseconds to wait for a valid RSSI. If equal to [SL_RAIL_GET_RSSI_NO_WAIT](receive#sl-rail-get-rssi-no-wait) returns instant RSSI with no checks. If equal to [SL_RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#sl-rail-get-rssi-wait-without-timeout) waits for a valid RSSI with no maximum timeout.|

**Returns**

- [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) if the receiver is disabled and an RSSI value can't be obtained. Otherwise, return the RSSI in quarter dBm (dBm*4).

Gets the current RSSI value. This value represents the current energy of the channel. It can change rapidly, and will be low if no RF energy is in the current channel. The function from the value reported to dBm is an offset dependent on the PHY and the PCB layout. Characterize the RSSI received on your hardware and apply an offset in the application to account for board and PHY parameters. If a value of [SL_RAIL_GET_RSSI_NO_WAIT](receive#sl-rail-get-rssi-no-wait) is given for wait_timeout_us, the radio needs to be currently in RX and have been in there for a sufficient amount of time for a fresh RSSI value to be read and returned. Otherwise the RSSI is considered stale and [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) is returned instead. For non-zero values of wait_timeout_us, if the radio is transitioning to or already in RX, this function will wait a maximum time equal to wait_timeout_us (or indefinitely if wait_timeout_us is set to [SL_RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT](receive#sl-rail-get-rssi-wait-without-timeout)) for a valid RSSI to be read and return it. Otherwise, if the wait_timeout_us is reached, or the radio is in or transitions to IDLE or TX, [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) will be returned. On low datarate PHYs, this function can take a significantly longer time when wait_timeout_us is non-zero.

In multiprotocol, this function returns [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) immediately if rail_handle is not the currently active [sl_rail_handle_t](general#sl-rail-handle-t). Additionally, wait_timeout_us should never be set to a value other than [SL_RAIL_GET_RSSI_NO_WAIT](receive#sl-rail-get-rssi-no-wait) in multiprotocol as the integration between this feature and the radio scheduler has not been implemented.

**Note**

- If RX Antenna Diversity is enabled via [sl_rail_config_rx_options()](receive#sl-rail-config-rx-options), pass true for the wait parameter otherwise it's very likely [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) will be returned.
- If RX Antenna Diversity is enabled via [sl_rail_config_rx_options()](receive#sl-rail-config-rx-options), the RSSI value returned could come from either antenna and vary between antennas.
- If RX channel hopping is turned on, do not use this API. Instead, see [sl_rail_get_channel_hopping_rssi()](rx-channel-hopping#sl-rail-get-channel-hopping-rssi).

###### sl_rail_start_average_rssi

`sl_rail_status_t sl_rail_start_average_rssi(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_time_t averaging_time_us, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Start the RSSI averaging over a specified time in us.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The physical channel to set.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|averaging_time_us|Averaging time in microseconds.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this operation appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call.

Starts a non-blocking hardware-based RSSI averaging mechanism. Only a single instance of RSSI averaging can be run at any time and the radio must be idle to start.

In multiprotocol, this is a scheduled event. It will start when rail_handle becomes active. rail_handle needs to stay active until the averaging completes. If the averaging is interrupted, calls to [sl_rail_get_average_rssi()](receive#sl-rail-get-average-rssi) will return [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid).

Also in multiprotocol, the user is required to call [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) after this event completes (i.e., when [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done) occurs).

**Note**

- If the radio is idled while RSSI averaging is still in effect, a [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done) event may not occur and [sl_rail_is_average_rssi_ready()](receive#sl-rail-is-average-rssi-ready) may never return true.
- Completion of RSSI averaging, marked by RAIL event [SL_RAIL_EVENT_RSSI_AVERAGE_DONE](events#sl-rail-event-rssi-average-done), will return the radio to idle state.

###### sl_rail_is_average_rssi_ready

`bool sl_rail_is_average_rssi_ready(sl_rail_handle_t rail_handle)`

**Description:** Query whether the RSSI averaging is done.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if done and false otherwise.

This function can be used to poll for completion of the RSSI averaging to avoid relying on an interrupt-based callback.

**Note**

- If the radio is idled while RSSI averaging is still in effect, this function may never return true.

###### sl_rail_get_average_rssi

`int16_t sl_rail_get_average_rssi(sl_rail_handle_t rail_handle)`

**Description:** Get the RSSI in quarter-dBm averaged over a specified time in microseconds.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The RSSI in quarter-dBm (dBm * 4), or [SL_RAIL_RSSI_INVALID](receive#sl-rail-rssi-invalid) if the receiver is disabled or an an RSSI value couldn't be obtained.

Gets the hardware RSSI average after issuing [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi). Use after [sl_rail_start_average_rssi()](receive#sl-rail-start-average-rssi). 

###### sl_rail_set_rssi_offset

`sl_rail_status_t sl_rail_set_rssi_offset(sl_rail_handle_t rail_handle, int8_t rssi_offset_db)`

**Description:** Set an RSSI offset.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|a radio-generic or real RAIL instance handle.|
|int8_t|[in]|rssi_offset_db|desired dB offset to be added to the RSSI measurements.|

**Returns**

- Status code indicating success of the function call. [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if called with radio-generic handle, such as [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle), after RAIL initialization. [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if the RSSI offset is deemed large enough to cause the RSSI readings to underflow or overflow.

Adds an offset to the RSSI in dBm. This offset affects all functionality that depends on RSSI values, such as CCA functions. Do not modify the offset dynamically during packet reception. This function can only be called while the radio is off, or in the case of multiprotocol, on an inactive protocol.

**Note**

- : Prior to RAIL being initialized, a radio-wide protocol-independent offset can be established using a radio-generic handle like [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle). The radio RSSI offset can range from -50 to +20 dB.<br />  
   After RAIL has been initialized a real RAIL protocol handle must be provided to set a protocol-specific RSSI offset, which is added to any radio offset (plus a per-PHY offset set by the radio calculator). The absolute value of the overall sum of all these offsets cannot exceed [SL_RAIL_RSSI_OFFSET_MAX](receive#sl-rail-rssi-offset-max) otherwise RSSIs could underflow or overflow.
- : During [RX Channel Hopping](rx-channel-hopping) this API will not update the RSSI offset immediately if channel hopping has already been configured. A subsequent call to [sl_rail_zwave_config_rx_channel_hopping()](z-wave#sl-rail-zwave-config-rx-channel-hopping) or [sl_rail_config_rx_channel_hopping()](rx-channel-hopping#sl-rail-config-rx-channel-hopping) is required for the new RSSI offset to take effect.

###### sl_rail_get_rssi_offset

`int8_t sl_rail_get_rssi_offset(sl_rail_handle_t rail_handle)`

**Description:** Get the radio or protocol RSSI offset in dB.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- The RSSI offset in dB corresponding to the rail_handle.

**Note**

- : A radio-generic handle, such as [SL_RAIL_EFR32_HANDLE](general#sl-rail-efr32-handle), can be used to get the radio's RSSI offset otherwise this will return the RSSI offset value associated with the RAIL protocol instance handle, exclusive of any radio or PHY-specific RSSI offset correction, if any.

###### sl_rail_set_rssi_detect_threshold

`sl_rail_status_t sl_rail_set_rssi_detect_threshold(sl_rail_handle_t rail_handle, int8_t rssi_threshold_dbm)`

**Description:** Set the RSSI detection threshold in dBm to trigger [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|int8_t|[in]|rssi_threshold_dbm|desired RSSI threshold in dBm over which the event [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) is triggered.|

**Returns**

- Status code indicating success of the function call. Returns [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) in multiprotocol, if the requested rail_handle is not active. Returns [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if called on parts on which this function is not supported.

When in receive, RSSI is sampled and if it exceeds the threshold, [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) is triggered.

**Note**

- : If the radio is idled or this function is called with rssi_threshold_dbm as [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm) while RSSI detect is still in effect, a [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) may not occur and the detection is disabled. If the RSSI is already above threshold when this function is called then [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) will occur. Once the RSSI goes over the configured threshold and [SL_RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#sl-rail-event-detect-rssi-threshold) occurs, this function needs to be called again to reactivate the RSSI threshold detection.

This function is only available on EFR32 Series 2 Sub-GHz parts EFR32xG23 and EFR32xG25. 

###### sl_rail_get_rssi_detect_threshold

`int8_t sl_rail_get_rssi_detect_threshold(sl_rail_handle_t rail_handle)`

**Description:** Get the RSSI detection threshold in dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The RSSI threshold in dBm corresponding to the rail_handle.

**Note**

- : The function returns [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm) when [sl_rail_set_rssi_detect_threshold()](receive#sl-rail-set-rssi-detect-threshold) is not supported or disabled. In multiprotocol, the function returns [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm) if rail_handle is not active.

This function is only available on EFR32 Series 2 Sub-GHz parts EFR32xG23 and EFR32xG25. 

###### sl_rail_get_rx_incoming_packet_rssi

`int8_t sl_rail_get_rx_incoming_packet_rssi(sl_rail_handle_t rail_handle)`

**Description:** Return the RSSI associated with the incoming packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The RSSI on the incoming packet in dBm, or [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm) if not available.

This function can only be called from callback context, e.g., when handling [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed) or [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command). 

###### sl_rail_convert_lqi

`sl_rail_status_t sl_rail_convert_lqi(sl_rail_handle_t rail_handle, sl_rail_convert_lqi_callback_t lqi_callback)`

**Description:** Set up a callback function capable of converting a RX packet's LQI value before being consumed by application code.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_convert_lqi_callback_t](receive#sl-rail-convert-lqi-callback-t)|[in]|lqi_callback|A callback of type [sl_rail_convert_lqi_callback_t()](receive#sl-rail-convert-lqi-callback-t) that is called before the RX packet LQI value is loaded into the [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) structure for application consumption.|

**Returns**

- Status code indicating success of the function call.

##### Macros

`#define RAIL_RX_OPTIONS_NONE 0`

**Description**: A value representing no options enabled.

`#define RAIL_RX_OPTIONS_DEFAULT RAIL_RX_OPTIONS_NONE`

**Description**: All options are disabled by default.

`#define RAIL_RX_OPTION_STORE_CRC (1UL << RAIL_RX_OPTION_STORE_CRC_SHIFT)`

**Description**: An option to configure whether the CRC portion of the packet is included in the packet payload exposed to the app on packet reception.

`#define RAIL_RX_OPTION_IGNORE_CRC_ERRORS (1UL << RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT)`

**Description**: An option to configure whether CRC errors will be ignored.

`#define RAIL_RX_OPTION_ENABLE_DUALSYNC (1UL << RAIL_RX_OPTION_ENABLE_DUALSYNC_SHIFT)`

**Description**: An option to control which sync words will be accepted.

`#define RAIL_RX_OPTION_TRACK_ABORTED_FRAMES (1UL << RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT)`

**Description**: An option to configure whether frames which are aborted during reception should continue to be tracked.

`#define RAIL_RX_OPTION_REMOVE_APPENDED_INFO (1UL << RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT)`

**Description**: An option to suppress capturing the appended information after received frames.

`#define RAIL_RX_OPTION_ANTENNA0 (1UL << RAIL_RX_OPTION_ANTENNA0_SHIFT)`

**Description**: An option to select the use of antenna 0 during receive (including [Auto-Ack](auto-ack) receive).

`#define RAIL_RX_OPTION_ANTENNA1 (1UL << RAIL_RX_OPTION_ANTENNA1_SHIFT)`

**Description**: An option to select the use of antenna 1 during receive (including [Auto-Ack](auto-ack) receive).

`#define RAIL_RX_OPTION_ANTENNA_AUTO (RAIL_RX_OPTION_ANTENNA0 | RAIL_RX_OPTION_ANTENNA1)`

**Description**: An option combination to automatically choose an antenna during receive (including [Auto-Ack](auto-ack) receive).

`#define RAIL_RX_OPTION_DISABLE_FRAME_DETECTION (1UL << RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT)`

**Description**: An option to disable frame detection.

`#define RAIL_RX_OPTION_CHANNEL_SWITCHING (1U << RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT)`

**Description**: An option to enable IEEE 802.15.4 RX channel switching.

`#define RAIL_RX_OPTION_FAST_RX2RX (1U << RAIL_RX_OPTION_FAST_RX2RX_SHIFT)`

**Description**: An option to enable fast RX2RX state transition.

`#define RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION (1U << RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT)`

**Description**: An option to enable collision detection.

`#define RAIL_RX_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define RAIL_RSSI_INVALID_DBM (-128)`

**Description**: The value returned by RAIL for an invalid RSSI, in dBm.

`#define RAIL_RSSI_INVALID ((int16_t)(RAIL_RSSI_INVALID_DBM * 4))`

**Description**: The value returned by RAIL for an invalid RSSI: in quarter dBm.

`#define RAIL_RSSI_LOWEST ((int16_t)(RAIL_RSSI_INVALID + 1))`

**Description**: The lowest RSSI value returned by RAIL: in quarter dBm.

`#define RAIL_RSSI_OFFSET_MAX 35`

**Description**: Maximum absolute value for RSSI offset.

`#define RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT ((RAIL_Time_t)0xFFFFFFFFU)`

**Description**: A sentinel value to indicate waiting for a valid RSSI without a timeout.

`#define RAIL_GET_RSSI_NO_WAIT ((RAIL_Time_t)0U)`

**Description**: A sentinel value to indicate no waiting for a valid RSSI.

`#define RAIL_RX_PACKET_HANDLE_INVALID (NULL)`

**Description**: An invalid RX packet handle value.

`#define RAIL_RX_PACKET_HANDLE_OLDEST ((RAIL_RxPacketHandle_t) 1)`

**Description**: A special RX packet handle to refer to the oldest unreleased packet.

`#define RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE ((RAIL_RxPacketHandle_t) 2)`

**Description**: A special RX packet handle to refer to the oldest unreleased complete packet.

`#define RAIL_RX_PACKET_HANDLE_NEWEST ((RAIL_RxPacketHandle_t) 3)`

**Description**: A special RX packet handle to refer to the newest unreleased packet when in callback context.

`#define SL_RAIL_RX_OPTIONS_NONE 0`

**Description**: A value representing no options enabled.

`#define SL_RAIL_RX_OPTIONS_DEFAULT SL_RAIL_RX_OPTIONS_NONE`

**Description**: All options are disabled by default.

`#define SL_RAIL_RX_OPTION_STORE_CRC (1UL << SL_RAIL_RX_OPTION_STORE_CRC_SHIFT)`

**Description**: An option to configure whether the CRC portion of the packet is included in the packet payload exposed to the app on packet reception.

`#define SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS (1UL << SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS_SHIFT)`

**Description**: An option to configure whether CRC errors will be ignored.

`#define SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC (1UL << SL_RAIL_RX_OPTION_ENABLE_DUAL_SYNC_SHIFT)`

**Description**: An option to control which sync words will be accepted.

`#define SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES (1UL << SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES_SHIFT)`

**Description**: An option to configure whether frames which are aborted during reception should continue to be tracked.

`#define SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO (1UL << SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO_SHIFT)`

**Description**: An option to suppress capturing the appended information after received frames.

`#define SL_RAIL_RX_OPTION_ANTENNA_0 (1UL << SL_RAIL_RX_OPTION_ANTENNA_0_SHIFT)`

**Description**: An option to select the use of antenna 0 during receive (including [Auto-Ack](auto-ack) receive).

`#define SL_RAIL_RX_OPTION_ANTENNA_1 (1UL << SL_RAIL_RX_OPTION_ANTENNA_1_SHIFT)`

**Description**: An option to select the use of antenna 1 during receive (including [Auto-Ack](auto-ack) receive).

`#define SL_RAIL_RX_OPTION_ANTENNA_AUTO (SL_RAIL_RX_OPTION_ANTENNA_0 | SL_RAIL_RX_OPTION_ANTENNA_1)`

**Description**: An option combination to automatically choose an antenna during receive (including [Auto-Ack](auto-ack) receive).

`#define SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION (1UL << SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION_SHIFT)`

**Description**: An option to disable frame detection.

`#define SL_RAIL_RX_OPTION_CHANNEL_SWITCHING (1U << SL_RAIL_RX_OPTION_CHANNEL_SWITCHING_SHIFT)`

**Description**: An option to enable IEEE 802.15.4 RX channel switching.

`#define SL_RAIL_RX_OPTION_FAST_RX_TO_RX (1U << SL_RAIL_RX_OPTION_FAST_RX_TO_RX_SHIFT)`

**Description**: An option to enable fast RX-to-RX state transition.

`#define SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION (1U << SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION_SHIFT)`

**Description**: An option to enable collision detection.

`#define SL_RAIL_RX_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define SL_RAIL_RSSI_INVALID_DBM (-128)`

**Description**: The value returned by RAIL for an invalid RSSI, in dBm.

`#define SL_RAIL_RSSI_INVALID ((int16_t)(SL_RAIL_RSSI_INVALID_DBM * 4))`

**Description**: The value returned by RAIL for an invalid RSSI: in quarter dBm.

`#define SL_RAIL_RSSI_LOWEST ((int16_t)(SL_RAIL_RSSI_INVALID + 1))`

**Description**: The lowest RSSI value returned by RAIL: in quarter dBm.

`#define SL_RAIL_RSSI_OFFSET_MAX 35`

**Description**: Maximum absolute value for RSSI offset.

`#define SL_RAIL_GET_RSSI_WAIT_WITHOUT_TIMEOUT ((sl_rail_time_t)0xFFFFFFFFU)`

**Description**: A sentinel value to indicate waiting for a valid RSSI without a timeout.

`#define SL_RAIL_GET_RSSI_NO_WAIT ((sl_rail_time_t)0U)`

**Description**: A sentinel value to indicate no waiting for a valid RSSI.

`#define SL_RAIL_RX_PACKET_HANDLE_INVALID (NULL)`

**Description**: An invalid RX packet handle value.

`#define SL_RAIL_RX_PACKET_HANDLE_OLDEST ((sl_rail_rx_packet_handle_t) 1)`

**Description**: A special RX packet handle to refer to the oldest unreleased packet.

`#define SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE ((sl_rail_rx_packet_handle_t) 2)`

**Description**: A special RX packet handle to refer to the oldest unreleased complete packet.

`#define SL_RAIL_RX_PACKET_HANDLE_NEWEST ((sl_rail_rx_packet_handle_t) 3)`

**Description**: A special RX packet handle to refer to the newest unreleased packet when in callback context.

Configures the scheduled RX algorithm. 

Defines the start and end times of the receive window created for a scheduled receive. If either start or end times are disabled, they will be ignored.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t](sl-rail-scheduled-rx-config-t). 

###### Public Attributes

###### start (heading level 7)

```
RAIL_Time_t RAIL_ScheduleRxConfig_t::start
```

**Description:** The time to start receive.

**Details:** See startMode for more information about the types of start times that you can specify.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::start](sl-rail-scheduled-rx-config-t#start).

###### startMode (heading level 7)

```
RAIL_TimeMode_t RAIL_ScheduleRxConfig_t::startMode
```

**Description:** How to interpret the time value specified in the start parameter.

**Details:** See the [RAIL_TimeMode_t](system-timing#rail-time-mode-t) documentation for more information. Use [RAIL_TIME_ABSOLUTE](system-timing#rail-time-absolute) for absolute times, [RAIL_TIME_DELAY](system-timing#rail-time-delay) for times relative to the current time and [RAIL_TIME_DISABLED](system-timing#rail-time-disabled) to ignore the start time.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::start_mode](sl-rail-scheduled-rx-config-t#start-mode).

###### end (heading level 7)

```
RAIL_Time_t RAIL_ScheduleRxConfig_t::end
```

**Description:** The time to end receive.

**Details:** See endMode for more information about the types of end times you can specify.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::end](sl-rail-scheduled-rx-config-t#end).

###### endMode (heading level 7)

```
RAIL_TimeMode_t RAIL_ScheduleRxConfig_t::endMode
```

**Description:** How to interpret the time value specified in the end parameter.

**Details:** See the [RAIL_TimeMode_t](system-timing#rail-time-mode-t) documentation for more information. Note that, in this API, if you specify a [RAIL_TIME_DELAY](system-timing#rail-time-delay), it is relative to the start time if given and relative to now if none is specified. Also, using [RAIL_TIME_DISABLED](system-timing#rail-time-disabled) means that this window will not end unless you explicitly call [RAIL_Idle()](state-transitions#rail-idle-1) or add an end event through a future update to this configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::end_mode](sl-rail-scheduled-rx-config-t#end-mode).

###### rxTransitionEndSchedule (heading level 7)

```
uint8_t RAIL_ScheduleRxConfig_t::rxTransitionEndSchedule
```

**Description:** While in scheduled RX, you can still control the radio state via state transitions.

**Details:** This option configures whether a transition to RX goes back to scheduled RX or to the normal RX state. Once in the normal RX state, you will effectively end the scheduled RX window and can continue to receive indefinitely depending on the state transitions. Set to 1 to transition to normal RX and 0 to stay in the scheduled RX.

This setting also influences the posting of [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) when the scheduled Rx window is implicitly ended by a packet receive (any of the [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion) events). See that event for details.

**Note**

- An Rx transition to Idle state will always terminate the scheduled Rx window, regardless of this setting. This can be used to ensure Scheduled RX terminates on the first packet received (or first successful packet if the RX error transition is to Rx while the Rx success transition is to Idle).

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::rx_transition_end_schedule](sl-rail-scheduled-rx-config-t#rx-transition-end-schedule).

###### hardWindowEnd (heading level 7)

```
uint8_t RAIL_ScheduleRxConfig_t::hardWindowEnd
```

**Description:** This setting tells RAIL what to do with a packet being received when the window end event occurs.

**Details:** If set to 0, such a packet will be allowed to complete. Any other setting will cause that packet to be aborted. In either situation, any posting of [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) is deferred briefly to when the packet's corresponding [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion) occurs.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_rx_config_t::hard_window_end](sl-rail-scheduled-rx-config-t#hard-window-end).

Basic information about a packet being received or already completed and awaiting processing, including memory pointers to its data in the circular receive FIFO buffer. 

This packet information refers to remaining packet data that has not already been consumed by [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo).

**Note**

- Because the receive FIFO buffer is circular, a packet might start near the end of the buffer and wrap around to the beginning of the buffer to finish, hence the distinction between the first and last portions. Packets that fit without wrapping only have a first portion (firstPortionBytes == packetBytes and lastPortionData will be NULL).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t). 

###### Public Attributes

###### packetStatus (heading level 7)

```
RAIL_RxPacketStatus_t RAIL_RxPacketInfo_t::packetStatus
```

**Description:** The packet status of this packet.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::packet_status](sl-rail-rx-packet-info-t#packet-status).

###### packetBytes (heading level 7)

```
uint16_t RAIL_RxPacketInfo_t::packetBytes
```

**Description:** The number of packet data bytes available to read in this packet.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::packet_bytes](sl-rail-rx-packet-info-t#packet-bytes).

###### firstPortionBytes (heading level 7)

```
uint16_t RAIL_RxPacketInfo_t::firstPortionBytes
```

**Description:** The number of bytes in the first portion.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::first_portion_bytes](sl-rail-rx-packet-info-t#first-portion-bytes).

###### firstPortionData (heading level 7)

```
uint8_t* RAIL_RxPacketInfo_t::firstPortionData
```

**Description:** The pointer to the first portion of packet data containing firstPortionBytes number of bytes.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::p_first_portion_data](sl-rail-rx-packet-info-t#p-first-portion-data).

###### lastPortionData (heading level 7)

```
uint8_t* RAIL_RxPacketInfo_t::lastPortionData
```

**Description:** The pointer to the last portion of a packet, if any; NULL otherwise.

**Details:** The number of bytes in this portion is packetBytes - firstPortionBytes.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::p_last_portion_data](sl-rail-rx-packet-info-t#p-last-portion-data).

###### filterMask (heading level 7)

```
RAIL_AddrFilterMask_t RAIL_RxPacketInfo_t::filterMask
```

**Description:** A bitmask representing which address filter(s) this packet has passed.

**Details:** Will be 0 when not filtering or if packet info is retrieved before filtering has completed. It's undefined on platforms lacking [RAIL_SUPPORTS_ADDR_FILTER_MASK](features#rail-supports-addr-filter-mask-1).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_info_t::filter_mask](sl-rail-rx-packet-info-t#filter-mask).

Received packet details obtained via [RAIL_GetRxPacketDetails()](packet-information#rail-get-rx-packet-details) or [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt). 

**Note**

- Certain details are always available, while others are only available if the [RAIL_RxOptions_t](receive#rail-rx-options-t)[RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info) option is not in effect and the received packet's [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) is among the RAIL_RX_PACKET_READY_ set. Each detail's description indicates its availability.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t). 

###### Public Attributes

###### timeReceived (heading level 7)

```
RAIL_PacketTimeStamp_t RAIL_RxPacketDetails_t::timeReceived
```

**Description:** The time stamp of the received packet in the RAIL timebase.

**Details:** When not available it will be [RAIL_PACKET_TIME_INVALID](system-timing#rail-packet-time-invalid).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received).

###### crcPassed (heading level 7)

```
bool RAIL_RxPacketDetails_t::crcPassed
```

**Description:** Indicates whether the received packet successfully passed CRC checks or failed (not just CRC failure).

**Details:** It is true for [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success) packets and false for all other [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) values reported in [RAIL_RxPacketInfo_t::packetStatus](rail-rx-packet-info-t#packet-status).

It is always available.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::crc_passed](sl-rail-rx-packet-details-t#crc-passed).

###### isAck (heading level 7)

```
bool RAIL_RxPacketDetails_t::isAck
```

**Description:** Indicate whether the received packet was the expected Ack.

**Details:** It is true for the expected Ack and false otherwise.

It is always available.

An expected Ack is defined as a protocol-correct Ack packet successfully-received ([RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success) or [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error)) and whose sync word was detected within the [RAIL_AutoAckConfig_t::ackTimeout](rail-auto-ack-config-t#ack-timeout) period following a transmit which specified [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack), requested an Ack, and Auto-Ack is enabled. When true, the ackTimeout period was terminated so no [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) will be subsequently posted for the transmit.

A "protocol-correct Ack" applies to the 802.15.4 or Z-Wave protocols for which RAIL can discern the frame type and match the Ack's sequence number with that of the transmitted frame. For other protocols, the first packet successfully-received whose sync word was detected within the [RAIL_AutoAckConfig_t::ackTimeout](rail-auto-ack-config-t#ack-timeout) period is considered the expected Ack; upper layers are responsible for confirming this.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::is_ack](sl-rail-rx-packet-details-t#is-ack).

###### rssi (heading level 7)

```
int8_t RAIL_RxPacketDetails_t::rssi
```

**Description:** RSSI of the received packet in integer dBm.

**Details:** This RSSI measurement is started as soon as the sync word is detected. The duration of the measurement is PHY-specific.

When not available it will be [RAIL_RSSI_INVALID_DBM](receive#rail-rssi-invalid-dbm).

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::rssi_dbm](sl-rail-rx-packet-details-t#rssi-dbm).

###### lqi (heading level 7)

```
uint8_t RAIL_RxPacketDetails_t::lqi
```

**Description:** The link quality indicator of the received packet.

**Details:** A zero would indicate a very low quality packet while a 255 would indicate a very high quality packet.

When not available it will be 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::lqi](sl-rail-rx-packet-details-t#lqi).

###### syncWordId (heading level 7)

```
uint8_t RAIL_RxPacketDetails_t::syncWordId
```

**Description:** For radios and PHY configurations that support multiple sync words, this number is the ID of the sync word that was used for this packet.

**Details:** It is always available.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::sync_word_id](sl-rail-rx-packet-details-t#sync-word-id).

###### subPhyId (heading level 7)

```
uint8_t RAIL_RxPacketDetails_t::subPhyId
```

**Description:** In configurations where the radio has the option of receiving a given packet in multiple ways, indicates which of the sub-PHY options was used to receive the packet.

**Details:** Most radio configurations do not have this ability and the subPhyId is set to 0.

Currently, this field is used by the BLE Coded PHY, the BLE Simulscan PHY and the SUN OFDM PHYs. In BLE cases, a value of 0 marks a 500 kbps packet, a value of 1 marks a 125 kbps packet, and a value of 2 marks a 1 Mbps packet. Also, see [RAIL_BLE_ConfigPhyCoded()](ble#rail-ble-config-phy-coded) and [RAIL_BLE_ConfigPhySimulscan()](ble#rail-ble-config-phy-simulscan).

In SUN OFDM cases, the value corresponds to the numerical value of the Modulation and Coding Scheme (MCS) level of the last received packet. The packet bitrate depends on the MCS value, as well as the OFDM option. Packets bitrates for SUN OFDM PHYs can be found in 802.15.4-2020 specification, chapter 20.3, table 20-10. Ex: Packet bitrate for OFDM option 1 MCS0 is 100kb/s and 2400kb/s for MCS6.

In WMBUS cases, when using PHY_wMbus_ModeTC_M2O_100k_frameA with simultaneous RX of T and C modes enabled ([RAIL_WMBUS_Config()](wmbus#rail-wmbus-config)), the value corresponds to [RAIL_WMBUS_Phy_t](wmbus#rail-wmbus-phy-t).

It is always available.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::sub_phy_id](sl-rail-rx-packet-details-t#sub-phy-id).

###### antennaId (heading level 7)

```
uint8_t RAIL_RxPacketDetails_t::antennaId
```

**Description:** For [Antenna Control](antenna-control) configurations where the device has multiple antennas, this indicates which antenna received the packet.

**Details:** When there is only one antenna, this will be set to the default of 0.

It is always available.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::antenna_id](sl-rail-rx-packet-details-t#antenna-id).

###### channelHoppingChannelIndex (heading level 7)

```
uint8_t RAIL_RxPacketDetails_t::channelHoppingChannelIndex
```

**Description:** When channel hopping is enabled, this field will contain the index of the channel in [RAIL_RxChannelHoppingConfig_t::entries](rail-rx-channel-hopping-config-t#entries) on which this packet was received, or a sentinel value.

**Details:** It is always available.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::channel_hopping_channel_index](sl-rail-rx-packet-details-t#channel-hopping-channel-index).

###### channel (heading level 7)

```
uint16_t RAIL_RxPacketDetails_t::channel
```

**Description:** The channel on which the packet was received.

**Details:** It is always available.

**Note**

- It is best to fully process (empty or clear) the receive FIFO before changing channel configurations ([RAIL_ConfigChannels()](radio-configuration#rail-config-channels) or a built-in configuration) as unprocessed packets' channel could reflect the wrong configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_rx_packet_details_t::channel](sl-rail-rx-packet-details-t#channel).

Configures the automatic PRS LNA bypass. 

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t](sl-rail-prs-lna-bypass-config-t). 

###### Public Attributes

###### timeoutUs (heading level 7)

```
uint32_t RAIL_PrsLnaBypassConfig_t::timeoutUs
```

**Description:** Maximum time in microseconds to wait for frame detection after the LNA has been bypassed.

**Details:** It must be greater than 0 to enable automatic PRS LNA bypass with [RAIL_EnablePrsLnaBypass()](receive#rail-enable-prs-lna-bypass).

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::timeout_us](sl-rail-prs-lna-bypass-config-t#timeout-us).

###### threshold (heading level 7)

```
uint8_t RAIL_PrsLnaBypassConfig_t::threshold
```

**Description:** Threshold (without unit) from which LNA bypass is turned on.

**Details:** The table below shows EFR32XG25 thresholds corresponding to received power level without the LNA gain.

|Level dBm|FSK_1a|FSK_1b|FSK_2a|FSK_2b|FSK_3|FSK_4a|FSK_4b|FSK_5|OFDM1|OFDM2|OFDM3|OFDM4|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**-25**|||||||||9|9|9|10|
|**-20**||7|7|7|8|8|7|8|11|12|12|12|
|**-15**|7|10|10|10|9|9|10|10|14|14|14|15|
|**-10**|9|12|12|12|12|12|12|12|16|16|16|16|
|**-5**|11|14|14|14|16|16|14|16|||||
|**0**|14|17|18|17|17|18|18|18|||||

For example, with OFDM1 PHY, setting the threshold to 11 will turn on the bypass when the power level at EFR32XG25 input is greater than -20 dBm.

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::threshold](sl-rail-prs-lna-bypass-config-t#threshold).

###### deltaRssiDbm (heading level 7)

```
uint8_t RAIL_PrsLnaBypassConfig_t::deltaRssiDbm
```

**Description:** Compensation in dB applied by RAIL to RSSI during LNA bypass.

**Details:** The RSSI offset set using [RAIL_SetRssiOffset()](receive#rail-set-rssi-offset) must corespond to the case with FEM LNA not bypassed. deltaRssiDbm is typically the FEM LNA gain value.

**Note**

- This field's units are dB not dBm; it was misnamed and retains Dbm suffix for backward compatibility.

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::delta_rssi_db](sl-rail-prs-lna-bypass-config-t#delta-rssi-db).

###### prsChannel (heading level 7)

```
uint8_t RAIL_PrsLnaBypassConfig_t::prsChannel
```

**Description:** PRS Channel used for the bypass.

**Details:** PRS_GetFreeChannel() can be use to find a free channel. Then the signal can be routed to GPIO pin and port using PRS_PinOutput(). This allows logical operations with other PRS channels and so to adapt to the FEM control logic table. Any call to PRS_Combine() with [RAIL_PrsLnaBypassConfig_t::prsChannel](rail-prs-lna-bypass-config-t#prs-channel) as chA must be done after the [RAIL_EnablePrsLnaBypass()](receive#rail-enable-prs-lna-bypass) call.

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::prs_channel](sl-rail-prs-lna-bypass-config-t#prs-channel).

###### polarity (heading level 7)

```
bool RAIL_PrsLnaBypassConfig_t::polarity
```

**Description:** PRS signal polarity for bypass.

**Details:** With a polarity of 1, PRS signal is set to 1 for bypass and 0 for un-bypass. with a polarity of 0, PRS signal is set to 0 for bypass and 1 for un-bypass.

**Deprecated**RAIL 2.x synonym of [sl_rail_prs_lna_bypass_config_t::polarity](sl-rail-prs-lna-bypass-config-t#polarity).

Configures the scheduled RX algorithm. 

Defines the start and end times of the receive window created for a scheduled receive. If either start or end times are disabled, they will be ignored. 

###### Public Attributes

###### start (heading level 7)

```
sl_rail_time_t sl_rail_scheduled_rx_config_t::start
```

**Description:** The time to start receive.

**Details:** See start_mode for more information about the types of start times that you can specify.

###### start_mode (heading level 7)

```
sl_rail_time_mode_t sl_rail_scheduled_rx_config_t::start_mode
```

**Description:** How to interpret the time value specified in the start parameter.

**Details:** See the [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t) documentation for more information. Use [SL_RAIL_TIME_ABSOLUTE](system-timing#sl-rail-time-absolute) for absolute times, [SL_RAIL_TIME_DELAY](system-timing#sl-rail-time-delay) for times relative to the current time and [SL_RAIL_TIME_DISABLED](system-timing#sl-rail-time-disabled) to ignore the start time.

###### end (heading level 7)

```
sl_rail_time_t sl_rail_scheduled_rx_config_t::end
```

**Description:** The time to end receive.

**Details:** See end_mode for more information about the types of end times you can specify.

###### end_mode (heading level 7)

```
sl_rail_time_mode_t sl_rail_scheduled_rx_config_t::end_mode
```

**Description:** How to interpret the time value specified in the end parameter.

**Details:** See the [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t) documentation for more information. Note that, in this API, if you specify a [SL_RAIL_TIME_DELAY](system-timing#sl-rail-time-delay), it is relative to the start time if given and relative to now if none is specified. Also, using [SL_RAIL_TIME_DISABLED](system-timing#sl-rail-time-disabled) means that this window will not end unless you explicitly call [sl_rail_idle()](state-transitions#sl-rail-idle-1) or add an end event through a future update to this configuration.

###### rx_transition_end_schedule (heading level 7)

```
uint8_t sl_rail_scheduled_rx_config_t::rx_transition_end_schedule
```

**Description:** While in scheduled RX, you can still control the radio state via state transitions.

**Details:** This option configures whether a transition to RX goes back to scheduled RX or to the normal RX state. Once in the normal RX state, you will effectively end the scheduled RX window and can continue to receive indefinitely depending on the state transitions. Set to 1 to transition to normal RX and 0 to stay in the scheduled RX.

**Note**

- This field's behavior differs from RAIL 2.x behavior: In RAIL 2.x when this field is true, it would suppress [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) when the scheduled Rx window is implicitly ended by a packet receive (any of the [SL_RAIL_EVENTS_RX_COMPLETION](events#sl-rail-events-rx-completion) events). In RAIL 3 the [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) is never suppressed.
- An Rx transition to Idle state will always terminate the scheduled Rx window, regardless of this setting. This can be used to ensure Scheduled RX terminates on the first packet received (or first successful packet if the RX error transition is to Rx while the Rx success transition is to Idle).

###### hard_window_end (heading level 7)

```
uint8_t sl_rail_scheduled_rx_config_t::hard_window_end
```

**Description:** This setting tells RAIL what to do with a packet being received when the window end event occurs.

**Details:** If set to 0, such a packet will be allowed to complete. Any other setting will cause that packet to be aborted. In either situation, any posting of [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](events#sl-rail-event-rx-scheduled-rx-end) is deferred briefly to when the packet's corresponding [SL_RAIL_EVENTS_RX_COMPLETION](events#sl-rail-events-rx-completion) occurs.

Basic information about a packet being received or already completed and awaiting processing, including memory pointers to its data in the circular receive FIFO buffer. 

This packet information refers to remaining packet data that has not already been consumed by [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo). **Note**

- Because the receive FIFO buffer is circular, a packet might start near the end of the buffer and wrap around to the beginning of the buffer to finish, hence the distinction between the first and last portions. Packets that fit without wrapping only have a first portion (first_portion_bytes == packet_bytes and last_portion_data will be NULL).

###### Public Attributes

###### packet_status (heading level 7)

```
sl_rail_rx_packet_status_t sl_rail_rx_packet_info_t::packet_status
```

**Description:** The packet status of this packet.

###### packet_bytes (heading level 7)

```
uint16_t sl_rail_rx_packet_info_t::packet_bytes
```

**Description:** The number of packet data bytes available to read in this packet.

###### first_portion_bytes (heading level 7)

```
uint16_t sl_rail_rx_packet_info_t::first_portion_bytes
```

**Description:** The number of bytes in the first portion.

###### p_first_portion_data (heading level 7)

```
uint8_t* sl_rail_rx_packet_info_t::p_first_portion_data
```

**Description:** The pointer to the first portion of packet data containing first_portion_bytes number of bytes.

###### p_last_portion_data (heading level 7)

```
uint8_t* sl_rail_rx_packet_info_t::p_last_portion_data
```

**Description:** The pointer to the last portion of a packet, if any; NULL otherwise.

**Details:** The number of bytes in this portion is packet_bytes - first_portion_bytes.

###### filter_mask (heading level 7)

```
sl_rail_addr_filter_mask_t sl_rail_rx_packet_info_t::filter_mask
```

**Description:** A bitmask representing which address filter(s) this packet has passed.

**Details:** Will be 0 when not filtering or if packet info is retrieved before filtering has completed. It's undefined on platforms lacking [SL_RAIL_SUPPORTS_ADDR_FILTER_MASK](features#sl-rail-supports-addr-filter-mask-1)

Received packet details obtained via [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details). 

**Note**

- Certain details are always available, while others are only available if the [sl_rail_rx_options_t](receive#sl-rail-rx-options-t)[SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#sl-rail-rx-option-remove-appended-info) option is not in effect and the received packet's [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) is among the SL_RAIL_RX_PACKET_READY_ set. Each detail's description indicates its availability.

###### Public Attributes

###### time_received (heading level 7)

```
sl_rail_packet_time_stamp_t sl_rail_rx_packet_details_t::time_received
```

**Description:** The time stamp of the received packet in the RAIL timebase.

**Details:** When not available it will be [SL_RAIL_PACKET_TIME_INVALID](system-timing#sl-rail-packet-time-invalid).

###### crc_passed (heading level 7)

```
bool sl_rail_rx_packet_details_t::crc_passed
```

**Description:** Indicates whether the received packet successfully passed CRC checks or failed (not just CRC failure).

**Details:** It is true for [SL_RAIL_RX_PACKET_READY_SUCCESS](receive#sl-rail-rx-packet-ready-success) packets and false for all other [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) values reported in [sl_rail_rx_packet_info_t::packet_status](sl-rail-rx-packet-info-t#packet-status).

It is always available.

###### is_ack (heading level 7)

```
bool sl_rail_rx_packet_details_t::is_ack
```

**Description:** Indicate whether the received packet was the expected Ack.

**Details:** It is true for the expected Ack and false otherwise.

It is always available.

An expected Ack is defined as a protocol-correct Ack packet successfully-received ([SL_RAIL_RX_PACKET_READY_SUCCESS](receive#sl-rail-rx-packet-ready-success) or [SL_RAIL_RX_PACKET_READY_CRC_ERROR](receive#sl-rail-rx-packet-ready-crc-error)) and whose sync word was detected within the [sl_rail_auto_ack_config_t::ack_timeout_us](sl-rail-auto-ack-config-t#ack-timeout-us) period following a transmit which specified [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack), requested an Ack, and Auto-Ack is enabled. When true, the ack_timeout_us period was terminated so no [SL_RAIL_EVENT_RX_ACK_TIMEOUT](events#sl-rail-event-rx-ack-timeout) will be subsequently posted for the transmit.

A "protocol-correct Ack" applies to the 802.15.4 or Z-Wave protocols for which RAIL can discern the frame type and match the Ack's sequence number with that of the transmitted frame. For other protocols, the first packet successfully-received whose sync word was detected within the [sl_rail_auto_ack_config_t::ack_timeout_us](sl-rail-auto-ack-config-t#ack-timeout-us) period is considered the expected Ack; upper layers are responsible for confirming this.

###### rssi_dbm (heading level 7)

```
int8_t sl_rail_rx_packet_details_t::rssi_dbm
```

**Description:** RSSI of the received packet in integer dBm.

**Details:** This RSSI measurement is started as soon as the sync word is detected. The duration of the measurement is PHY-specific.

When not available it will be [SL_RAIL_RSSI_INVALID_DBM](receive#sl-rail-rssi-invalid-dbm).

###### lqi (heading level 7)

```
uint8_t sl_rail_rx_packet_details_t::lqi
```

**Description:** The link quality indicator of the received packet.

**Details:** A zero would indicate a very low quality packet while a 255 would indicate a very high quality packet.

When not available it will be 0.

###### sync_word_id (heading level 7)

```
uint8_t sl_rail_rx_packet_details_t::sync_word_id
```

**Description:** For radios and PHY configurations that support multiple sync words, this number is the ID of the sync word that was used for this packet.

**Details:** It is always available.

###### sub_phy_id (heading level 7)

```
uint8_t sl_rail_rx_packet_details_t::sub_phy_id
```

**Description:** In configurations where the radio has the option of receiving a given packet in multiple ways, indicates which of the sub-PHY options was used to receive the packet.

**Details:** Most radio configurations do not have this ability and the sub_phy_id is set to 0.

Currently, this field is used by the BLE Coded PHY, the BLE Simulscan PHY and the SUN OFDM PHYs. In BLE cases, a value of 0 marks a 500 kbps packet, a value of 1 marks a 125 kbps packet, and a value of 2 marks a 1 Mbps packet. Also, see [sl_rail_ble_config_phy_coded()](ble#sl-rail-ble-config-phy-coded) and [sl_rail_ble_config_phy_simulscan()](ble#sl-rail-ble-config-phy-simulscan).

In SUN OFDM cases, the value corresponds to the numerical value of the Modulation and Coding Scheme (MCS) level of the last received packet. The packet bitrate depends on the MCS value, as well as the OFDM option. Packets bitrates for SUN OFDM PHYs can be found in 802.15.4-2020 specification, chapter 20.3, table 20-10. Ex: Packet bitrate for OFDM option 1 MCS0 is 100kb/s and 2400kb/s for MCS6.

In WMBUS cases, when using PHY_wMbus_ModeTC_M2O_100k_frameA with simultaneous RX of T and C modes enabled ([sl_rail_wmbus_config()](wmbus#sl-rail-wmbus-config)), the value corresponds to [sl_rail_wmbus_phy_t](wmbus#sl-rail-wmbus-phy-t).

It is always available.

###### antenna_id (heading level 7)

```
uint8_t sl_rail_rx_packet_details_t::antenna_id
```

**Description:** For [Antenna Control](antenna-control) configurations where the device has multiple antennas, this indicates which antenna received the packet.

**Details:** When there is only one antenna, this will be set to the default of 0.

It is always available.

###### channel_hopping_channel_index (heading level 7)

```
uint8_t sl_rail_rx_packet_details_t::channel_hopping_channel_index
```

**Description:** When channel hopping is enabled, this field will contain the index of the channel in [sl_rail_rx_channel_hopping_config_t::p_entries](sl-rail-rx-channel-hopping-config-t#p-entries) on which this packet was received, or a sentinel value.

**Details:** It is always available.

###### channel (heading level 7)

```
uint16_t sl_rail_rx_packet_details_t::channel
```

**Description:** The channel on which the packet was received.

**Details:** It is always available.

**Note**

- It is best to fully process (empty or clear) the receive FIFO before changing channel configurations ([sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) or a built-in configuration) as unprocessed packets' channel could reflect the wrong configuration.

Configures the automatic PRS LNA bypass. 

###### Public Attributes

###### timeout_us (heading level 7)

```
uint32_t sl_rail_prs_lna_bypass_config_t::timeout_us
```

**Description:** Maximum time in microseconds to wait for frame detection after the LNA has been bypassed.

**Details:** It must be greater than 0 to enable automatic PRS LNA bypass with [sl_rail_enable_prs_lna_bypass()](receive#sl-rail-enable-prs-lna-bypass).

###### threshold (heading level 7)

```
uint8_t sl_rail_prs_lna_bypass_config_t::threshold
```

**Description:** Threshold (without unit) from which LNA bypass is turned on.

**Details:** The table below shows EFR32XG25 treshold corresponding to received power level without the LNA gain.

|Level dBm|FSK_1a|FSK_1b|FSK_2a|FSK_2b|FSK_3|FSK_4a|FSK_4b|FSK_5|OFDM1|OFDM2|OFDM3|OFDM4|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|**-25**|||||||||9|9|9|10|
|**-20**||7|7|7|8|8|7|8|11|12|12|12|
|**-15**|7|10|10|10|9|9|10|10|14|14|14|15|
|**-10**|9|12|12|12|12|12|12|12|16|16|16|16|
|**-5**|11|14|14|14|16|16|14|16|||||
|**0**|14|17|18|17|17|18|18|18|||||

For example, with OFDM1 PHY, setting the threshold to 11 will turn on the bypass when the power level at EFR32XG25 input is greater than -20 dBm.

###### delta_rssi_db (heading level 7)

```
uint8_t sl_rail_prs_lna_bypass_config_t::delta_rssi_db
```

**Description:** Compensation in dB applied by RAIL to RSSI during LNA bypass.

**Details:** The RSSI offset set using [sl_rail_set_rssi_offset()](receive#sl-rail-set-rssi-offset) must corespond to the case with FEM LNA not bypassed. delta_rssi_db is typically the FEM LNA gain value.

###### prs_channel (heading level 7)

```
uint8_t sl_rail_prs_lna_bypass_config_t::prs_channel
```

**Description:** PRS Channel used for the bypass.

**Details:** PRS_GetFreeChannel() can be use to find a free channel. Then the signal can be routed to GPIO pin and port using PRS_PinOutput(). This allows logical operations with other PRS channels and so to adapt to the FEM control logic table. Any call to PRS_Combine() with [sl_rail_prs_lna_bypass_config_t::prs_channel](sl-rail-prs-lna-bypass-config-t#prs-channel) as chA must be done after the [sl_rail_enable_prs_lna_bypass()](receive#sl-rail-enable-prs-lna-bypass) call.

###### polarity (heading level 7)

```
bool sl_rail_prs_lna_bypass_config_t::polarity
```

**Description:** PRS signal polarity for bypass.

**Details:** With a polarity of 1, PRS signal is set to 1 for bypass and 0 for un-bypass. with a polarity of 0, PRS signal is set to 0 for bypass and 1 for un-bypass.

##### Packet Information

APIs to get information about received packets. 

After receiving a packet, RAIL will trigger a [RAIL_EVENT_RX_PACKET_RECEIVED](events#rail-event-rx-packet-received) event. At that point, there is a variety of information available to the application about the received packet. The following example code assumes that the [RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info) is not used, and the application wants as much data about the packet as possible. 

```c
// Get all information about a received packet.
RAIL_Status_t status;
RAIL_RxPacketInfo_t rxInfo;
RAIL_RxPacketDetails_t rxDetails;
RAIL_RxPacketHandle_t rxHandle
  = RAIL_GetRxPacketInfo(railHandle, RAIL_RX_PACKET_HANDLE_NEWEST, &rxInfo);
assert(rxHandle != RAIL_RX_PACKET_HANDLE_INVALID);
status = RAIL_GetRxPacketDetailsAlt(railHandle, rxHandle, &rxDetails);
assert(status == RAIL_STATUS_NO_ERROR);
if (rxDetails.timeReceived.timePosition == RAIL_PACKET_TIME_INVALID) {
  return; // No time stamp available for this packet
}
// CRC_BYTES only needs to be added when not using RAIL_RX_OPTION_STORE_CRC
rxDetails.timeReceived.totalPacketBytes = rxInfo.packetBytes + CRC_BYTES;
// Choose the function which gives the desired time stamp
status = RAIL_GetRxTimeFrameEndAlt(railHandle, &rxDetails);
assert(status == RAIL_STATUS_NO_ERROR);
// Now all fields of rxInfo and rxDetails have been populated correctly

```

After receiving a packet, RAIL will trigger a [SL_RAIL_EVENT_RX_PACKET_RECEIVED](events#sl-rail-event-rx-packet-received) event. At that point, there is a variety of information available to the application about the received packet. The following example code assumes that the [SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#sl-rail-rx-option-remove-appended-info) is not used, and the application wants as much data about the packet as possible. 

```c
// Get all information about a received packet.
sl_rail_status_t status;
sl_rail_rx_packet_info_t rx_info;
sl_rail_rx_packet_details_t rx_details;
sl_rail_rx_packet_handle_t rx_handle
  = sl_rail_get_rx_packet_info(rail_handle, SL_RAIL_RX_PACKET_HANDLE_NEWEST, &rx_info);
assert(rx_handle != SL_RAIL_RX_PACKET_HANDLE_INVALID);
status = sl_rail_get_rx_packet_details(rail_handle, rx_handle, &rx_details);
assert(status == SL_RAIL_STATUS_NO_ERROR);
if (rx_details.time_received.time_position == SL_RAIL_PACKET_TIME_INVALID) {
  return; // No time stamp available for this packet
}
// CRC_BYTES only needs to be added when not using SL_RAIL_RX_OPTION_STORE_CRC
rx_details.time_received.total_packet_bytes = rx_info.packet_bytes + CRC_BYTES;
// Choose the function which gives the desired time stamp
status = sl_rail_get_rx_time_frame_end(rail_handle, &rx_details);
assert(status == SL_RAIL_STATUS_NO_ERROR);
// Now all fields of rx_info and rx_details have been populated correctly

```

###### Functions

###### RAIL_GetRxPacketInfo (heading level 7)

`RAIL_RxPacketHandle_t RAIL_GetRxPacketInfo(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, RAIL_RxPacketInfo_t *pPacketInfo)`

**Description:** Get basic information about a pending or received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)|[in]|packetHandle|A packet handle for the unreleased packet as returned from a previous call, or sentinel values [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest), [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) or [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest).|
|[RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *|[out]|pPacketInfo|A non-NULL pointer to a [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) to store info for the requested packet.|

**Returns**

- The packet handle for the requested packet: if packetHandle was one of the sentinel values, returns the actual packet handle for that packet, otherwise returns packetHandle. It may return [RAIL_RX_PACKET_HANDLE_INVALID](receive#rail-rx-packet-handle-invalid) to indicate an error.

This function can be used in any RX mode. It does not free any receive FIFO or internal receive resources. If used in receive [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode), the value in [RAIL_RxPacketInfo_t::packetBytes](rail-rx-packet-info-t#packet-bytes) will only return the data remaining in the FIFO. Any data read via earlier calls to [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) is not included.

**Note**

- When getting information about an arriving packet that is not yet complete, (i.e., pPacketInfo->packetStatus == [RAIL_RX_PACKET_RECEIVING](receive#rail-rx-packet-receiving)), keep in mind its data is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the filled-in [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to avoid confusing such info as packet data.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info). 

###### RAIL_GetRxIncomingPacketInfo (heading level 7)

`RAIL_Status_t RAIL_GetRxIncomingPacketInfo(RAIL_Handle_t railHandle, RAIL_RxPacketInfo_t *pPacketInfo)`

**Description:** Get information about the live incoming packet (if any).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *|[out]|pPacketInfo|A non-NULL pointer to store [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) for the incoming packet.|

Differs from [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) by only returning information about a packet actively being received, something which even the [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest) may not represent if there are completed but unprocessed packets in the receive FIFO.

**Returns**

- Status code indicating success of the function call.

This function can only be called from callback context, e.g., when handling [RAIL_EVENT_RX_FILTER_PASSED](events#rail-event-rx-filter-passed) or [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command). It must not be used with receive [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode) if any portion of an incoming packet has already been extracted from the receive FIFO.

**Note**

- The incomplete data of an arriving packet is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the filled-in [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to avoid confusing such info as packet data.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_incoming_packet_info()](packet-information#sl-rail-get-rx-incoming-packet-info). 

###### RAIL_CopyRxPacket (heading level 7)

`static void RAIL_CopyRxPacket(uint8_t *pDest, const RAIL_RxPacketInfo_t *pPacketInfo)`

**Description:** Copy a full packet to a user-specified contiguous buffer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[out]|pDest|A non-NULL application-provided pointer to a buffer of at least pPacketInfo->packetBytes in size to store the packet data contiguously. This buffer must never overlay RAIL's receive FIFO buffer. Exactly pPacketInfo->packetBytes of packet data will be written into it.|
|const [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) *|[in]|pPacketInfo|A non-NULL pointer to the [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) for the requested packet.|

**Note**

- This is a convenience helper function, which is intended to be expedient. As a result, it does not check the validity of its arguments, so don't pass either as NULL, and don't pass a pDest pointer to a buffer that's too small for the packet's data.
- If only a portion of the packet is needed, use [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet) instead.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_copy_rx_packet()](packet-information#sl-rail-copy-rx-packet) with an additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_GetRxPacketDetails (heading level 7)

`RAIL_Status_t RAIL_GetRxPacketDetails(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, RAIL_RxPacketDetails_t *pPacketDetails)`

**Description:** Get detailed information about a received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)|[in]|packetHandle|A packet handle for the unreleased packet as returned from a previous call to [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) or [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet), or sentinel values [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest), [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) or [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest).|
|[RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *|[inout]|pPacketDetails|An application-provided non-NULL pointer to store [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) for the requested packet. For [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) RAIL_RX_PACKET_READY_ packets, the timeReceived fields totalPacketBytes and timePosition must be initialized prior to each call:<br/><br/>- totalPacketBytes with the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes.<br/>- timePosition with a [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) value specifying the packet position to put in the timeReceived field on return. This field will also be updated with the actual position corresponding to the timeReceived value filled in.|

This function can be used in any RX mode; it does not free any receive FIFO or internal receive resources.

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketDetails was filled in, or an appropriate error code otherwise.

**Note**

- Certain details are always available, while others are only available if the [RAIL_RxOptions_t](receive#rail-rx-options-t)[RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info) option is not in effect and the received packet's [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) is among the RAIL_RX_PACKET_READY_ set. See [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) for clarification.
- Consider using [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt) for smaller code size.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) with different parameter semantics - the last parameter is solely an output parameter where any time-received time position passed in is ignored. 

###### RAIL_GetRxPacketDetailsAlt (heading level 7)

`RAIL_Status_t RAIL_GetRxPacketDetailsAlt(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, RAIL_RxPacketDetails_t *pPacketDetails)`

**Description:** Get detailed information about a received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketHandle_t](receive#rail-rx-packet-handle-t)|[in]|packetHandle|A packet handle for the unreleased packet as returned from a previous call to [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) or [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet), or sentinel values [RAIL_RX_PACKET_HANDLE_OLDEST](receive#rail-rx-packet-handle-oldest)[RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) or [RAIL_RX_PACKET_HANDLE_NEWEST](receive#rail-rx-packet-handle-newest).|
|[RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *|[out]|pPacketDetails|A non-NULL application-provided pointer to store [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) for the requested packet. For [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) RAIL_RX_PACKET_READY_ packets, the timeReceived field packetTime will be populated with a time stamp corresponding to a default location in the packet. The timeReceived field timePosition will be populated with a [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) value specifying that default packet location. Call [RAIL_GetRxTimePreambleStart()](packet-information#rail-get-rx-time-preamble-start), [RAIL_GetRxTimeSyncWordEnd()](packet-information#rail-get-rx-time-sync-word-end), or [RAIL_GetRxTimeFrameEnd()](packet-information#rail-get-rx-time-frame-end) to adjust that time stamp for different locations in the packet.|

This function can be used in any RX mode; it does not free any receive FIFO or receive internal resources.

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketDetails was filled in, or an appropriate error code otherwise.

This alternative API allows for smaller code size by deadstripping the time stamp adjustment algorithms which are not in use.

**Note**

- Certain details are always available, while others are only available if the [RAIL_RxOptions_t](receive#rail-rx-options-t)[RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#rail-rx-option-remove-appended-info) option is not in effect and the received packet's [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) is among the RAIL_RX_PACKET_READY_ set. See [RAIL_RxPacketDetails_t](rail-rx-packet-details-t) for clarification.
- This function should be called soon (no more than a minute) after packet reception for the packet time stamp information to be valid.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details). 

###### RAIL_GetRxTimePreambleStart (heading level 7)

`RAIL_Status_t RAIL_GetRxTimePreambleStart(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL RX time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|A pointer to the time that was returned in the [RAIL_PacketTimeStamp_t::packetTime](rail-packet-time-stamp-t#packet-time) field of [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) from a previous call to [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt) for this same packet. After this function, the time at that location will be updated with the time that the preamble for this packet started on air. Must be non-NULL.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully calculated, or an appropriate error code otherwise.

Call this API while the given railHandle is active, or it will return an error code of [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state). Note that this API may return incorrect time stamps when sub-phys are in use. Prefer [RAIL_GetRxTimePreambleStartAlt](packet-information#rail-get-rx-time-preamble-start-alt) in those situations. See [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) for more details.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start) with different parameters. 

###### RAIL_GetRxTimePreambleStartAlt (heading level 7)

`RAIL_Status_t RAIL_GetRxTimePreambleStartAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL RX time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) for this same packet. The application can set [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) field totalPacketBytes to [RAIL_RX_STARTED_BYTES](system-timing#rail-rx-started-bytes) to make RAIL use packetDurationUs field for this adjustment. Otherwise the application must update the timeReceived field totalPacketBytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the timeReceived field packetTime will be updated with the time that the preamble for this packet started on air.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start). 

###### RAIL_GetRxTimeSyncWordEnd (heading level 7)

`RAIL_Status_t RAIL_GetRxTimeSyncWordEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|A pointer to the time that was returned in the [RAIL_PacketTimeStamp_t::packetTime](rail-packet-time-stamp-t#packet-time) field of [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) from a previous call to [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt) for this same packet. After this function, the time at that location will be updated with the time that the sync word for this packet finished on air. Must be non-NULL.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully calculated, or an appropriate error code otherwise.

Call this API while the given railHandle is active, or it will return an error code of [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state). Note that this API may return incorrect time stamps when sub-phys are in use. Prefer [RAIL_GetRxTimePreambleStartAlt](packet-information#rail-get-rx-time-preamble-start-alt) in those situations. See [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) for more details.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end) with different parameters. 

###### RAIL_GetRxTimeSyncWordEndAlt (heading level 7)

`RAIL_Status_t RAIL_GetRxTimeSyncWordEndAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) for this same packet. The application can set [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) field totalPacketBytes to [RAIL_RX_STARTED_BYTES](system-timing#rail-rx-started-bytes) to make RAIL use packetDurationUs field for this adjustment. Otherwise the application must update the timeReceived field totalPacketBytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the timeReceived field packetTime will be updated with the time that the sync word for this packet finished on air.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end). 

###### RAIL_GetRxTimeFrameEnd (heading level 7)

`RAIL_Status_t RAIL_GetRxTimeFrameEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|A pointer to the time that was returned in the [RAIL_PacketTimeStamp_t::packetTime](rail-packet-time-stamp-t#packet-time) field of [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) from a previous call to [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt) for this same packet. After this function, the time at that location will be updated with the time that this packet finished on air. Must be non-NULL.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully calculated, or an appropriate error code otherwise.

Call this API while the given railHandle is active, or it will return an error code of [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state). Note that this API may return incorrect time stamps when sub-phys are in use. Prefer [RAIL_GetRxTimePreambleStartAlt](packet-information#rail-get-rx-time-preamble-start-alt) in those situations. See [RAIL_RxPacketDetails_t::subPhyId](rail-rx-packet-details-t#sub-phy-id) for more details.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_rx_time_frame_end()](packet-information#sl-rail-get-rx-time-frame-end) with different parameters. 

###### RAIL_GetRxTimeFrameEndAlt (heading level 7)

`RAIL_Status_t RAIL_GetRxTimeFrameEndAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_RxPacketDetails_t](rail-rx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) for this same packet. The application must update the timeReceived field totalPacketBytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the timeReceived field packetTime will be updated with the time that the packet finished on air.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_time_frame_end()](packet-information#sl-rail-get-rx-time-frame-end). 

###### sl_rail_get_rx_packet_info (heading level 7)

`sl_rail_rx_packet_handle_t sl_rail_get_rx_packet_info(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, sl_rail_rx_packet_info_t *p_packet_info)`

**Description:** Get basic information about a pending or received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t)|[in]|packet_handle|A packet handle for the unreleased packet as returned from a previous call, or sentinel values [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest), [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete) or [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest).|
|[sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) *|[out]|p_packet_info|A non-NULL pointer to a [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) to store info for the requested packet.|

**Returns**

- The packet handle for the requested packet: if packet_handle was one of the sentinel values, returns the actual packet handle for that packet, otherwise returns packet_handle. It may return [SL_RAIL_RX_PACKET_HANDLE_INVALID](receive#sl-rail-rx-packet-handle-invalid) to indicate an error.

This function can be used in any RX mode. It does not free any receive FIFO or receive Packet Queue resources. If used in receive [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode), the value in [sl_rail_rx_packet_info_t::packet_bytes](sl-rail-rx-packet-info-t#packet-bytes) will only return the data remaining in the FIFO. Any data read via earlier calls to [sl_rail_read_rx_fifo()](data-management#sl-rail-read-rx-fifo) is not included.

**Note**

- When getting information about an arriving packet that is not yet complete, (i.e., p_packet_info->packet_status == [SL_RAIL_RX_PACKET_RECEIVING](receive#sl-rail-rx-packet-receiving)), keep in mind its data is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the filled-in [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to avoid confusing such info as packet data.

###### sl_rail_get_rx_incoming_packet_info (heading level 7)

`sl_rail_status_t sl_rail_get_rx_incoming_packet_info(sl_rail_handle_t rail_handle, sl_rail_rx_packet_info_t *p_packet_info)`

**Description:** Get information about the live incoming packet (if any).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) *|[out]|p_packet_info|A non-NULL pointer to store [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) for the incoming packet.|

Differs from [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) by only returning information about a packet actively being received, something which even the [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest) may not represent if there are completed but unprocessed packets in the receive FIFO.

**Returns**

- Status code indicating success of the function call.

This function can only be called from callback context, e.g., when handling [SL_RAIL_EVENT_RX_FILTER_PASSED](events#sl-rail-event-rx-filter-passed) or [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command). It must not be used with receive [sl_rail_data_method_t::SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode) if any portion of an incoming packet has already been extracted from the receive FIFO.

**Note**

- The incomplete data of an arriving packet is highly suspect because it has not yet passed any CRC integrity checking. Also note that the packet could be aborted, canceled, or fail momentarily, invalidating its data in Packet mode. Furthermore, there is a small chance towards the end of packet reception that the filled-in [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) could include not only packet data received so far, but also some raw radio-appended info detail bytes that RAIL's packet-completion processing will subsequently deal with. It's up to the application to know its packet format well enough to avoid confusing such info as packet data.

###### sl_rail_abort_rx_incoming_packet (heading level 7)

`sl_rail_status_t sl_rail_abort_rx_incoming_packet(sl_rail_handle_t rail_handle)`

**Description:** Abort an incoming packet actively being received.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call. [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) would be returned when the radio is not actively receiving a packet or when the inactive protocol. It may be possible that [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) will be returned yet the abort attempt was too late to actually abort the packet.

If an incoming packet does get aborted, RAIL will issue [SL_RAIL_EVENT_RX_PACKET_ABORTED](events#sl-rail-event-rx-packet-aborted) and the radio would respect the current [SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#sl-rail-rx-option-track-aborted-frames) setting and follow the current RX [sl_rail_state_transitions_t::error](sl-rail-state-transitions-t#error) state transition. 

###### sl_rail_copy_rx_packet (heading level 7)

`sl_rail_status_t sl_rail_copy_rx_packet(sl_rail_handle_t rail_handle, uint8_t *p_dest, const sl_rail_rx_packet_info_t *p_packet_info)`

**Description:** Copy a full packet to a user-specified contiguous buffer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t *|[out]|p_dest|A non-NULL application-provided pointer to a buffer of at least p_packet_info->packet_bytes in size to store the packet data contiguously. This buffer must never overlay RAIL's receive FIFO buffer. Exactly p_packet_info->packet_bytes of packet data will be written into it.|
|const [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) *|[in]|p_packet_info|A non-NULL pointer to the [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) for the requested packet.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This is a convenience helper function, which is intended to be expedient. As a result, it does not check the validity of its arguments, so don't pass either as NULL, and don't pass a p_dest pointer to a buffer that's too small for the packet's data.
- If only a portion of the packet is needed, use [sl_rail_peek_rx_packet()](receive#sl-rail-peek-rx-packet) instead.

###### sl_rail_get_rx_packet_details (heading level 7)

`sl_rail_status_t sl_rail_get_rx_packet_details(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, sl_rail_rx_packet_details_t *p_packet_details)`

**Description:** Get detailed information about a received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_handle_t](receive#sl-rail-rx-packet-handle-t)|[in]|packet_handle|A packet handle for the unreleased packet as returned from a previous call to [sl_rail_get_rx_packet_info()](packet-information#sl-rail-get-rx-packet-info) or [sl_rail_hold_rx_packet()](receive#sl-rail-hold-rx-packet), or sentinel values [SL_RAIL_RX_PACKET_HANDLE_OLDEST](receive#sl-rail-rx-packet-handle-oldest)[SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#sl-rail-rx-packet-handle-oldest-complete) or [SL_RAIL_RX_PACKET_HANDLE_NEWEST](receive#sl-rail-rx-packet-handle-newest).|
|[sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) *|[out]|p_packet_details|A non-NULL application-provided pointer to store [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) for the requested packet. For [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) SL_RAIL_RX_PACKET_READY_ packets, the time_received field packet_time will be populated with a time stamp corresponding to a default location in the packet. The time_received field time_position will be populated with a [sl_rail_packet_time_position_t](system-timing#sl-rail-packet-time-position-t) value specifying that default packet location. Call [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start), [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end), or [sl_rail_get_rx_time_frame_end()](packet-information#sl-rail-get-rx-time-frame-end) to adjust that time stamp for different locations in the packet.|

This function can be used in any RX mode; it does not free any receive FIFO or receive Packet Queue resources.

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if p_packet_details was filled in, or an appropriate error code otherwise.

**Note**

- Certain details are always available, while others are only available if the [sl_rail_rx_options_t](receive#sl-rail-rx-options-t)[SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO](receive#sl-rail-rx-option-remove-appended-info) option is not in effect and the received packet's [sl_rail_rx_packet_status_t](receive#sl-rail-rx-packet-status-t) is among the SL_RAIL_RX_PACKET_READY_ set. See [sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) for clarification.
- This function should be called soon (no more than a minute) after packet reception for the packet time stamp information to be valid.

###### sl_rail_get_rx_time_preamble_start (heading level 7)

`sl_rail_status_t sl_rail_get_rx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL RX time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) for this same packet. The application can set [sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received) field total_packet_bytes to [SL_RAIL_RX_STARTED_BYTES](system-timing#sl-rail-rx-started-bytes) to make RAIL use packet_duration_us field for this adjustment. Otherwise the application must update the time_received field total_packet_bytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the time_received field packet_time will be updated with the time that the preamble for this packet started on air.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

###### sl_rail_get_rx_time_sync_word_end (heading level 7)

`sl_rail_status_t sl_rail_get_rx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) for this same packet. The application can set [sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received) field total_packet_bytes to [SL_RAIL_RX_STARTED_BYTES](system-timing#sl-rail-rx-started-bytes) to make RAIL use packet_duration_us field for this adjustment. Otherwise the application must update the time_received field total_packet_bytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the time_received field packet_time will be updated with the time that the sync word for this packet finished on air.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

###### sl_rail_get_rx_time_frame_end (heading level 7)

`sl_rail_status_t sl_rail_get_rx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL RX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_rx_packet_details_t](sl-rail-rx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_rx_packet_details()](packet-information#sl-rail-get-rx-packet-details) for this same packet. The application must update the time_received field total_packet_bytes to be the total number of bytes of the received packet for RAIL to use when calculating the specified time stamp. This should account for all bytes received over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the time_received field packet_time will be updated with the time that the packet finished on air.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

##### Address Filtering

Configuration APIs for receive packet address filtering. 

The address filtering code examines the packet as follows.

|`Bytes: 0 - 255`|`0 - 8`|`0 - 255`|`0 - 8`|`Variable`|
|---|---|---|---|---|
|`Data_0`|`Field_0`|`Data_1`|`Field_1`|`Data_2`|

In the above structure, anything listed as Data_# is an optional section of bytes that RAIL will not process for address filtering. The Field_# segments reference specific sections in the packet that will each be interpreted as an address during address filtering. The application may submit up to four addresses to attempt to match each field segment and each address may have a size of up to 8 bytes. To set up address filtering, first configure the locations and length of the addresses in the packet. Next, configure which combinations of matches in Field_0 and Field_1 should constitute an address match. Last, enter addresses into tables for each field and enable them. The first two of these are part of the [RAIL_AddrConfig_t](rail-addr-config-t) structure while the second part is configured at runtime using the [RAIL_SetAddressFilterAddress()](address-filtering#rail-set-address-filter-address) API. A brief description of each configuration is listed below.

The offsets and sizes of the fields are assumed fixed for the RAIL address filter. To set them, specify arrays for these values in the sizes and offsets entries in the [RAIL_AddrConfig_t](rail-addr-config-t) structure. A size of zero indicates that a field is disabled. The start offset for a field is relative to the previous start offset and, if you're using frame type decoding, the first start offset is relative to the end of the byte containing the frame type.

Configuring which combinations of Field_0 and Field_1 constitute a match is the most complex portion of the address filter. The easiest way to think about this is with a truth table. If you consider each of the four possible address entries in a field, you can have a match on any one of those or a match for none of them. This is shown in the 5x5 truth table below where Field_0 matches are the rows and Field_1 matches are the columns.

||No Match|Address 0|Address 1|Address 2|Address 3|
|---|---|---|---|---|---|
|**No Match**|bit 0|bit 1|bit 2|bit 3|bit 4|
|**Address 0**|bit 5|bit 6|bit 7|bit 8|bit 9|
|**Address 1**|bit 10|bit 11|bit 12|bit 13|bit 14|
|**Address 2**|bit 15|bit 16|bit 17|bit 18|bit 19|
|**Address 3**|bit 20|bit 21|bit 22|bit 23|bit 24|

Because this is only 25 bits, it can be represented in one 32-bit integer where 1 indicates a filter pass and 0 indicates a filter fail. This is the [RAIL_AddrConfig_t::matchTable](rail-addr-config-t#match-table) field and is used during filtering. For common simple configurations, two defines are provided with the truth tables as shown below. The first is [ADDRCONFIG_MATCH_TABLE_SINGLE_FIELD](address-filtering#addrconfig-match-table-single-field), which can be used if only using one address field (either field). If using two fields and want to force in the same address entry in each field, use the second define: [ADDRCONFIG_MATCH_TABLE_DOUBLE_FIELD](address-filtering#addrconfig-match-table-double-field). For more complex systems, create a valid custom table.

**Note**

- Address filtering does not function reliably with PHYs that use a data rate greater than 500 kbps. If this is a requirement, filtering must currently be done by the application.

The address filtering code examines the packet as follows.

|`Bytes: 0 - 255`|`0 - 8`|`0 - 255`|`0 - 8`|`Variable`|
|---|---|---|---|---|
|`Data_0`|`Field_0`|`Data_1`|`Field_1`|`Data_2`|

In the above structure, anything listed as Data_# is an optional section of bytes that RAIL will not process for address filtering. The Field_# segments reference specific sections in the packet that will each be interpreted as an address during address filtering. The application may submit up to four addresses to attempt to match each field segment and each address may have a size of up to 8 bytes. To set up address filtering, first configure the locations and length of the addresses in the packet. Next, configure which combinations of matches in Field_0 and Field_1 should constitute an address match. Last, enter addresses into tables for each field and enable them. The first two of these are part of the [sl_rail_addr_config_t](sl-rail-addr-config-t) structure while the second part is configured at runtime using the [sl_rail_set_address_filter_address()](address-filtering#sl-rail-set-address-filter-address) API. A brief description of each configuration is listed below.

The offsets and sizes of the fields are assumed fixed for the RAIL address filter. To set them, specify arrays for these values in the sizes and offsets entries in the [sl_rail_addr_config_t](sl-rail-addr-config-t) structure. A size of zero indicates that a field is disabled. The start offset for a field is relative to the previous start offset and, if you're using frame type decoding, the first start offset is relative to the end of the byte containing the frame type.

Configuring which combinations of Field_0 and Field_1 constitute a match is the most complex portion of the address filter. The easiest way to think about this is with a truth table. If you consider each of the four possible address entries in a field, you can have a match on any one of those or a match for none of them. This is shown in the 5x5 truth table below where Field_0 matches are the rows and Field_1 matches are the columns.

||No Match|Address 0|Address 1|Address 2|Address 3|
|---|---|---|---|---|---|
|**No Match**|bit 0|bit 1|bit 2|bit 3|bit 4|
|**Address 0**|bit 5|bit 6|bit 7|bit 8|bit 9|
|**Address 1**|bit 10|bit 11|bit 12|bit 13|bit 14|
|**Address 2**|bit 15|bit 16|bit 17|bit 18|bit 19|
|**Address 3**|bit 20|bit 21|bit 22|bit 23|bit 24|

Because this is only 25 bits, it can be represented in one 32-bit integer where 1 indicates a filter pass and 0 indicates a filter fail. This is the [sl_rail_addr_config_t::match_table](sl-rail-addr-config-t#match-table) field and is used during filtering. For common simple configurations, two defines are provided with the truth tables as shown below. The first is [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD](address-filtering#sl-rail-addr-config-match-table-single-field), which can be used if only using one address field (either field). If using two fields and want to force in the same address entry in each field, use the second define: [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_DOUBLE_FIELD](address-filtering#sl-rail-addr-config-match-table-double-field). For more complex systems, create a valid custom table.

**Note**

- Address filtering does not function reliably with PHYs that use a data rate greater than 500 kbps. If this is a requirement, filtering must currently be done by the application.

###### Modules

[RAIL_AddrConfig_t](rail-addr-config-t)

[sl_rail_addr_config_t](sl-rail-addr-config-t)

###### Typedefs

###### RAIL_AddrFilterMask_t (heading level 7)

`typedef uint8_t RAIL_AddrFilterMask_t`

**Description:**

A bitmask representation of which 4 filters passed for each [ADDRCONFIG_MAX_ADDRESS_FIELDS](address-filtering#addrconfig-max-address-fields) when filtering has completed successfully.

**Details:**

It's layout is: | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |-----—+-----—+-----—+-----—+-----—+-----—+-----—+-----—| | Second Address Field Nibble | First Address Field Nibble | | Addr 3 | Addr 2 | Addr 1 | Addr 0 | Addr 3 | Addr 2 | Addr 1 | Addr 0 | | match | match | match | match | match | match | match | match | |-----—+-----—+-----—+-----—+-----—+-----—+-----—+-----—|

**Note**

- This information is valid in [RAIL_IEEE802154_Address_t](rail-ieee802154-address-t) on all platforms, but is only valid in [RAIL_RxPacketInfo_t](rail-rx-packet-info-t) on platforms where [RAIL_SUPPORTS_ADDR_FILTER_MASK](features#rail-supports-addr-filter-mask-1) is true.

**Deprecated**RAIL 2.x synonym of [sl_rail_addr_filter_mask_t](address-filtering#sl-rail-addr-filter-mask-t).

###### sl_rail_addr_filter_mask_t (heading level 7)

`typedef uint8_t sl_rail_addr_filter_mask_t`

**Description:**

A bitmask representation of which 4 filters passed for each [SL_RAIL_ADDR_CONFIG_MAX_ADDRESS_FIELDS](address-filtering#sl-rail-addr-config-max-address-fields) when filtering has completed successfully.

**Details:**

It's layout is: | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | |-----—+-----—+-----—+-----—+-----—+-----—+-----—+-----—| | Second Address Field Nibble | First Address Field Nibble | | Addr 3 | Addr 2 | Addr 1 | Addr 0 | Addr 3 | Addr 2 | Addr 1 | Addr 0 | | match | match | match | match | match | match | match | match | |-----—+-----—+-----—+-----—+-----—+-----—+-----—+-----—|

**Note**

- This information is valid in [sl_rail_ieee802154_address_t](sl-rail-ieee802154-address-t) on all platforms, but is only valid in [sl_rail_rx_packet_info_t](sl-rail-rx-packet-info-t) on platforms where [SL_RAIL_SUPPORTS_ADDR_FILTER_MASK](features#sl-rail-supports-addr-filter-mask-1) is true.

###### Functions

###### RAIL_ConfigAddressFilter (heading level 7)

`RAIL_Status_t RAIL_ConfigAddressFilter(RAIL_Handle_t railHandle, const RAIL_AddrConfig_t *addrConfig)`

**Description:** Configure address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_AddrConfig_t](rail-addr-config-t) *|[in]|addrConfig|A pointer to the configuration structure, which defines how addresses are set up in your packets. May be NULL to reset address filtering.|

**Returns**

- Status code indicating success of the function call.

You must call this function to set up address filtering. You may call it multiple times but all previous information is wiped out each time you call and any configured addresses must be reset.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter). 

###### RAIL_EnableAddressFilter (heading level 7)

`bool RAIL_EnableAddressFilter(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|An argument to indicate whether or not to enable address filtering.|

**Returns**

- true if address filtering was enabled to start with and false otherwise.

Only allow packets through that pass the current address filtering configuration. This does not reset or change the configuration so you can set that up before turning on this feature.

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_address_filter()](address-filtering#sl-rail-enable-address-filter). 

###### RAIL_IsAddressFilterEnabled (heading level 7)

`bool RAIL_IsAddressFilterEnabled(RAIL_Handle_t railHandle)`

**Description:** Return whether address filtering is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if address filtering is enabled and false otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_address_filter_enabled()](address-filtering#sl-rail-is-address-filter-enabled). 

###### RAIL_ResetAddressFilter (heading level 7)

`RAIL_Status_t RAIL_ResetAddressFilter(RAIL_Handle_t railHandle)`

**Description:** Reset the address filtering configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Resets all structures related to address filtering. This does not disable address filtering. It leaves the radio in a state where no packets pass filtering.

**Deprecated**RAIL 2.x synonym of [sl_rail_reset_address_filter()](address-filtering#sl-rail-reset-address-filter). 

###### RAIL_SetAddressFilterAddress (heading level 7)

`RAIL_Status_t RAIL_SetAddressFilterAddress(RAIL_Handle_t railHandle, uint8_t field, uint8_t index, const uint8_t *value, bool enable)`

**Description:** Set an address for filtering in hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|field|Indicates an address field for this address.|
|uint8_t|[in]|index|Indicates a match entry for this address for a given field.|
|const uint8_t *|[in]|value|A pointer to the address data. This must be at least as long as the size specified in [RAIL_ConfigAddressFilter()](address-filtering#rail-config-address-filter). The first byte, value[0], will be compared to the first byte received over the air for this address field.|
|bool|[in]|enable|A boolean to indicate whether this address should be enabled immediately.|

**Returns**

- Status code indicating success of the function call.

This function loads the given address into hardware for filtering and starts filtering if you set the enable parameter to true. Otherwise, call [RAIL_EnableAddressFilterAddress()](address-filtering#rail-enable-address-filter-address) to turn it on later.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_address_filter_address()](address-filtering#sl-rail-set-address-filter-address). 

###### RAIL_SetAddressFilterAddressMask (heading level 7)

`RAIL_Status_t RAIL_SetAddressFilterAddressMask(RAIL_Handle_t railHandle, uint8_t field, const uint8_t *bitMask)`

**Description:** Set an address bit mask for filtering in hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint8_t|[in]|field|Indicates an address field for this address bit mask.|
|const uint8_t *|[in]|bitMask|A pointer to the address bitmask. This must be at least as long as the size specified in [RAIL_ConfigAddressFilter()](address-filtering#rail-config-address-filter). The first byte, bitMask[0], will be applied to the first byte received over the air for this address field. Bits set to 1 in the bit mask indicate which bit positions in the incoming packet to compare against the stored addresses during address filtering. Bits set to 0 indicate which bit positions to ignore in the incoming packet during address filtering. This bit mask is applied to all address entries.|

**Returns**

- Status code indicating success of the function call.

This function loads the given address bit mask into hardware for use when address filtering is enabled. All bits in the stored address bit mask are set to 1 during hardware initialization and when either [RAIL_ConfigAddressFilter()](address-filtering#rail-config-address-filter) or [RAIL_ResetAddressFilter()](address-filtering#rail-reset-address-filter) are called.

**Note**

- This feature/API is not supported on the EFR32xG21. Use the compile time symbol [RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#rail-supports-addr-filter-address-bit-mask-1) or the runtime call [RAIL_SupportsAddrFilterAddressBitMask()](features#rail-supports-addr-filter-address-bit-mask) to check whether the platform supports this feature.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_address_filter_address_mask()](address-filtering#sl-rail-set-address-filter-address-mask). 

###### RAIL_EnableAddressFilterAddress (heading level 7)

`RAIL_Status_t RAIL_EnableAddressFilterAddress(RAIL_Handle_t railHandle, bool enable, uint8_t field, uint8_t index)`

**Description:** Enable address filtering for the specified address.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|An argument to indicate whether or not to enable address filtering.|
|uint8_t|[in]|field|Indicates an address for the address.|
|uint8_t|[in]|index|Indicates a match entry in the given field you want to enable.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_address_filter_address()](address-filtering#sl-rail-enable-address-filter-address). 

###### sl_rail_config_address_filter (heading level 7)

`sl_rail_status_t sl_rail_config_address_filter(sl_rail_handle_t rail_handle, const sl_rail_addr_config_t *p_addr_config)`

**Description:** Configure address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_addr_config_t](sl-rail-addr-config-t) *|[in]|p_addr_config|A pointer to the configuration structure, which defines how addresses are set up in your packets. May be NULL to reset address filtering.|

**Returns**

- Status code indicating success of the function call.

You must call this function to set up address filtering. You may call it multiple times but all previous information is wiped out each time you call and any configured addresses must be reset. 

###### sl_rail_enable_address_filter (heading level 7)

`bool sl_rail_enable_address_filter(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable address filtering.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|An argument to indicate whether or not to enable address filtering.|

**Returns**

- true if address filtering was enabled to start with and false otherwise.

Only allow packets through that pass the current address filtering configuration. This does not reset or change the configuration so you can set that up before turning on this feature. 

###### sl_rail_is_address_filter_enabled (heading level 7)

`bool sl_rail_is_address_filter_enabled(sl_rail_handle_t rail_handle)`

**Description:** Return whether address filtering is currently enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if address filtering is enabled and false otherwise.

###### sl_rail_reset_address_filter (heading level 7)

`sl_rail_status_t sl_rail_reset_address_filter(sl_rail_handle_t rail_handle)`

**Description:** Reset the address filtering configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- Status code indicating success of the function call.

Resets all structures related to address filtering. This does not disable address filtering. It leaves the radio in a state where no packets pass filtering. 

###### sl_rail_set_address_filter_address (heading level 7)

`sl_rail_status_t sl_rail_set_address_filter_address(sl_rail_handle_t rail_handle, uint8_t field, uint8_t index, const uint8_t *p_value, bool enable)`

**Description:** Set an address for filtering in hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|field|Indicates an address field for this address.|
|uint8_t|[in]|index|Indicates a match entry for this address for a given field.|
|const uint8_t *|[in]|p_value|A pointer to the address data. This must be at least as long as the size specified in [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter). The first byte, p_value[0], will be compared to the first byte received over the air for this address field.|
|bool|[in]|enable|A boolean to indicate whether this address should be enabled immediately.|

**Returns**

- Status code indicating success of the function call.

This function loads the given address into hardware for filtering and starts filtering if you set the enable parameter to true. Otherwise, call [sl_rail_enable_address_filter_address()](address-filtering#sl-rail-enable-address-filter-address) to turn it on later. 

###### sl_rail_set_address_filter_address_mask (heading level 7)

`sl_rail_status_t sl_rail_set_address_filter_address_mask(sl_rail_handle_t rail_handle, uint8_t field, const uint8_t *p_bitmask)`

**Description:** Set an address bit mask for filtering in hardware.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint8_t|[in]|field|Indicates an address field for this address bit mask.|
|const uint8_t *|[in]|p_bitmask|A pointer to the address bitmask. This must be at least as long as the size specified in [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter). The first byte, p_bitmask[0], will be applied to the first byte received over the air for this address field. Bits set to 1 in the bit mask indicate which bit positions in the incoming packet to compare against the stored addresses during address filtering. Bits set to 0 indicate which bit positions to ignore in the incoming packet during address filtering. This bit mask is applied to all address entries.|

**Returns**

- Status code indicating success of the function call.

This function loads the given address bit mask into hardware for use when address filtering is enabled. All bits in the stored address bit mask are set to 1 during hardware initialization and when either [sl_rail_config_address_filter()](address-filtering#sl-rail-config-address-filter) or [sl_rail_reset_address_filter()](address-filtering#sl-rail-reset-address-filter) are called.

**Note**

- This feature/API is not supported on the EFR32xG21. Use the compile time symbol [SL_RAIL_SUPPORTS_ADDR_FILTER_ADDRESS_BIT_MASK](features#sl-rail-supports-addr-filter-address-bit-mask-1) or the runtime call [sl_rail_supports_addr_filter_address_bit_mask()](features#sl-rail-supports-addr-filter-address-bit-mask) to check whether the platform supports this feature.

###### sl_rail_enable_address_filter_address (heading level 7)

`sl_rail_status_t sl_rail_enable_address_filter_address(sl_rail_handle_t rail_handle, bool enable, uint8_t field, uint8_t index)`

**Description:** Enable address filtering for the specified address.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|An argument to indicate whether or not to enable address filtering.|
|uint8_t|[in]|field|Indicates an address for the address.|
|uint8_t|[in]|index|Indicates a match entry in the given field you want to enable.|

**Returns**

- Status code indicating success of the function call.

###### Macros

`#define ADDRCONFIG_MATCH_TABLE_SINGLE_FIELD (0x1FFFFFE)`

**Description**: A default address filtering match table for configurations that use only one address field.

`#define ADDRCONFIG_MATCH_TABLE_DOUBLE_FIELD (0x1041040)`

**Description**: A default address filtering match table for configurations that use two address fields and want to match the same index in each.

`#define ADDRCONFIG_MAX_ADDRESS_FIELDS (2)`

**Description**: The maximum number of address fields that can be used by the address filtering logic.

`#define SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD (0x1FFFFFE)`

**Description**: A default address filtering match table for configurations that use only one address field.

`#define SL_RAIL_ADDR_CONFIG_MATCH_TABLE_DOUBLE_FIELD (0x1041040)`

**Description**: A default address filtering match table for configurations that use two address fields and want to match the same index in each.

`#define SL_RAIL_ADDR_CONFIG_MAX_ADDRESS_FIELDS (2)`

**Description**: The maximum number of address fields that can be used by the address filtering logic.

A structure to configure the address filtering functionality in RAIL. 

**Deprecated**RAIL 2.x synonym of [sl_rail_addr_config_t](sl-rail-addr-config-t). 

###### Public Attributes (heading level 7)

###### offsets (heading level 8)

```
uint8_t RAIL_AddrConfig_t::offsets[(2)]
```

**Description:** A list of the start byte offsets for each field.

**Details:** These offsets are specified relative to the previous field's end. For the first field, it is relative to either the beginning of the packet or the end of the frame type byte if frame type decoding is enabled. If a field is unused, it's offset should be set to 0.

**Deprecated**RAIL 2.x synonym of [sl_rail_addr_config_t::offsets](sl-rail-addr-config-t#offsets).

###### sizes (heading level 8)

```
uint8_t RAIL_AddrConfig_t::sizes[(2)]
```

**Description:** A list of the address field byte sizes.

**Details:** These sizes are specified in bytes from 0 to 8. If you choose a size of 0, this field is effectively disabled.

**Deprecated**RAIL 2.x synonym of [sl_rail_addr_config_t::sizes](sl-rail-addr-config-t#sizes).

###### matchTable (heading level 8)

```
uint32_t RAIL_AddrConfig_t::matchTable
```

**Description:** The truth table to determine how the two fields combine to create a match.

**Details:** For detailed information about how this truth table is formed, see the detailed description of [Address Filtering](address-filtering).

For simple predefined configurations use the following defines.

- ADDRCONFIG_MATCH_TABLE_SINGLE_FIELD  
  - For filtering that only uses a single address field.
- ADDRCONFIG_MATCH_TABLE_DOUBLE_FIELD for two field filtering where you  
  - For filtering that uses two address fields in a configurations where you want the following logic `((Field_0, Index_0) && (Field_1, Index_0)) || ((Field_0, Index_1) && (Field_1, Index_1)) || ...`

**Deprecated**RAIL 2.x synonym of [sl_rail_addr_config_t::match_table](sl-rail-addr-config-t#match-table).

A structure to configure the address filtering functionality in RAIL. 

###### Public Attributes (heading level 7)

###### offsets (heading level 8)

```
uint8_t sl_rail_addr_config_t::offsets[(2)]
```

**Description:** A list of the start byte offsets for each field.

**Details:** These offsets are specified relative to the previous field's end. For the first field, it is relative to either the beginning of the packet or the end of the frame type byte if frame type decoding is enabled. If a field is unused, it's offset should be set to 0.

###### sizes (heading level 8)

```
uint8_t sl_rail_addr_config_t::sizes[(2)]
```

**Description:** A list of the address field byte sizes.

**Details:** These sizes are specified in bytes from 0 to 8. If you choose a size of 0, this field is effectively disabled.

###### match_table (heading level 8)

```
uint32_t sl_rail_addr_config_t::match_table
```

**Description:** The truth table to determine how the two fields combine to create a match.

**Details:** For detailed information about how this truth table is formed, see the detailed description of [Address Filtering](address-filtering).

For simple predefined configurations use the following defines.

- [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD](address-filtering#sl-rail-addr-config-match-table-single-field)  
  - For filtering that only uses a single address field.
- [SL_RAIL_ADDR_CONFIG_MATCH_TABLE_DOUBLE_FIELD](address-filtering#sl-rail-addr-config-match-table-double-field) for two field filtering where you  
  - For filtering that uses two address fields in a configurations where you want the following logic `((Field_0, Index_0) && (Field_1, Index_0)) || ((Field_0, Index_1) && (Field_1, Index_1)) || ...`

#### Sleep

These APIs help when putting the system to an EM2/EM3/EM4 sleep states where the high frequency clock is disabled. 

The RAIL library has its own timebase and the ability to schedule operations into the future. When going to any power mode that disables the HF clock used for the radio (EM2/EM3/EM4), it is important that this timebase is synchronized to a running LFCLK and the chip is set to wake up before the next scheduled event. If RAIL has not been configured to use the power manager, [RAIL_Sleep()](sleep#rail-sleep) and [RAIL_Wake()](sleep#rail-wake) must be called for performing this synchronization. If RAIL has been configured to use the power manager, [RAIL_InitPowerManager()](sleep#rail-init-power-manager), it will automatically perform timer synchronization based on the selected [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t). Calls to [RAIL_Sleep()](sleep#rail-sleep) and [RAIL_Wake()](sleep#rail-wake) are unsupported in such a scenario.

Following example code snippets demonstrate synchronizing the timebase with and without timer synchronization:

**Sleep with timer synchronization:**

When sleeping with timer synchronization, you must first get the required LFCLK up and running and leave it running across sleep so that the high frequency clock that drives the RAIL time base can be synchronized to it. The [RAIL_Sleep()](sleep#rail-sleep) API will also set up a wake event on the timer to wake up wakeupProcessTime before the next timer event so that it can run successfully. See the [EFR32](efr32-main) sections on Low-Frequency Clocks and RAIL Timer Synchronization for more setup details.

This is useful when maintaining packet time stamps across sleep or use the scheduled RX/TX APIs while sleeping in between. It does take more time and code to do the synchronization. If your application does not need this, it should be avoided.

Example (without Power Manager): 

```c
#include "rail.h"

extern RAIL_Handle_t railHandle;
// Wakeup time for your crystal/board/chip combination
extern uint32_t wakeupProcessTime;

void main(void)
{
  RAIL_Status_t status;
  bool shouldSleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  BoardSetupLFCLK()

  // Configure sleep for timer synchronization
  RAIL_TimerSyncConfig_t timerSyncConfig = RAIL_TIMER_SYNC_DEFAULT;
  status = RAIL_ConfigSleepAlt(railHandle, &timerSyncConfig);
  assert(status == RAIL_STATUS_NO_ERROR);

  // Application main loop
  while(1) {
    // ... do normal app stuff and set shouldSleep to true when we want to
    // sleep
    if (shouldSleep) {
      bool sleepAllowed = false;

      // Go critical to assess sleep decisions
      CORE_ENTER_CRITICAL();
      if (RAIL_Sleep(wakeupProcessTime, &sleepAllowed) != RAIL_STATUS_NO_ERROR) {
        printf("Error trying to go to sleep!");
        CORE_EXIT_CRITICAL();
        continue;
      }
      if (sleepAllowed) {
        // Go to sleep
      }
      // Wakeup and sync the RAIL timebase back up
      RAIL_Wake(0);
      CORE_EXIT_CRITICAL();
    }
  }
}

```

Example (with Power Manager): 

```c
#include "rail.h"
#include "sl_power_manager.h"

extern RAIL_Handle_t railHandle;

void main(void)
{
  RAIL_Status_t status;
  bool shouldSleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  BoardSetupLFCLK();
  // Configure sleep for timer synchronization
  RAIL_TimerSyncConfig_t timerSyncConfig = RAIL_TIMER_SYNC_DEFAULT;
  status = RAIL_ConfigSleepAlt(railHandle, &timerSyncConfig);
  assert(status == RAIL_STATUS_NO_ERROR);
  // Initialize application-level power manager service
  sl_power_manager_init();
  // Initialize RAIL library's use of the power manager
  RAIL_InitPowerManager();

  // Application main loop
  while(1) {
    // ... do normal app stuff and set shouldSleep to true when we want to
    // sleep
    if (shouldSleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

RAIL APIs such as, [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx), [RAIL_ScheduleRx()](receive#rail-schedule-rx), [RAIL_SetTimer()](system-timing#rail-set-timer), [RAIL_SetMultiTimer()](system-timing#rail-set-multi-timer) can be used to schedule periodic wakeups to perform a scheduled operation. The call to sl_power_manager_sleep() in the main loop ensures that the device sleeps until the scheduled operation is due. Upon completion, each instantaneous or scheduled RX/TX operation will indicate radio busy to the power manager to allow the application to service the RAIL event and perform subsequent operations before going to sleep. Therefore, it is important that the application idle the radio by either calling [RAIL_Idle()](state-transitions#rail-idle-1) or [RAIL_YieldRadio()](multiprotocol#rail-yield-radio). If the radio transitions to RX after an RX or TX operation, always call [RAIL_Idle()](state-transitions#rail-idle-1) in order transition to a lower sleep state. If the radio transitions to idle after an RX or TX operation, [RAIL_YieldRadio()](multiprotocol#rail-yield-radio) should suffice in indicating to the power manager that the radio is no longer busy and the device can sleep.

The following example shows scheduling periodic TX on getting a TX completion event: 

```c
void RAILCb_Event(RAIL_Handle_t railHandle, RAIL_Events_t events)
{
  // Omitting other event handlers
  if (events & RAIL_EVENTS_TX_COMPLETION) {
    // Schedule the next TX.
    RAIL_ScheduleTxConfig_t config = {
      .when = (RAIL_Time_t)parameters->startTime,
      .mode = (RAIL_TimeMode_t)parameters->startTimeMode
    };
    (void)RAIL_StartScheduledTx(railHandle, channel, 0, &config, NULL);
  }
}

```

**Note**

- The above code assumes that RAIL automatic state transitions after TX are idle. Use [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) to ensure the right state transitions are used. Radio must be idle for the device to enter EM2 or lower energy mode.
- When using the power manager, usage of [RAIL_YieldRadio()](multiprotocol#rail-yield-radio) in single protocol RAIL is similar to its usage in multiprotocol RAIL. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.
- Back to back scheduled operations do not require an explicit call to [RAIL_YieldRadio()](multiprotocol#rail-yield-radio) if the radio transitions to idle.

**Sleep without timer synchronization:**

When sleeping without timer synchronization, you are free to enable only the LFCLKs and wake sources required by the application. RAIL will not attempt to configure any wake events and may miss anything that occurs over sleep.

This is useful when your application does not care about packet time stamps or scheduling operations accurately over sleep.

Example (without Power Manager): 

```c
#include "rail.h"

extern RAIL_Handle_t railHandle;

void main(void)
{
  RAIL_Status_t status;
  bool shouldSleep = false;

  // Configure sleep for no timer synchronization
  RAIL_TimerSyncConfig_t timerSyncConfig = {
    .sleep = RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED,
  };
  status = RAIL_ConfigSleepAlt(railHandle, &timerSyncConfig);
  assert(status == RAIL_STATUS_NO_ERROR);

  // Application main loop
  while(1) {
    // ... do normal app stuff and set shouldSleep to true when we want to
    // sleep
    if (shouldSleep) {
      bool sleepAllowed = false;
      uint32_t sleepTime = 0;

      // Go critical to assess sleep decisions
      CORE_ENTER_CRITICAL();
      if (RAIL_Sleep(0, &sleepAllowed) != RAIL_STATUS_NO_ERROR) {
        printf("Error trying to go to sleep!");
        CORE_EXIT_CRITICAL();
        continue;
      }
      if (sleepAllowed) {
        // Go to sleep and optionally update sleepTime to the correct value
        // in microseconds
      }
      // Wakeup and sync the RAIL timebase back up
      RAIL_Wake(sleepTime);
      CORE_EXIT_CRITICAL();
    }
  }
}

```

Example (with Power Manager): 

```c
#include "rail.h"
#include "sl_power_manager.h"

extern RAIL_Handle_t railHandle;

void main(void)
{
  RAIL_Status_t status;
  bool shouldSleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  BoardSetupLFCLK();
  // Configure sleep for no timer synchronization
  RAIL_TimerSyncConfig_t timerSyncConfig = {
    .sleep = RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED,
  };
  status = RAIL_ConfigSleepAlt(railHandle, &timerSyncConfig);
  assert(status == RAIL_STATUS_NO_ERROR);
  // Initialize application-level power manager service
  sl_power_manager_init();
  // Initialize RAIL library's use of the power manager
  RAIL_InitPowerManager();

  // Application main loop
  while(1) {
    // ... do normal app stuff and set shouldSleep to true when we want to
    // sleep
    if (shouldSleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

The RAIL library has its own timebase and the ability to schedule operations into the future. When going to any power mode that disables the HF clock used for the radio (EM2/EM3/EM4), it is important that this timebase is synchronized to a running LFCLK and the chip is set to wake up before the next scheduled event. If RAIL has not been configured to use the power manager, [sl_rail_sleep()](sleep#sl-rail-sleep) and [sl_rail_wake()](sleep#sl-rail-wake) must be called for performing this synchronization. If RAIL has been configured to use the power manager, [sl_rail_init_power_manager()](sleep#sl-rail-init-power-manager), it will automatically perform timer synchronization based on the selected [sl_rail_timer_sync_config_t](sl-rail-timer-sync-config-t). Calls to [sl_rail_sleep()](sleep#sl-rail-sleep) and [sl_rail_wake()](sleep#sl-rail-wake) are unsupported in such a scenario.

Following example code snippets demonstrate synchronizing the timebase with and without timer synchronization:

**Sleep with timer synchronization:**

When sleeping with timer synchronization, you must first get the required LFCLK up and running and leave it running across sleep so that the high frequency clock that drives the RAIL time base can be synchronized to it. The [sl_rail_sleep()](sleep#sl-rail-sleep) API will also set up a wake event on the timer to wake up wakeup_process_time_us before the next timer event so that it can run successfully. See the [EFR32](efr32-main) sections on Low-Frequency Clocks and RAIL Timer Synchronization for more setup details.

This is useful when maintaining packet time stamps across sleep or use the scheduled RX/TX APIs while sleeping in between. It does take more time and code to do the synchronization. If your application does not need this, it should be avoided.

Example (without Power Manager): 

```c
#include "sl_rail.h"

extern sl_rail_handle_t rail_handle;
// Wakeup time for your crystal/board/chip combination
extern uint32_t wakeup_process_time_us;

void main(void)
{
  sl_rail_status_t status;
  bool should_sleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  Board_Setup_LFCLK();

  // Configure sleep for timer synchronization
  sl_rail_timer_sync_config_t timer_sync_config = SL_RAIL_TIMER_SYNC_DEFAULT;
  status = sl_rail_config_sleep(rail_handle, &timer_sync_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Application main loop
  while(1) {
    // ... do normal app stuff and set should_sleep to true when we want to
    // sleep
    if (should_sleep) {
      bool sleep_allowed = false;

      // Go critical to assess sleep decisions
      CORE_ENTER_CRITICAL();
      if (sl_rail_sleep(wakeup_process_time_us, &sleep_allowed) != SL_RAIL_STATUS_NO_ERROR) {
        printf("Error trying to go to sleep!");
        CORE_EXIT_CRITICAL();
        continue;
      }
      if (sleep_allowed) {
        // Go to sleep
      }
      // Wakeup and sync the RAIL timebase back up
      sl_rail_wake(0);
      CORE_EXIT_CRITICAL();
    }
  }
}

```

Example (with Power Manager): 

```c
#include "sl_rail.h"
#include "sl_power_manager.h"

extern sl_rail_handle_t rail_handle;

void main(void)
{
  sl_rail_status_t status;
  bool should_sleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  Board_Setup_LFCLK();
  // Configure sleep for timer synchronization
  sl_rail_timer_sync_config_t timer_sync_config = SL_RAIL_TIMER_SYNC_DEFAULT;
  status = sl_rail_config_sleep(rail_handle, &timer_sync_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  // Initialize application-level power manager service
  sl_power_manager_init();
  // Initialize RAIL library's use of the power manager
  sl_rail_init_power_manager();

  // Application main loop
  while (1) {
    // ... do normal app stuff and set should_sleep to true when we want to
    // sleep
    if (should_sleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

RAIL APIs such as, [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx), [sl_rail_start_scheduled_rx()](receive#sl-rail-start-scheduled-rx), [sl_rail_set_timer()](system-timing#sl-rail-set-timer), [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer) can be used to schedule periodic wakeups to perform a scheduled operation. The call to sl_power_manager_sleep() in the main loop ensures that the device sleeps until the scheduled operation is due. Upon completion, each instantaneous or scheduled RX/TX operation will indicate radio busy to the power manager to allow the application to service the RAIL event and perform subsequent operations before going to sleep. Therefore, it is important that the application idle the radio by either calling [sl_rail_idle()](state-transitions#sl-rail-idle-1) or [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio). If the radio transitions to RX after an RX or TX operation, always call [sl_rail_idle()](state-transitions#sl-rail-idle-1) in order transition to a lower sleep state. If the radio transitions to idle after an RX or TX operation, [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) should suffice in indicating to the power manager that the radio is no longer busy and the device can sleep.

The following example shows scheduling periodic TX on getting a TX completion event: 

```c
void rail_events_callback(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Omitting other event handlers
  if (events & SL_RAIL_EVENTS_TX_COMPLETION) {
    // Schedule the next TX.
    sl_rail_scheduled_tx_config_t config = {
      .when = (sl_rail_time_t)parameters->start_time,
      .mode = (sl_rail_time_mode_t)parameters->start_time_mode
    };
    (void)sl_rail_start_scheduled_tx(rail_handle, channel, 0, &config, NULL);
  }
}

```

**Note**

- The above code assumes that RAIL automatic state transitions after TX are idle. Use [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) to ensure the right state transitions are used. Radio must be idle for the device to enter EM2 or lower energy mode.
- When using the power manager, usage of [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) in single protocol RAIL is similar to its usage in multiprotocol RAIL. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.
- Back to back scheduled operations do not require an explicit call to [sl_rail_yield_radio()](multiprotocol#sl-rail-yield-radio) if the radio transitions to idle.

**Sleep without timer synchronization:**

When sleeping without timer synchronization, you are free to enable only the LFCLKs and wake sources required by the application. RAIL will not attempt to configure any wake events and may miss anything that occurs over sleep.

This is useful when your application does not care about packet time stamps or scheduling operations accurately over sleep.

Example (without Power Manager): 

```c
#include "sl_rail.h"

extern sl_rail_handle_t rail_handle;

void main(void)
{
  sl_rail_status_t status;
  bool should_sleep = false;

  // Configure sleep for no timer synchronization
  sl_rail_timer_sync_config_t timer_sync_config = {
    .sleep = SL_RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED,
  };
  status = sl_rail_config_sleep(rail_handle, &timer_sync_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);

  // Application main loop
  while(1) {
    // ... do normal app stuff and set should_sleep to true when we want to
    // sleep
    if (should_sleep) {
      bool sleep_allowed = false;
      uint32_t sleep_time = 0;

      // Go critical to assess sleep decisions
      CORE_ENTER_CRITICAL();
      if (sl_rail_sleep(0, &sleep_allowed) != SL_RAIL_STATUS_NO_ERROR) {
        printf("Error trying to go to sleep!");
        CORE_EXIT_CRITICAL();
        continue;
      }
      if (sleep_allowed) {
        // Go to sleep and optionally update sleep_time to the correct value
        // in microseconds
      }
      // Wakeup and sync the RAIL timebase back up
      sl_rail_wake(sleep_time);
      CORE_EXIT_CRITICAL();
    }
  }
}

```

Example (with Power Manager): 

```c
#include "sl_rail.h"
#include "sl_power_manager.h"

extern sl_rail_handle_t rail_handle;

void main(void)
{
  sl_rail_status_t status;
  bool should_sleep = false;

  // This function depends on your board/chip but it must enable the LFCLK
  // you intend to use for RTCC sync before we configure sleep as that function
  // will attempt to auto detect the clock.
  Board_Setup_LFCLK();
  // Configure sleep for no timer synchronization
  sl_rail_timer_sync_config_t timer_sync_config = {
    .sleep = SL_RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED,
  };
  status = sl_rail_config_sleep(rail_handle, &timer_sync_config);
  assert(status == SL_RAIL_STATUS_NO_ERROR);
  // Initialize application-level power manager service
  sl_power_manager_init();
  // Initialize RAIL library's use of the power manager
  sl_rail_init_power_manager();

  // Application main loop
  while(1) {
    // ... do normal app stuff and set should_sleep to true when we want to
    // sleep
    if (should_sleep) {
      // Let the CPU go to sleep if the system allows it.
      sl_power_manager_sleep();
    }
  }
}

```

##### Modules

[RAIL_TimerSyncConfig_t](rail-timer-sync-config-t)

[sl_rail_timer_sync_config_t](sl-rail-timer-sync-config-t)

[EFR32xG2x](sleep-efr32-xg2-x)

[SIxx3xx](sleep-sixx3-xx)

##### Enumerations

###### RAIL_SleepConfig_t

```
enum RAIL_SleepConfig_t {
    RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED = 0
    RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED = 1
}
```

**Description:**

The configuration.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_sleep_config_t](sleep#sl-rail-sleep-config-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED|Disable timer sync before and after sleep.|
|RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED|Enable timer sync before and after sleep.|

###### sl_rail_sleep_config_t

```
enum sl_rail_sleep_config_t {
    SL_RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED = 0u
    SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED = 1u
}
```

**Description:**

The configuration.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_SLEEP_CONFIG_TIMERSYNC_DISABLED|Disable timer sync before and after sleep.|
|SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED|Enable timer sync before and after sleep.|

##### Functions

###### RAILCb_ConfigSleepTimerSync

`void RAILCb_ConfigSleepTimerSync(RAIL_TimerSyncConfig_t *timerSyncConfig)`

**Description:** Configure RAIL timer synchronization.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) *|[inout]|timerSyncConfig|A pointer to the [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) structure containing the configuration parameters for timer sync. The [RAIL_TimerSyncConfig_t::sleep](rail-timer-sync-config-t#sleep) field is ignored in this call.|

This function is optional to implement.

This function is called during [RAIL_ConfigSleep()](sleep#rail-config-sleep) to allow an application to configure the PRS and RTCC channels used for timer sync to values other than their defaults. The default channels are populated in timerSyncConfig and can be overwritten by the application. If this function is not implemented by the application, a default implementation from within the RAIL library will be used that simply maintains the default channel values in timerSyncConfig. For example: 

```c
void RAILCb_ConfigSleepTimerSync(RAIL_TimerSyncConfig_t *timerSyncConfig)
{
  timerSyncConfig->prsChannel = MY_TIMERSYNC_PRS_CHANNEL;
  timerSyncConfig->rtccChannel = MY_TIMERSYNC_RTCC_CHANNEL;
}

```

If an unsupported channel is selected by the application, [RAIL_ConfigSleep()](sleep#rail-config-sleep) will return [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).

**Deprecated**This RAIL 2.x callback has been eliminated in RAIL 3. Use [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) to specify use of default or specific PRS and RTCC channels. 

###### RAIL_ConfigSleep

`RAIL_Status_t RAIL_ConfigSleep(RAIL_Handle_t railHandle, RAIL_SleepConfig_t sleepConfig)`

**Description:** Initialize RAIL timer synchronization.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_SleepConfig_t](sleep#rail-sleep-config-t)|[in]|sleepConfig|A sleep configuration.|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- As this function relies on PRS and SYSRTC access and RAIL is meant to run in TrustZone non-secure world, it is not supported if PRS or SYSRTC are configured as secure peripheral and sleepConfig is set to [RAIL_SleepConfig_t::RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled). It will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_sleep()](sleep#sl-rail-config-sleep) with a different parameter type. 

###### RAIL_ConfigSleepAlt

`RAIL_Status_t RAIL_ConfigSleepAlt(RAIL_Handle_t railHandle, const RAIL_TimerSyncConfig_t *syncConfig)`

**Description:** Initialize RAIL timer synchronization.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) *|[in]|syncConfig|A non-NULL pointer to the timer synchronization configuration.|

**Returns**

- Status code indicating success of the function call.

The default structure used to enable timer synchronization across sleep is [RAIL_TIMER_SYNC_DEFAULT](sleep#rail-timer-sync-default).

**Warnings**

- As this function relies on PRS and SYSRTC access and RAIL is meant to run in TrustZone non-secure world, it is not supported if PRS or SYSRTC are configured as secure peripheral and syncConfig->sleep is set to [RAIL_SleepConfig_t::RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled). It will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_config_sleep()](sleep#sl-rail-config-sleep). 

###### RAIL_Sleep

`RAIL_Status_t RAIL_Sleep(uint16_t wakeupProcessTime, bool *deepSleepAllowed)`

**Description:** Stop the RAIL timer(s) and prepare RAIL for sleep.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t|[in]|wakeupProcessTime|Time in microseconds that the application and hardware need to recover from sleep state.|
|bool *|[out]|deepSleepAllowed|A pointer to boolean that will be set true if system can go to deep sleep or false if system must not go to deep sleep (EM2 or lower energy modes).|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- The active RAIL configuration must be idle to enable sleep.

**Note**

- This API must not be called if RAIL Power Manager is initialized.

**Deprecated**RAIL 2.x synonym of [sl_rail_sleep()](sleep#sl-rail-sleep). 

###### RAIL_Wake

`RAIL_Status_t RAIL_Wake(RAIL_Time_t elapsedTime)`

**Description:** Wake RAIL from sleep and restart the RAIL timer(s).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|elapsedTime|Add this sleep duration in microseconds to the RAIL timer(s) before restarting it(them).|

**Returns**

- Status code indicating success of the function call.

If the timer sync was enabled by [RAIL_ConfigSleep()](sleep#rail-config-sleep), synchronize the RAIL timer(s) using an alternate timer. Otherwise, add elapsedTime to the RAIL timer(s).

**Note**

- This API must not be called if RAIL Power Manager is initialized.

**Deprecated**RAIL 2.x synonym of [sl_rail_wake()](sleep#sl-rail-wake). 

###### RAIL_InitPowerManager

`RAIL_Status_t RAIL_InitPowerManager(void)`

**Description:** Initialize RAIL Power Manager.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must be called only when the application is built and initialized with Power Manager plugin and when the radio is idle. RAIL will perform timer synchronization, upon transitioning from EM2 or lower to EM1 or higher energy mode or vice-versa, in the Power Manager EM transition callback.

**Warnings**

- Since EM transition callbacks are not called in a deterministic order, it is suggested to not call any RAIL time dependent APIs in an EM transition callback.
- As this function relies on EMU access and RAIL is meant to run in TrustZone non-secure world, it is not supported if EMU is configured as secure peripheral and it will return [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

**Deprecated**RAIL 2.x synonym of [sl_rail_init_power_manager()](sleep#sl-rail-init-power-manager). 

###### RAIL_DeinitPowerManager

`RAIL_Status_t RAIL_DeinitPowerManager(void)`

**Description:** Stop the RAIL Power Manager.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- The active RAIL configuration must be idle to disable radio power manager and there should be no outstanding requirements by radio power manager.

**Deprecated**RAIL 2.x synonym of [sl_rail_deinit_power_manager()](sleep#sl-rail-deinit-power-manager). 

###### sl_rail_config_sleep

`sl_rail_status_t sl_rail_config_sleep(sl_rail_handle_t rail_handle, const sl_rail_timer_sync_config_t *p_timer_sync_config)`

**Description:** Initialize RAIL timer synchronization.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_timer_sync_config_t](sl-rail-timer-sync-config-t) *|[in]|p_timer_sync_config|A non-NULL pointer to the timer synchronization configuration.|

**Returns**

- Status code indicating success of the function call.

The default structure used to enable timer synchronization across sleep is [SL_RAIL_TIMER_SYNC_DEFAULT](sleep#sl-rail-timer-sync-default).

**Warnings**

- As this function relies on PRS and SYSRTC access and RAIL is meant to run in TrustZone non-secure world, it is not supported if PRS or SYSRTC are configured as secure peripheral and p_timer_sync_config->sleep is set to [sl_rail_sleep_config_t::SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#sl-rail-sleep-config-timersync-enabled). It will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_sleep

`sl_rail_status_t sl_rail_sleep(uint16_t wakeup_process_time_us, bool *p_deep_sleep_allowed)`

**Description:** Stop the RAIL timer(s) and prepare RAIL for sleep.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t|[in]|wakeup_process_time_us|Time in microseconds that the application and hardware need to recover from sleep state.|
|bool *|[out]|p_deep_sleep_allowed|A pointer to boolean that will be set true if system can go to deep sleep or false if system must not go to deep sleep (EM2 or lower energy modes).|

**Returns**

- Status code indicating success of the function call.

**Warnings**

- The active RAIL configuration must be idle to enable sleep.

**Note**

- This API must not be called if RAIL Power Manager is initialized.

###### sl_rail_wake

`sl_rail_status_t sl_rail_wake(sl_rail_time_t elapsed_time_us)`

**Description:** Wake RAIL from sleep and restart the RAIL timer(s).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|elapsed_time_us|Add this sleep duration in microseconds to the RAIL timer(s) before restarting it(them).|

**Returns**

- Status code indicating success of the function call.

If the timer sync was enabled by [sl_rail_config_sleep()](sleep#sl-rail-config-sleep), synchronize the RAIL timer(s) using an alternate timer. Otherwise, add elapsed_time_us to the RAIL timer(s).

**Note**

- This API must not be called if RAIL Power Manager is initialized.

###### sl_rail_init_power_manager

`sl_rail_status_t sl_rail_init_power_manager(void)`

**Description:** Initialize RAIL Power Manager.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must be called only when the application is built and initialized with Power Manager plugin and when the radio is idle. RAIL will perform timer synchronization, upon transitioning from EM2 or lower to EM1 or higher energy mode or vice-versa, in the Power Manager EM transition callback.

**Warnings**

- Since EM transition callbacks are not called in a deterministic order, it is suggested to not call any RAIL time dependent APIs in an EM transition callback.
- As this function relies on EMU access and RAIL is meant to run in TrustZone non-secure world, it is not supported if EMU is configured as secure peripheral and it will return [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

###### sl_rail_deinit_power_manager

`sl_rail_status_t sl_rail_deinit_power_manager(void)`

**Description:** Stop the RAIL Power Manager.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- The active RAIL configuration must be idle to disable radio power manager and there should be no outstanding requirements by radio power manager.

##### Macros

`#define RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT (255U)`

**Description**: Platform-agnostic value to use default PRS channel when configuring sleep.

`#define RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (255U)`

**Description**: Platform-agnostic vlaue to use default RTCC channel when configuring sleep.

`#define RAIL_TIMER_SYNC_DEFAULT `

**Description**: Default timer synchronization configuration.

`#define SL_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT (255U)`

**Description**: Platform-agnostic value to use default PRS channel when configuring sleep.

`#define SL_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (255U)`

**Description**: Platform-agnostic vlaue to use default RTCC channel when configuring sleep.

`#define SL_RAIL_TIMER_SYNC_DEFAULT `

**Description**: Default timer synchronization configuration.

Channel values used to perform timer sync before and after sleep. 

The default value of this structure is provided in the [RAIL_TIMER_SYNC_DEFAULT](sleep#rail-timer-sync-default) macro.

**Deprecated**RAIL 2.x synonym of [sl_rail_timer_sync_config_t](sl-rail-timer-sync-config-t). 

###### Public Attributes

###### prsChannel (heading level 7)

```
uint8_t RAIL_TimerSyncConfig_t::prsChannel
```

**Description:** PRS Channel used for timer sync operations.

**Details:** Use [RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep#rail-timer-sync-prs-channel-default) or another suitable one.

**Deprecated**RAIL 2.x synonym of [sl_rail_timer_sync_config_t::prs_channel](sl-rail-timer-sync-config-t#prs-channel).

###### rtccChannel (heading level 7)

```
uint8_t RAIL_TimerSyncConfig_t::rtccChannel
```

**Description:** RTCC Channel used for timer sync operations.

**Details:** Only applies to platforms where the RTCC used for timer sync has multiple channels. Use [RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep#rail-timer-sync-rtcc-channel-default) or another suitable one.

**Deprecated**RAIL 2.x synonym of [sl_rail_timer_sync_config_t::rtcc_channel](sl-rail-timer-sync-config-t#rtcc-channel).

###### sleep (heading level 7)

```
RAIL_SleepConfig_t RAIL_TimerSyncConfig_t::sleep
```

**Description:** Whether to sync the timer before and after sleeping.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_timer_sync_config_t::sleep](sl-rail-timer-sync-config-t#sleep).

Channel values used to perform timer sync before and after sleep. 

The default value of this structure is provided in the [SL_RAIL_TIMER_SYNC_DEFAULT](sleep#sl-rail-timer-sync-default) macro. 

###### Public Attributes

###### prs_channel (heading level 7)

```
uint8_t sl_rail_timer_sync_config_t::prs_channel
```

**Description:** PRS Channel used for timer sync operations.

**Details:** Use [SL_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT](sleep#sl-rail-timer-sync-prs-channel-default) or another suitable one.

###### rtcc_channel (heading level 7)

```
uint8_t sl_rail_timer_sync_config_t::rtcc_channel
```

**Description:** RTCC Channel used for timer sync operations.

**Details:** Only applies to platforms where the RTCC used for timer sync has multiple channels. Use [SL_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT](sleep#sl-rail-timer-sync-rtcc-channel-default) or another suitable one.

###### sleep (heading level 7)

```
sl_rail_sleep_config_t sl_rail_timer_sync_config_t::sleep
```

**Description:** Whether to sync the timer before and after sleeping.

##### EFR32xG2x

EFR32xG2x-specific Sleeping. 

###### Macros

`#define RAILINT_TIMER_SYNC_PRS_CHANNEL_DEFAULT (7U)`

**Description**: Default PRS channel to use when configuring sleep.

`#define RAILINT_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (0U)`

**Description**: Default RTCC channel to use when configuring sleep.

`#define SLI_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT (7U)`

**Description**: Default PRS channel to use when configuring sleep.

`#define SLI_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (0U)`

**Description**: Default RTCC channel to use when configuring sleep.

##### SIxx3xx

SIxx3xx-specific Sleeping. 

###### Macros

`#define RAILINT_TIMER_SYNC_PRS_CHANNEL_DEFAULT (7U)`

**Description**: Default PRS channel to use when configuring sleep.

`#define RAILINT_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (0U)`

**Description**: Default RTCC channel to use when configuring sleep.

`#define SLI_RAIL_TIMER_SYNC_PRS_CHANNEL_DEFAULT (7U)`

**Description**: Default PRS channel to use when configuring sleep.

`#define SLI_RAIL_TIMER_SYNC_RTCC_CHANNEL_DEFAULT (0U)`

**Description**: Default RTCC channel to use when configuring sleep.

#### State Transitions

##### Modules

[RAIL_StateTiming_t](rail-state-timing-t)

[RAIL_StateTransitions_t](rail-state-transitions-t)

[sl_rail_state_timing_t](sl-rail-state-timing-t)

[sl_rail_state_transitions_t](sl-rail-state-transitions-t)

[EFR32xG2x](state-transitions-efr32-xg2-x)

[SIxx3xx](state-transitions-sixx3-xx)

##### Enumerations

###### RAIL_RadioState_t

```
enum RAIL_RadioState_t {
    RAIL_RF_STATE_INACTIVE = 0u
    RAIL_RF_STATE_ACTIVE = (1u << 0)
    RAIL_RF_STATE_RX = (1u << 1)
    RAIL_RF_STATE_TX = (1u << 2)
    RAIL_RF_STATE_IDLE = (RAIL_RF_STATE_ACTIVE)
    RAIL_RF_STATE_RX_ACTIVE = (RAIL_RF_STATE_RX | RAIL_RF_STATE_ACTIVE)
    RAIL_RF_STATE_TX_ACTIVE = (RAIL_RF_STATE_TX | RAIL_RF_STATE_ACTIVE)
}
```

**Description:**

The state of the radio.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_radio_state_t](state-transitions#sl-rail-radio-state-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RF_STATE_INACTIVE|Radio is inactive.|
|RAIL_RF_STATE_ACTIVE|Radio is either idle or, in combination with the RX and TX states, receiving or transmitting a frame.|
|RAIL_RF_STATE_RX|Radio is in receive.|
|RAIL_RF_STATE_TX|Radio is in transmit.|
|RAIL_RF_STATE_IDLE|Radio is idle.|
|RAIL_RF_STATE_RX_ACTIVE|Radio is actively receiving a frame.|
|RAIL_RF_STATE_TX_ACTIVE|Radio is actively transmitting a frame.|

###### RAIL_RadioStateDetail_t

```
enum RAIL_RadioStateDetail_t {
    RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT = 0
    RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT = 1
    RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT = 2
    RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT = 3
    RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT = 4
    RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT = 5
    RAIL_RF_STATE_DETAIL_LBT_SHIFT = 6
}
```

**Description:**

The detailed state of the radio.

**Details:**

The three radio state bits [RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#rail-rf-state-detail-idle-state), [RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#rail-rf-state-detail-rx-state), and [RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#rail-rf-state-detail-tx-state) comprise a set of mutually exclusive core radio states. Only one (or none) of these bits can be set at a time. Otherwise, the value is invalid.

The precise meaning of each of these three core bits, when set, depends on the value of the two bits [RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#rail-rf-state-detail-transition) and [RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#rail-rf-state-detail-active). When [RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#rail-rf-state-detail-transition) is set, the radio is transitioning into the core radio state corresponding to the set state bit. When it is clear, the radio is already in the core radio state that corresponds to the set state bit. When [RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#rail-rf-state-detail-active) is set, the radio is actively transmitting or receiving. When it is clear, the radio is not actively transmitting or receiving. This bit will always be clear when [RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#rail-rf-state-detail-idle-state) is set, and will always be set when [RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#rail-rf-state-detail-tx-state) is set. Otherwise, the value is invalid.

The bit [RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#rail-rf-state-detail-no-frames) is set if the radio is currently operating with frame detection disabled, and clear otherwise. The bit [RAIL_RF_STATE_DETAIL_LBT_SHIFT](state-transitions#rail-rf-state-detail-lbt-shift) is set if an LBT/CSMA operation (e.g., performing CCA) is currently ongoing, and clear otherwise.

**Deprecated**RAIL 2.x synonym of [sl_rail_radio_state_detail_t](state-transitions#sl-rail-radio-state-detail-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#rail-rf-state-detail-idle-state) bit.|
|RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#rail-rf-state-detail-rx-state) bit.|
|RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#rail-rf-state-detail-tx-state) bit.|
|RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#rail-rf-state-detail-transition) bit.|
|RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#rail-rf-state-detail-active) bit.|
|RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#rail-rf-state-detail-no-frames) bit.|
|RAIL_RF_STATE_DETAIL_LBT_SHIFT|Shift position of [RAIL_RF_STATE_DETAIL_LBT](state-transitions#rail-rf-state-detail-lbt) bit.|

###### RAIL_IdleMode_t

```
enum RAIL_IdleMode_t {
    RAIL_IDLE = 0u
    RAIL_IDLE_ABORT = 1u
    RAIL_IDLE_FORCE_SHUTDOWN = 2u
    RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS = 3u
}
```

**Description:**

An enumeration for the different types of supported idle modes.

**Details:**

These vary how quickly and destructively they put the radio into idle.

**Deprecated**RAIL 2.x synonym of [sl_rail_idle_mode_t](state-transitions#sl-rail-idle-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_IDLE|Idle the radio by turning off receive and canceling any future scheduled receive or transmit operations.|
|RAIL_IDLE_ABORT|Idle the radio by turning off receive and any scheduled events.|
|RAIL_IDLE_FORCE_SHUTDOWN|Force the radio into a shutdown mode by stopping whatever state is in progress.|
|RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS|Similar to the [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown) command, however, it will also clear any pending RAIL events related to receive and transmit.|

###### sl_rail_radio_state_t

```
enum sl_rail_radio_state_t {
    SL_RAIL_RF_STATE_INACTIVE = 0u
    SL_RAIL_RF_STATE_ACTIVE = (1u << 0)
    SL_RAIL_RF_STATE_RX = (1u << 1)
    SL_RAIL_RF_STATE_TX = (1u << 2)
    SL_RAIL_RF_STATE_IDLE = (SL_RAIL_RF_STATE_ACTIVE)
    SL_RAIL_RF_STATE_RX_ACTIVE = (SL_RAIL_RF_STATE_RX | SL_RAIL_RF_STATE_ACTIVE)
    SL_RAIL_RF_STATE_TX_ACTIVE = (SL_RAIL_RF_STATE_TX | SL_RAIL_RF_STATE_ACTIVE)
}
```

**Description:**

The state of the radio.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RF_STATE_INACTIVE|Radio is inactive.|
|SL_RAIL_RF_STATE_ACTIVE|Radio is either idle or, in combination with the RX and TX states, receiving or transmitting a frame.|
|SL_RAIL_RF_STATE_RX|Radio is in receive.|
|SL_RAIL_RF_STATE_TX|Radio is in transmit.|
|SL_RAIL_RF_STATE_IDLE|Radio is idle.|
|SL_RAIL_RF_STATE_RX_ACTIVE|Radio is actively receiving a frame.|
|SL_RAIL_RF_STATE_TX_ACTIVE|Radio is actively transmitting a frame.|

###### sl_rail_radio_state_detail_t

```
enum sl_rail_radio_state_detail_t {
    SL_RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT = 0
    SL_RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT = 1
    SL_RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT = 2
    SL_RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT = 3
    SL_RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT = 4
    SL_RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT = 5
    SL_RAIL_RF_STATE_DETAIL_LBT_SHIFT = 6
}
```

**Description:**

The detailed state of the radio.

**Details:**

The three radio state bits [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#sl-rail-rf-state-detail-idle-state), [SL_RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#sl-rail-rf-state-detail-rx-state), and [SL_RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#sl-rail-rf-state-detail-tx-state) comprise a set of mutually exclusive core radio states. Only one (or none) of these bits can be set at a time. Otherwise, the value is invalid.

The precise meaning of each of these three core bits, when set, depends on the value of the two bits [SL_RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#sl-rail-rf-state-detail-transition) and [SL_RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#sl-rail-rf-state-detail-active). When [SL_RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#sl-rail-rf-state-detail-transition) is set, the radio is transitioning into the core radio state corresponding to the set state bit. When it is clear, the radio is already in the core radio state that corresponds to the set state bit. When [SL_RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#sl-rail-rf-state-detail-active) is set, the radio is actively transmitting or receiving. When it is clear, the radio is not actively transmitting or receiving. This bit will always be clear when [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#sl-rail-rf-state-detail-idle-state) is set, and will always be set when [SL_RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#sl-rail-rf-state-detail-tx-state) is set. Otherwise, the value is invalid.

The bit [SL_RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#sl-rail-rf-state-detail-no-frames) is set if the radio is currently operating with frame detection disabled, and clear otherwise. The bit [SL_RAIL_RF_STATE_DETAIL_LBT_SHIFT](state-transitions#sl-rail-rf-state-detail-lbt-shift) is set if an LBT/CSMA operation (e.g., performing CCA) is currently ongoing, and clear otherwise.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#sl-rail-rf-state-detail-idle-state) bit.|
|SL_RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#sl-rail-rf-state-detail-rx-state) bit.|
|SL_RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#sl-rail-rf-state-detail-tx-state) bit.|
|SL_RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#sl-rail-rf-state-detail-transition) bit.|
|SL_RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#sl-rail-rf-state-detail-active) bit.|
|SL_RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#sl-rail-rf-state-detail-no-frames) bit.|
|SL_RAIL_RF_STATE_DETAIL_LBT_SHIFT|Shift position of [SL_RAIL_RF_STATE_DETAIL_LBT](state-transitions#sl-rail-rf-state-detail-lbt) bit.|

###### sl_rail_idle_mode_t

```
enum sl_rail_idle_mode_t {
    SL_RAIL_IDLE = 0u
    SL_RAIL_IDLE_ABORT = 1u
    SL_RAIL_IDLE_FORCE_SHUTDOWN = 2u
    SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS = 3u
}
```

**Description:**

An enumeration for the different types of supported idle modes.

**Details:**

These vary how quickly and destructively they put the radio into idle.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_IDLE|Idle the radio by turning off receive and canceling any future scheduled receive or transmit operations.|
|SL_RAIL_IDLE_ABORT|Idle the radio by turning off receive and any scheduled events.|
|SL_RAIL_IDLE_FORCE_SHUTDOWN|Force the radio into a shutdown mode by stopping whatever state is in progress.|
|SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS|Similar to the [SL_RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#sl-rail-idle-force-shutdown) command, however, it will also clear any pending RAIL events related to receive and transmit.|

##### Typedefs

###### RAIL_TransitionTime_t

`RAIL_TransitionTime_t`

**Description:**

Suitable type for the supported transition time range.

**Details:**

Refer to platform-specific [RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#rail-minimum-transition-us) and [RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#rail-maximum-transition-us) for the valid range of this type.

**Deprecated**RAIL 2.x synonym of [sl_rail_transition_time_t](state-transitions#sl-rail-transition-time-t).

###### sl_rail_transition_time_t

`sl_rail_transition_time_t`

**Description:**

Suitable type for the supported transition time range.

**Details:**

Refer to platform-specific [SL_RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-minimum-transition-us) and [SL_RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-maximum-transition-us) for the valid range of this type.

##### Functions

###### RAIL_SetRxTransitions

`RAIL_Status_t RAIL_SetRxTransitions(RAIL_Handle_t railHandle, const RAIL_StateTransitions_t *transitions)`

**Description:** Configure RAIL automatic state transitions after RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_StateTransitions_t](rail-state-transitions-t) *|[in]|transitions|A pointer to the state transitions to apply after reception.|

**Returns**

- Status code indicating success of the function call.

This function fails if unsupported transitions are passed in or if the radio is currently in the RX state. Success can transition to TX, RX, or IDLE, while error can transition to RX or IDLE. The timings of state transitions from the RX state are not guaranteed when packets are longer than 16 seconds on-air.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_rx_transitions()](state-transitions#sl-rail-set-rx-transitions). 

###### RAIL_GetRxTransitions

`RAIL_Status_t RAIL_GetRxTransitions(RAIL_Handle_t railHandle, RAIL_StateTransitions_t *transitions)`

**Description:** Get the current RAIL automatic state transitions after RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_StateTransitions_t](rail-state-transitions-t) *|[out]|transitions|A pointer to the state transitions that RAIL applies after receive.|

**Returns**

- Status code indicating a success of the function call.

Retrieves the current state transitions after RX and stores them in the transitions argument.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_rx_transitions()](state-transitions#sl-rail-get-rx-transitions). 

###### RAIL_SetTxTransitions

`RAIL_Status_t RAIL_SetTxTransitions(RAIL_Handle_t railHandle, const RAIL_StateTransitions_t *transitions)`

**Description:** Configure RAIL automatic state transitions after TX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_StateTransitions_t](rail-state-transitions-t) *|[in]|transitions|A pointer to the state transitions to apply after transmission.|

**Returns**

- Status code indicating a success of the function call.

This function fails if unsupported transitions are passed in or if the radio is currently in the TX state. Success and error can each transition to RX or IDLE only, not TX. For the ability to run repeated transmits, see [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat). Calling this function will clear any repeated transmissions set up by [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat).

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions). 

###### RAIL_GetTxTransitions

`RAIL_Status_t RAIL_GetTxTransitions(RAIL_Handle_t railHandle, RAIL_StateTransitions_t *transitions)`

**Description:** Get the current RAIL automatic state transitions after TX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_StateTransitions_t](rail-state-transitions-t) *|[out]|transitions|A pointer to the state transitions that RAIL applies after transmission.|

**Returns**

- Status code indicating a success of the function call.

Retrieves the current state transitions after TX and stores them in the transitions argument.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_transitions()](state-transitions#sl-rail-get-tx-transitions). 

###### RAIL_SetNextTxRepeat

`RAIL_Status_t RAIL_SetNextTxRepeat(RAIL_Handle_t railHandle, const RAIL_TxRepeatConfig_t *repeatConfig)`

**Description:** Set up automatic repeated transmits after the next transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t) *|[in]|repeatConfig|A pointer to the configuration structure for repeated transmits.|

**Returns**

- Status code indicating a success of the function call.

Repeated transmits will occur after an application-initiated transmit caused by calling one of the [Packet Transmit](packet-tx) APIs. The repetition will only occur after the first application-initiated transmit after this function is called. Future repeated transmits must be requested by calling this function again.

Each repeated transmit that occurs will have full [PTI Packet Trace](pti) information, and will receive events such as [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) as normal.

If a TX error occurs during the repetition, the process will abort and the TX error transition from [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will be used. If the repetition completes successfully, then the TX success transition from [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will be used.

Use [RAIL_GetTxPacketsRemaining()](state-transitions#rail-get-tx-packets-remaining) if need to know how many transmit completion events are expected before the repeating sequence is done, or how many were not performed due to a transmit error.

Any call to [RAIL_Idle()](state-transitions#rail-idle-1), [RAIL_StopTx()](transmit#rail-stop-tx), or [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) will clear the pending repeated transmits. The state will also be cleared by another call to this function. A DMP switch will clear this state only if the initial transmit triggering the repeated transmits has started.

One can change the repeated transmit configuration by re-calling this function with new parameters as long as that occurs prior to calling a [Packet Transmit](packet-tx) API. Passing a [RAIL_TxRepeatConfig_t::iterations](rail-tx-repeat-config-t#iterations) count of 0 will prevent the next transmit from repeating.

The application is responsible for populating the transmit data to be used by the repeated transmits via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo). Data will be transmitted from the transmit FIFO. If the transmit FIFO does not have sufficient data to transmit, a TX error will be caused and a [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) will occur. In order to avoid an underflow, the application should queue data to be transmitted as early as possible. Consider using [RAIL_TX_OPTION_RESEND](transmit#rail-tx-option-resend) if the same packet data is to be repeated: then the transmit FIFO only needs to be set/written once.

Do not call this function after starting a transmit operation via a [Packet Transmit](packet-tx) API call or before processing the final transmit completion event of a prior transmit. This function will fail to (re)configure the repetition if a transmit of any kind is ongoing, including during the time between an initial transmit and the end of a previously-configured repetition.

**Note**

- Use the compile time symbol [RAIL_SUPPORTS_TX_TO_TX](features#rail-supports-tx-to-tx-1) or the runtime call [RAIL_SupportsTxToTx()](features#rail-supports-tx-to-tx) to check whether the platform supports this feature.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat). 

###### RAIL_GetTxPacketsRemaining

`uint16_t RAIL_GetTxPacketsRemaining(RAIL_Handle_t railHandle)`

**Description:** Get the number of transmits remaining in a repeat operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

Must only be called from within event callback context when handling one of the [RAIL_EVENTS_TX_COMPLETION](events#rail-events-tx-completion) events.

**Returns**

- transmits remaining as described below.

If the TX completion event is [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) the returned value indicates how many more such events are expected before the repeat transmit operation is done. Due to interrupt latency and timing, this may be an overcount if greater than 0 but is guaranteed to be accurate when 0.

If the TX completion event is an error, the returned value indicates the number of requested transmits that were not performed. For [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) and [RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow) the count does not include the failing transmit itself. For the other errors where a transmit never started or was blocked, the count would include the failing transmit, which may be one higher than the configured [RAIL_TxRepeatConfig_t::iterations](rail-tx-repeat-config-t#iterations) if it was the original transmit that was blocked.

If an infinite repeat was configured, this will return [RAIL_TX_REPEAT_INFINITE_ITERATIONS](transmit#rail-tx-repeat-infinite-iterations).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_packets_remaining()](state-transitions#sl-rail-get-tx-packets-remaining). 

###### RAIL_SetStateTiming

`RAIL_Status_t RAIL_SetStateTiming(RAIL_Handle_t railHandle, RAIL_StateTiming_t *timings)`

**Description:** Configure RAIL automatic state transition timing.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_StateTiming_t](rail-state-timing-t) *|[inout]|timings|A pointer to the timings used to configure the RAIL state machine. This structure is updated with the actual times that were set, if an input timing is invalid.|

**Returns**

- Status code indicating a success of the function call.

The timings given are close to the actual transition time. However, a still uncharacterized software overhead occurs. Also, timings are not always adhered to when using an automatic transition after an error, due to the cleanup required to recover from the error.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing). 

###### RAIL_Idle

`RAIL_Status_t RAIL_Idle(RAIL_Handle_t railHandle, RAIL_IdleMode_t mode, bool wait)`

**Description:** Place the radio into an idle state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_IdleMode_t](state-transitions#rail-idle-mode-t)|[in]|mode|The method for shutting down the radio.|
|bool|[in]|wait|Whether this function should wait for the radio to reach idle before returning.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the radio has idled by the time this function returns, or [RAIL_STATUS_SUSPENDED](general#rail-status-suspended) if it is still in the process of idling.

This function is used to remove the radio from TX and RX states. How these states are left is defined by the mode parameter.

In multiprotocol, this API will also cause the radio to be yielded so that other tasks can be run. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_idle()](state-transitions#sl-rail-idle-1). 

###### RAIL_GetRadioState

`RAIL_RadioState_t RAIL_GetRadioState(RAIL_Handle_t railHandle)`

**Description:** Get the current radio state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- An enumeration for the current radio state.

Returns the state of the radio as a bitmask containing: [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle), [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx), [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx), and [RAIL_RF_STATE_ACTIVE](state-transitions#rail-rf-state-active). [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle), [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx), and [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx) bits are mutually exclusive. The radio can transition through intermediate states, which are not reported but are instead considered part of the state most closely associated. For example, when the radio is warming up or shutting down the transmitter or receiver, this function returns [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx) or [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx), respectively. When transitioning directly from RX to TX or vice-versa, this function returns the earlier state.

**Note**

- For a more detailed radio state, see [RAIL_GetRadioStateDetail()](state-transitions#rail-get-radio-state-detail).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_radio_state()](state-transitions#sl-rail-get-radio-state). 

###### RAIL_GetRadioStateDetail

`RAIL_RadioStateDetail_t RAIL_GetRadioStateDetail(RAIL_Handle_t railHandle)`

**Description:** Get the detailed current radio state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- An enumeration for the current detailed radio state.

Returns the state of the radio as a bitmask. The three core radio states IDLE, RX, and TX are represented by mutually exclusive bits [RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#rail-rf-state-detail-idle-state), [RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#rail-rf-state-detail-rx-state), and [RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#rail-rf-state-detail-tx-state) respectively. If the radio is transitioning between these three states, the returned bitmask will have [RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#rail-rf-state-detail-transition) set along with a bit corresponding to the destination core radio state. If, while in the receive state, the radio is actively receiving a packet, [RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#rail-rf-state-detail-active) will be set; otherwise, this bit will be clear. If frame detection is disabled, [RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#rail-rf-state-detail-no-frames) in the returned state bitmask will be set; otherwise, this bit will be clear. If the radio is performing an LBT/CSMA operation (e.g., a backoff period) [RAIL_RF_STATE_DETAIL_LBT](state-transitions#rail-rf-state-detail-lbt) in the returned state bitmask will be set; otherwise, this bit will be clear.

For the most part, the more detailed radio states returned by this API correspond to radio states returned by [RAIL_GetRadioState()](state-transitions#rail-get-radio-state) as follows:

[RAIL_RadioStateDetail_t](state-transitions#rail-radio-state-detail-t)[RAIL_RadioState_t](state-transitions#rail-radio-state-t) RAIL_RF_STATE_DETAIL_INACTIVE RAIL_RF_STATE_INACTIVE RAIL_RF_STATE_DETAIL_IDLE_STATE | RAIL_STATE_DETAIL_TRANSITION If RX overflow or leaving RX unforced: RAIL_RF_STATE_RX Else if leaving TX unforced: RAIL_RF_STATE_TX Else: RAIL_RF_STATE_IDLE RAIL_RF_STATE_DETAIL_IDLE_STATE RAIL_RF_STATE_IDLE RAIL_RF_STATE_DETAIL_IDLE_STATE | RAIL_STATE_DETAIL_LBT RAIL_RF_STATE_TX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_STATE_DETAIL_TRANSITION If leaving TX: RAIL_RF_STATE_TX Else: RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_RF_STATE_DETAIL_TRANSITION | RAIL_RF_STATE_DETAIL_NO_FRAMES If leaving TX: RAIL_RF_STATE_TX Else: RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_RF_STATE_DETAIL_NO_FRAMES RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_RF_STATE_DETAIL_LBT RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_RF_STATE_DETAIL_NO_FRAMES | RAIL_RF_STATE_DETAIL_LBT RAIL_RF_STATE_RX RAIL_RF_STATE_DETAIL_RX_STATE | RAIL_RF_STATE_DETAIL_ACTIVE RAIL_RF_STATE_RX_ACTIVE RAIL_RF_STATE_DETAIL_TX_STATE | RAIL_RF_STATE_TRANSITION If leaving RX: RAIL_RF_STATE_RX Else: RAIL_RF_STATE_TX RAIL_RF_STATE_DETAIL_TX_STATE | RAIL_RF_STATE_ACTIVE RAIL_RF_STATE_TX_ACTIVE

**Deprecated**RAIL 2.x synonym of [sl_rail_get_radio_state_detail()](state-transitions#sl-rail-get-radio-state-detail). 

###### RAIL_EnableCacheSynthCal

`RAIL_Status_t RAIL_EnableCacheSynthCal(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable/disable caching of synth calibration value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|A boolean to enable or disable caching of synth calibration.|

**Returns**

- Status code indicating success of the function call.

Once enabled, the sequencer will start caching synth calibration values for channels and apply them instead of performing calibration on every state transition and channel change. This will increase the transition time for the first time calibration is performed. Subsequent state transitions will be faster. The cache size is 2. [RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1) internally uses this feature and there is no need to enable/disable it. This function returns [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if we try to disable it while [RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1) is enabled.

**Note**

- This function will improve the minimum timings that can be achieved in [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx), [RAIL_StateTiming_t::idleToTx](rail-state-timing-t#idle-to-tx), [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx), [RAIL_StateTiming_t::txToRx](rail-state-timing-t#tx-to-rx) and [RAIL_StateTiming_t::txToTx](rail-state-timing-t#tx-to-tx). A call to [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing) is needed to achieve lower transition times.
- On a protocol switch the cache is cleared, so it is not suitable for applications where a protocol switch happens frequently, like with Dynamic Multiprotocol.

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_cache_synth_cal()](state-transitions#sl-rail-enable-cache-synth-cal). 

###### sl_rail_set_rx_transitions

`sl_rail_status_t sl_rail_set_rx_transitions(sl_rail_handle_t rail_handle, const sl_rail_state_transitions_t *p_transitions)`

**Description:** Configure RAIL automatic state transitions after RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_state_transitions_t](sl-rail-state-transitions-t) *|[in]|p_transitions|A pointer to the state transitions to apply after reception.|

**Returns**

- Status code indicating success of the function call.

This function fails if unsupported transitions are passed in or if the radio is currently in the RX state. Success can transition to TX, RX, or IDLE, while error can transition to RX or IDLE. The timings of state transitions from the RX state are not guaranteed when packets are longer than 16 seconds on-air. 

###### sl_rail_get_rx_transitions

`sl_rail_status_t sl_rail_get_rx_transitions(sl_rail_handle_t rail_handle, sl_rail_state_transitions_t *p_transitions)`

**Description:** Get the current RAIL automatic state transitions after RX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_state_transitions_t](sl-rail-state-transitions-t) *|[out]|p_transitions|A pointer to the state transitions that RAIL applies after receive.|

**Returns**

- Status code indicating a success of the function call.

Retrieves the current state transitions after RX and stores them in the transitions argument. 

###### sl_rail_set_tx_transitions

`sl_rail_status_t sl_rail_set_tx_transitions(sl_rail_handle_t rail_handle, const sl_rail_state_transitions_t *p_transitions)`

**Description:** Configure RAIL automatic state transitions after TX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_state_transitions_t](sl-rail-state-transitions-t) *|[in]|p_transitions|A pointer to the state transitions to apply after transmission.|

**Returns**

- Status code indicating a success of the function call.

This function fails if unsupported transitions are passed in or if the radio is currently in the TX state. Success and error can each transition to RX or IDLE only, not TX. For the ability to run repeated transmits, see [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat). Calling this function will clear any repeated transmissions set up by [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat). 

###### sl_rail_get_tx_transitions

`sl_rail_status_t sl_rail_get_tx_transitions(sl_rail_handle_t rail_handle, sl_rail_state_transitions_t *p_transitions)`

**Description:** Get the current RAIL automatic state transitions after TX.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_state_transitions_t](sl-rail-state-transitions-t) *|[out]|p_transitions|A pointer to the state transitions that RAIL applies after transmission.|

**Returns**

- Status code indicating a success of the function call.

Retrieves the current state transitions after TX and stores them in the transitions argument. 

###### sl_rail_set_next_tx_repeat

`sl_rail_status_t sl_rail_set_next_tx_repeat(sl_rail_handle_t rail_handle, const sl_rail_tx_repeat_config_t *p_repeat_config)`

**Description:** Set up automatic repeated transmits after the next transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_tx_repeat_config_t](sl-rail-tx-repeat-config-t) *|[in]|p_repeat_config|A pointer to the configuration structure for repeated transmits.|

**Returns**

- Status code indicating a success of the function call.

Repeated transmits will occur after an application-initiated transmit caused by calling one of the [Packet Transmit](packet-tx) APIs. The repetition will only occur after the first application-initiated transmit after this function is called. Future repeated transmits must be requested by calling this function again.

Each repeated transmit that occurs will have full [PTI Packet Trace](pti) information, and will receive events such as [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) as normal.

If a TX error occurs during the repetition, the process will abort and the TX error transition from [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will be used. If the repetition completes successfully, then the TX success transition from [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will be used.

Use [sl_rail_get_tx_packets_remaining()](state-transitions#sl-rail-get-tx-packets-remaining) if need to know how many transmit completion events are expected before the repeating sequence is done, or how many were not performed due to a transmit error.

Any call to [sl_rail_idle()](state-transitions#sl-rail-idle-1), [sl_rail_stop_tx()](transmit#sl-rail-stop-tx), or [sl_rail_set_tx_transitions()](state-transitions#sl-rail-set-tx-transitions) will clear the pending repeated transmits. The state will also be cleared by another call to this function. A DMP switch will clear this state only if the initial transmit triggering the repeated transmits has started.

One can change the repeated transmit configuration by re-calling this function with new parameters as long as that occurs prior to calling a [Packet Transmit](packet-tx) API. Passing a [sl_rail_tx_repeat_config_t::iterations](sl-rail-tx-repeat-config-t#iterations) count of 0 will prevent the next transmit from repeating.

The application is responsible for populating the transmit data to be used by the repeated transmits via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). Data will be transmitted from the transmit FIFO. If the transmit FIFO does not have sufficient data to transmit, a TX error will be caused and a [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) will occur. In order to avoid an underflow, the application should queue data to be transmitted as early as possible. Consider using [SL_RAIL_TX_OPTION_RESEND](transmit#sl-rail-tx-option-resend) if the same packet data is to be repeated: then the transmit FIFO only needs to be set/written once.

Do not call this function after starting a transmit operation via a [Packet Transmit](packet-tx) API call or before processing the final transmit completion event of a prior transmit. This function will fail to (re)configure the repetition if a transmit of any kind is ongoing, including during the time between an initial transmit and the end of a previously-configured repetition.

**Note**

- Use the compile time symbol [SL_RAIL_SUPPORTS_TX_TO_TX](features#sl-rail-supports-tx-to-tx-1) or the runtime call [sl_rail_supports_tx_to_tx()](features#sl-rail-supports-tx-to-tx) to check whether the platform supports this feature.

###### sl_rail_get_tx_packets_remaining

`uint16_t sl_rail_get_tx_packets_remaining(sl_rail_handle_t rail_handle)`

**Description:** Get the number of transmits remaining in a repeat operation.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

Must only be called from within event callback context when handling one of the [SL_RAIL_EVENTS_TX_COMPLETION](events#sl-rail-events-tx-completion) events.

**Returns**

- transmits remaining as described below.

If the TX completion event is [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) the returned value indicates how many more such events are expected before the repeat transmit operation is done. Due to interrupt latency and timing, this may be an overcount if greater than 0 but is guaranteed to be accurate when 0.

If the TX completion event is an error, the returned value indicates the number of requested transmits that were not performed. For [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted) and [SL_RAIL_EVENT_TX_UNDERFLOW](events#sl-rail-event-tx-underflow) the count does not include the failing transmit itself. For the other errors where a transmit never started or was blocked, the count would include the failing transmit, which may be one higher than the configured [sl_rail_tx_repeat_config_t::iterations](sl-rail-tx-repeat-config-t#iterations) if it was the original transmit that was blocked.

If an infinite repeat was configured, this will return [SL_RAIL_TX_REPEAT_INFINITE_ITERATIONS](transmit#sl-rail-tx-repeat-infinite-iterations). 

###### sl_rail_set_state_timing

`sl_rail_status_t sl_rail_set_state_timing(sl_rail_handle_t rail_handle, sl_rail_state_timing_t *p_timings)`

**Description:** Configure RAIL automatic state transition timing.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_state_timing_t](sl-rail-state-timing-t) *|[inout]|p_timings|A pointer to the timings used to configure the RAIL state machine. This structure is updated with the actual times that were set, if an input timing is invalid.|

**Returns**

- Status code indicating a success of the function call.

The timings given are close to the actual transition time. However, a still uncharacterized software overhead occurs. Also, timings are not always adhered to when using an automatic transition after an error, due to the cleanup required to recover from the error. 

###### sl_rail_idle

`sl_rail_status_t sl_rail_idle(sl_rail_handle_t rail_handle, sl_rail_idle_mode_t mode, bool wait)`

**Description:** Place the radio into an idle state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_idle_mode_t](state-transitions#sl-rail-idle-mode-t)|[in]|mode|The method for shutting down the radio.|
|bool|[in]|wait|Whether this function should wait for the radio to reach idle before returning.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the radio has idled by the time this function returns, or [SL_RAIL_STATUS_SUSPENDED](general#sl-rail-status-suspended) if it is still in the process of idling.

This function is used to remove the radio from TX and RX states. How these states are left is defined by the mode parameter.

In multiprotocol, this API will also cause the radio to be yielded so that other tasks can be run. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_get_radio_state

`sl_rail_radio_state_t sl_rail_get_radio_state(sl_rail_handle_t rail_handle)`

**Description:** Get the current radio state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- An enumeration for the current radio state.

Returns the state of the radio as a bitmask containing: [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle), [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx), [SL_RAIL_RF_STATE_TX](state-transitions#sl-rail-rf-state-tx), and [SL_RAIL_RF_STATE_ACTIVE](state-transitions#sl-rail-rf-state-active). [SL_RAIL_RF_STATE_IDLE](state-transitions#sl-rail-rf-state-idle), [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx), and [SL_RAIL_RF_STATE_TX](state-transitions#sl-rail-rf-state-tx) bits are mutually exclusive. The radio can transition through intermediate states, which are not reported but are instead considered part of the state most closely associated. For example, when the radio is warming up or shutting down the transmitter or receiver, this function returns [SL_RAIL_RF_STATE_TX](state-transitions#sl-rail-rf-state-tx) or [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx), respectively. When transitioning directly from RX to TX or vice-versa, this function returns the earlier state.

**Note**

- For a more detailed radio state, see [sl_rail_get_radio_state_detail()](state-transitions#sl-rail-get-radio-state-detail).

###### sl_rail_get_radio_state_detail

`sl_rail_radio_state_detail_t sl_rail_get_radio_state_detail(sl_rail_handle_t rail_handle)`

**Description:** Get the detailed current radio state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- An enumeration for the current detailed radio state.

Returns the state of the radio as a bitmask. The three core radio states IDLE, RX, and TX are represented by mutually exclusive bits [SL_RAIL_RF_STATE_DETAIL_IDLE_STATE](state-transitions#sl-rail-rf-state-detail-idle-state), [SL_RAIL_RF_STATE_DETAIL_RX_STATE](state-transitions#sl-rail-rf-state-detail-rx-state), and [SL_RAIL_RF_STATE_DETAIL_TX_STATE](state-transitions#sl-rail-rf-state-detail-tx-state) respectively. If the radio is transitioning between these three states, the returned bitmask will have [SL_RAIL_RF_STATE_DETAIL_TRANSITION](state-transitions#sl-rail-rf-state-detail-transition) set along with a bit corresponding to the destination core radio state. If, while in the receive state, the radio is actively receiving a packet, [SL_RAIL_RF_STATE_DETAIL_ACTIVE](state-transitions#sl-rail-rf-state-detail-active) will be set; otherwise, this bit will be clear. If frame detection is disabled, [SL_RAIL_RF_STATE_DETAIL_NO_FRAMES](state-transitions#sl-rail-rf-state-detail-no-frames) in the returned state bitmask will be set; otherwise, this bit will be clear. If the radio is performing an LBT/CSMA operation (e.g., a backoff period) [SL_RAIL_RF_STATE_DETAIL_LBT](state-transitions#sl-rail-rf-state-detail-lbt) in the returned state bitmask will be set; otherwise, this bit will be clear.

For the most part, the more detailed radio states returned by this API correspond to radio states returned by [sl_rail_get_radio_state()](state-transitions#sl-rail-get-radio-state) as follows:

[sl_rail_radio_state_detail_t](state-transitions#sl-rail-radio-state-detail-t)[sl_rail_radio_state_t](state-transitions#sl-rail-radio-state-t) SL_RAIL_RF_STATE_DETAIL_INACTIVE SL_RAIL_RF_STATE_INACTIVE SL_RAIL_RF_STATE_DETAIL_IDLE_STATE | SL_RAIL_STATE_DETAIL_TRANSITION If RX overflow or leaving RX unforced: SL_RAIL_RF_STATE_RX Else if leaving TX unforced: SL_RAIL_RF_STATE_TX Else: SL_RAIL_RF_STATE_IDLE SL_RAIL_RF_STATE_DETAIL_IDLE_STATE SL_RAIL_RF_STATE_IDLE SL_RAIL_RF_STATE_DETAIL_IDLE_STATE | SL_RAIL_STATE_DETAIL_LBT SL_RAIL_RF_STATE_TX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_STATE_DETAIL_TRANSITION If leaving TX: SL_RAIL_RF_STATE_TX Else: SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_RF_STATE_DETAIL_TRANSITION | SL_RAIL_RF_STATE_DETAIL_NO_FRAMES If leaving TX: SL_RAIL_RF_STATE_TX Else: SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_RF_STATE_DETAIL_NO_FRAMES SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_RF_STATE_DETAIL_LBT SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_RF_STATE_DETAIL_NO_FRAMES | SL_RAIL_RF_STATE_DETAIL_LBT SL_RAIL_RF_STATE_RX SL_RAIL_RF_STATE_DETAIL_RX_STATE | SL_RAIL_RF_STATE_DETAIL_ACTIVE SL_RAIL_RF_STATE_RX_ACTIVE SL_RAIL_RF_STATE_DETAIL_TX_STATE | SL_RAIL_RF_STATE_TRANSITION If leaving RX: SL_RAIL_RF_STATE_RX Else: SL_RAIL_RF_STATE_TX SL_RAIL_RF_STATE_DETAIL_TX_STATE | SL_RAIL_RF_STATE_ACTIVE SL_RAIL_RF_STATE_TX_ACTIVE 

###### sl_rail_enable_cache_synth_cal

`sl_rail_status_t sl_rail_enable_cache_synth_cal(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Enable/disable caching of synth calibration value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|A boolean to enable or disable caching of synth calibration.|

**Returns**

- Status code indicating success of the function call.

Once enabled, the sequencer will start caching synth calibration values for channels and apply them instead of performing calibration on every state transition and channel change. This will increase the transition time for the first time calibration is performed. Subsequent state transitions will be faster. The cache size is 2. [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) internally uses this feature and there is no need to enable/disable it. This function returns [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if we try to disable it while [SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) is enabled.

**Note**

- This function will improve the minimum timings that can be achieved in [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx), [sl_rail_state_timing_t::idle_to_tx](sl-rail-state-timing-t#idle-to-tx), [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx), [sl_rail_state_timing_t::tx_to_rx](sl-rail-state-timing-t#tx-to-rx) and [sl_rail_state_timing_t::tx_to_tx](sl-rail-state-timing-t#tx-to-tx). A call to [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing) is needed to achieve lower transition times.
- On a protocol switch the cache is cleared, so it is not suitable for applications where a protocol switch happens frequently, like with Dynamic Multiprotocol.

##### Macros

`#define RAIL_TRANSITION_TIME_KEEP ((RAIL_TransitionTime_t) -1)`

**Description**: A value to use in [RAIL_StateTiming_t](rail-state-timing-t) fields when calling [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing) to keep that timing parameter at it current setting.

`#define RAIL_RF_STATE_DETAIL_INACTIVE (0U)`

**Description**: Radio is inactive.

`#define RAIL_RF_STATE_DETAIL_IDLE_STATE (1U << RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT)`

**Description**: Radio is in or headed to the idle state.

`#define RAIL_RF_STATE_DETAIL_RX_STATE (1U << RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT)`

**Description**: Radio is in or headed to the receive state.

`#define RAIL_RF_STATE_DETAIL_TX_STATE (1U << RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT)`

**Description**: Radio is in or headed to the transmit state.

`#define RAIL_RF_STATE_DETAIL_TRANSITION (1U << RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT)`

**Description**: Radio is headed to the idle, receive, or transmit state.

`#define RAIL_RF_STATE_DETAIL_ACTIVE (1U << RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT)`

**Description**: Radio is actively transmitting or receiving.

`#define RAIL_RF_STATE_DETAIL_NO_FRAMES (1U << RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT)`

**Description**: Radio has frame detect disabled.

`#define RAIL_RF_STATE_DETAIL_LBT (1U << RAIL_RF_STATE_DETAIL_LBT_SHIFT)`

**Description**: LBT/CSMA operation is currently ongoing.

`#define RAIL_RF_STATE_DETAIL_CORE_STATE_MASK `

**Description**: Mask for core radio state bits.

`#define SL_RAIL_TRANSITION_TIME_KEEP ((sl_rail_transition_time_t) -1)`

**Description**: A value to use in [sl_rail_state_timing_t](sl-rail-state-timing-t) fields when calling [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing) to keep that timing parameter at it current setting.

`#define SL_RAIL_RF_STATE_DETAIL_INACTIVE (0U)`

**Description**: Radio is inactive.

`#define SL_RAIL_RF_STATE_DETAIL_IDLE_STATE (1U << SL_RAIL_RF_STATE_DETAIL_IDLE_STATE_SHIFT)`

**Description**: Radio is in or headed to the idle state.

`#define SL_RAIL_RF_STATE_DETAIL_RX_STATE (1U << SL_RAIL_RF_STATE_DETAIL_RX_STATE_SHIFT)`

**Description**: Radio is in or headed to the receive state.

`#define SL_RAIL_RF_STATE_DETAIL_TX_STATE (1U << SL_RAIL_RF_STATE_DETAIL_TX_STATE_SHIFT)`

**Description**: Radio is in or headed to the transmit state.

`#define SL_RAIL_RF_STATE_DETAIL_TRANSITION (1U << SL_RAIL_RF_STATE_DETAIL_TRANSITION_SHIFT)`

**Description**: Radio is headed to the idle, receive, or transmit state.

`#define SL_RAIL_RF_STATE_DETAIL_ACTIVE (1U << SL_RAIL_RF_STATE_DETAIL_ACTIVE_SHIFT)`

**Description**: Radio is actively transmitting or receiving.

`#define SL_RAIL_RF_STATE_DETAIL_NO_FRAMES (1U << SL_RAIL_RF_STATE_DETAIL_NO_FRAMES_SHIFT)`

**Description**: Radio has frame detect disabled.

`#define SL_RAIL_RF_STATE_DETAIL_LBT (1U << SL_RAIL_RF_STATE_DETAIL_LBT_SHIFT)`

**Description**: LBT/CSMA operation is currently ongoing.

`#define SL_RAIL_RF_STATE_DETAIL_CORE_STATE_MASK `

**Description**: Mask for core radio state bits.

A timing configuration structure for the RAIL State Machine. 

Configure the timings of the radio state transitions for common situations. All of the listed timings are in microseconds. Transitions from an active radio state to idle are not configurable, and will always happen as fast as possible. No timing value can exceed platform-specific [RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#rail-maximum-transition-us). Use [RAIL_TRANSITION_TIME_KEEP](state-transitions#rail-transition-time-keep) to keep an existing setting.

For idleToRx, idleToTx, rxToTx, txToRx, and txToTx a value of 0 for the transition time means that the specified transition should happen as fast as possible, even if the timing cannot be as consistent. Otherwise, the timing value cannot be below the platform-specific [RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#rail-minimum-transition-us).

For idleToTx, rxToTx, and txToTx setting a longer [RAIL_TxPowerConfig_t::rampTime](rail-tx-power-config-t#ramp-time) may result in a larger minimum value.

For rxSearchTimeout and txToRxSearchTimeout, there is no minimum value. A value of 0 disables the feature, functioning as an infinite timeout.

**Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t](sl-rail-state-timing-t). 

###### Public Attributes

###### idleToRx (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::idleToRx
```

**Description:** Transition time from IDLE to RX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx).

###### txToRx (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::txToRx
```

**Description:** Transition time from TX to RX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_rx](sl-rail-state-timing-t#tx-to-rx).

###### idleToTx (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::idleToTx
```

**Description:** Transition time from IDLE to TX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::idle_to_tx](sl-rail-state-timing-t#idle-to-tx).

###### rxToTx (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::rxToTx
```

**Description:** Transition time from RX packet to TX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx).

###### rxSearchTimeout (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::rxSearchTimeout
```

**Description:** Length of time the radio will search for a packet when coming from idle or RX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::rxsearch_timeout](sl-rail-state-timing-t#rxsearch-timeout).

###### txToRxSearchTimeout (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::txToRxSearchTimeout
```

**Description:** Length of time the radio will search for a packet when coming from TX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_rxsearch_timeout](sl-rail-state-timing-t#tx-to-rxsearch-timeout).

###### txToTx (heading level 7)

```
RAIL_TransitionTime_t RAIL_StateTiming_t::txToTx
```

**Description:** Transition time from TX packet to TX.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_timing_t::tx_to_tx](sl-rail-state-timing-t#tx-to-tx).

Used to specify radio states to transition to on success or failure. 

**Deprecated**RAIL 2.x synonym of [sl_rail_state_transitions_t](sl-rail-state-transitions-t). 

###### Public Attributes

###### success (heading level 7)

```
RAIL_RadioState_t RAIL_StateTransitions_t::success
```

**Description:** Indicate the state the radio should return to after a successful action.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_transitions_t::success](sl-rail-state-transitions-t#success).

###### error (heading level 7)

```
RAIL_RadioState_t RAIL_StateTransitions_t::error
```

**Description:** Indicate the state the radio should return to after an error.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_state_transitions_t::error](sl-rail-state-transitions-t#error).

A timing configuration structure for the RAIL State Machine. 

Configure the timings of the radio state transitions for common situations. All of the listed timings are in microseconds. Transitions from an active radio state to idle are not configurable, and will always happen as fast as possible. No timing value can exceed platform-specific [SL_RAIL_MAXIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-maximum-transition-us). Use [SL_RAIL_TRANSITION_TIME_KEEP](state-transitions#sl-rail-transition-time-keep) to keep an existing setting.

For idle_to_rx, idle_to_tx, rx_to_tx, tx_to_rx, and tx_to_tx a value of 0 for the transition time means that the specified transition should happen as fast as possible, even if the timing cannot be as consistent. Otherwise, the timing value cannot be below the platform-specific [SL_RAIL_MINIMUM_TRANSITION_US](state-transitions-sixx3-xx#sl-rail-minimum-transition-us).

For idle_to_tx, rx_to_tx, and tx_to_tx setting a longer [sl_rail_set_tx_pa_ramp_time()](pa#sl-rail-set-tx-pa-ramp-time) may result in a larger minimum value.

For rxsearch_timeout and tx_to_rxsearch_timeout, there is no minimum value. A value of 0 disables the feature, functioning as an infinite timeout. 

###### Public Attributes

###### idle_to_rx (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::idle_to_rx
```

**Description:** Transition time from IDLE to RX.

###### tx_to_rx (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::tx_to_rx
```

**Description:** Transition time from TX to RX.

###### idle_to_tx (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::idle_to_tx
```

**Description:** Transition time from IDLE to TX.

###### rx_to_tx (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::rx_to_tx
```

**Description:** Transition time from RX packet to TX.

###### rxsearch_timeout (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::rxsearch_timeout
```

**Description:** Length of time the radio will search for a packet when coming from idle or RX.

###### tx_to_rxsearch_timeout (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::tx_to_rxsearch_timeout
```

**Description:** Length of time the radio will search for a packet when coming from TX.

###### tx_to_tx (heading level 7)

```
sl_rail_transition_time_t sl_rail_state_timing_t::tx_to_tx
```

**Description:** Transition time from TX packet to TX.

Used to specify radio states to transition to on success or failure. 

###### Public Attributes

###### success (heading level 7)

```
sl_rail_radio_state_t sl_rail_state_transitions_t::success
```

**Description:** Indicate the state the radio should return to after a successful action.

###### error (heading level 7)

```
sl_rail_radio_state_t sl_rail_state_transitions_t::error
```

**Description:** Indicate the state the radio should return to after an error.

##### EFR32xG2x

EFR32xG2x-specific State Transitions. 

###### Macros

`#define RAIL_MINIMUM_TRANSITION_US (100U)`

**Description**: The minimum value for a consistent RAIL transition.

`#define RAIL_MAXIMUM_TRANSITION_US (1000000U)`

**Description**: The maximum value for a consistent RAIL transition.

`#define SL_RAIL_MINIMUM_TRANSITION_US (100U)`

**Description**: The minimum value for a consistent RAIL transition.

`#define SL_RAIL_MAXIMUM_TRANSITION_US (1000000U)`

**Description**: The maximum value for a consistent RAIL transition.

##### SIxx3xx

SIxx3xx-specific State Transitions. 

###### Macros

`#define RAIL_MINIMUM_TRANSITION_US (75U)`

**Description**: The minimum value for a consistent RAIL transition.

`#define RAIL_MAXIMUM_TRANSITION_US (1000000U)`

**Description**: The maximum value for a consistent RAIL transition.

`#define SL_RAIL_MINIMUM_TRANSITION_US (75U)`

**Description**: The minimum value for a consistent RAIL transition.

`#define SL_RAIL_MAXIMUM_TRANSITION_US (1000000U)`

**Description**: The maximum value for a consistent RAIL transition.

#### System Timing

Functionality related to the RAIL timer and general system time. 

These functions can be used to get information about the current system time or to manipulate the RAIL timer.

The system time returned by [RAIL_GetTime()](system-timing#rail-get-time) is in the same timebase that is used throughout RAIL. Any callbacks or structures that provide a time stamp, such as [RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received), will use the same timebase as will any APIs that accept an absolute time for scheduling their action. Throughout the documentation, the timebase is referred to as the RAIL timebase. The timebase is currently a value in microseconds from [RAIL_Init()](general#rail-init) time, which means that it will wrap every 1.19 hours. (`(2^32 - 1) / (3600 sec/hr * 1000000 us/sec)`).

The provided timer is hardware-backed and interrupt-driven. It can be used for timing any event in the system, but is especially helpful for timing protocol-based state machines and other systems that interact with the radio. To avoid processing the expiration in interrupt context, leave the cb parameter passed to [RAIL_SetTimer()](system-timing#rail-set-timer) as NULL and poll for expiration with the [RAIL_IsTimerExpired()](system-timing#rail-is-timer-expired) function. See below for an example of the interrupt driven method of interacting with the timer. 

```c
void timerCb(RAIL_Handle_t railHandle)
{
  // Timer callback action
}

void main(void)
{
  // Initialize RAIL ...

  // Set up a timer for 1 ms from now
  RAIL_SetTimer(railHandle, 1000, RAIL_TIME_RELATIVE, &timerCb);

  // Run main loop
  while(1);
}

```

If multiple software timers are needed to be run off of the one available hardware timer, enable a software multiplexing layer within RAIL using the [RAIL_ConfigMultiTimer()](system-timing#rail-config-multi-timer) function. This will allow you to set up as many timers as you want using the RAIL_*MultiTimer() functions. See the example below for using the multitimer functionality. 

```c
// Declare timer structures in global space or somewhere that will exist
// until the callback has fired
RAIL_MultiTimer_t tmr1, tmr2;

void timerCb(RAIL_MultiTimer_t *tmr,
             RAIL_Time_t expectedTimeOfEvent,
             void *cbArg)
{
  if (tmr == &tmr1) {
    // Timer 1 action
  } else {
    // Timer 2 action
  }
}

void main(void)
{
  // Initialize RAIL ...

  RAIL_ConfigMultiTimer(true);

  // Set up one timer for 1 ms from now and one at time 2000000 in the RAIL
  // timebase
  RAIL_SetMultiTimer(&tmr1, 1000, RAIL_TIME_RELATIVE, &timerCb, NULL);
  RAIL_SetMultiTimer(&tmr2, 2000000, RAIL_TIME_ABSOLUTE, &timerCb, NULL);

  // Run main loop
  while(1);
}

```

These functions can be used to get information about the current system time or to manipulate the RAIL timer.

The system time returned by [sl_rail_get_time()](system-timing#sl-rail-get-time) is in the same timebase that is used throughout RAIL. Any callbacks or structures that provide a time stamp, such as [sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received), will use the same timebase as will any APIs that accept an absolute time for scheduling their action. Throughout the documentation, the timebase is referred to as the RAIL timebase. The timebase is currently a value in microseconds from [sl_rail_init()](general#sl-rail-init) time, which means that it will wrap every 1.19 hours. (`(2^32 - 1) / (3600 sec/hr * 1000000 us/sec)`).

The provided timer is hardware-backed and interrupt-driven. It can be used for timing any event in the system, but is especially helpful for timing protocol-based state machines and other systems that interact with the radio. To avoid processing the expiration in interrupt context, leave the cb parameter passed to [sl_rail_set_timer()](system-timing#sl-rail-set-timer) as NULL and poll for expiration with the [sl_rail_is_timer_expired()](system-timing#sl-rail-is-timer-expired) function. See below for an example of the interrupt driven method of interacting with the timer. 

```c
void timer_callback(sl_rail_handle_t rail_handle)
{
  // Timer callback action
}

void main(void)
{
  // Initialize RAIL ...

  // Set up a timer for 1 ms from now
  sl_rail_set_timer(rail_handle, 1000, SL_RAIL_TIME_DELAY, &timer_callback);

  // Run main loop
  while(1);
}

```

If multiple software timers are needed to be run off of the one available hardware timer, enable a software multiplexing layer within RAIL using the [sl_rail_config_multi_timer()](system-timing#sl-rail-config-multi-timer) function. This will allow you to set up as many timers as you want using the sl_rail_*_multi_timer() functions. See the example below for using the multitimer functionality. 

```c
// Declare timer structures in global space or somewhere that will exist
// until the callback has fired
sl_rail_multi_timer_t tmr_0, tmr_1;

void timer_callback(sl_rail_multi_timer_t *p_tmr,
                    sl_rail_time_t expected_time_of_event,
                    void *cb_arg)
{
  if (p_tmr == &tmr_0) {
    // Timer 1 action
  } else {
    // Timer 2 action
  }
}

void main(void)
{
  // Initialize RAIL ...

  sl_rail_config_multi_timer(SL_RAIL_EFR32_HANDLE, true);

  // Set up one timer for 1 ms from now and one at time 2000000 in the RAIL
  // timebase
  sl_rail_set_multi_timer(&tmr_0, 1000, SL_RAIL_TIME_DELAY, &timer_callback, NULL);
  sl_rail_set_multi_timer(&tmr_1, 2000000, SL_RAIL_TIME_ABSOLUTE, &timer_callback, NULL);

  // Run main loop
  while(1);
}

```

##### Modules

[RAIL_MultiTimer_t](rail-multi-timer-t)

[RAIL_PacketTimeStamp_t](rail-packet-time-stamp-t)

[sl_rail_multi_timer_t](sl-rail-multi-timer-t)

[sl_rail_packet_time_stamp_t](sl-rail-packet-time-stamp-t)

[RAIL_MultiTimer](rail-multi-timer)

[sl_rail_multi_timer](sl-rail-multi-timer)

##### Enumerations

###### RAIL_TimeMode_t

```
enum RAIL_TimeMode_t {
    RAIL_TIME_ABSOLUTE = 0
    RAIL_TIME_DELAY = 1
    RAIL_TIME_DISABLED = 2
}
```

**Description:**

Specify a time offset in RAIL APIs.

**Details:**

Different APIs use the same constants and may provide more specifics about how they're used but the general use for each is described below.

**Deprecated**RAIL 2.x synonym of [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_TIME_ABSOLUTE|The time specified is an exact time in the RAIL timebase.|
|RAIL_TIME_DELAY|The time specified is relative to the current time.|
|RAIL_TIME_DISABLED|The specified time is invalid and should be ignored.|

###### RAIL_PacketTimePosition_t

```
enum RAIL_PacketTimePosition_t {
    RAIL_PACKET_TIME_INVALID = 0
    RAIL_PACKET_TIME_DEFAULT = 1
    RAIL_PACKET_TIME_AT_PREAMBLE_START = 2
    RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL = 3
    RAIL_PACKET_TIME_AT_SYNC_END = 4
    RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL = 5
    RAIL_PACKET_TIME_AT_PACKET_END = 6
    RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL = 7
    RAIL_PACKET_TIME_COUNT
}
```

**Description:**

The available packet time stamp position choices.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_position_t](system-timing#sl-rail-packet-time-position-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_PACKET_TIME_INVALID|Indicate that a time stamp is not to be or was not provided.|
|RAIL_PACKET_TIME_DEFAULT|Request the choice most expedient for RAIL to calculate, which may depend on the radio and/or its configuration.|
|RAIL_PACKET_TIME_AT_PREAMBLE_START|Request the time stamp corresponding to the first preamble bit sent or received.|
|RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL|Request the time stamp corresponding to the first preamble bit sent or received.|
|RAIL_PACKET_TIME_AT_SYNC_END|Request the time stamp corresponding to right after its last SYNC word bit has been sent or received.|
|RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL|Request the time stamp corresponding to right after its last SYNC word bit has been sent or received.|
|RAIL_PACKET_TIME_AT_PACKET_END|Request the time stamp corresponding to right after its last bit has been sent or received.|
|RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL|Request the time stamp corresponding to right after its last bit has been sent or received.|
|RAIL_PACKET_TIME_COUNT|A count of the choices in this enumeration.|

###### sl_rail_time_mode_t

```
enum sl_rail_time_mode_t {
    SL_RAIL_TIME_ABSOLUTE = 0u
    SL_RAIL_TIME_DELAY = 1u
    SL_RAIL_TIME_DISABLED = 2u
}
```

**Description:**

Specify a time offset in RAIL APIs.

**Details:**

Different APIs use the same constants and may provide more specifics about how they're used but the general use for each is described below.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TIME_ABSOLUTE|The time specified is an exact time in the RAIL timebase.|
|SL_RAIL_TIME_DELAY|The time specified is relative to the current time.|
|SL_RAIL_TIME_DISABLED|The specified time is invalid and should be ignored.|

###### sl_rail_packet_time_position_t

```
enum sl_rail_packet_time_position_t {
    SL_RAIL_PACKET_TIME_INVALID = 0u
    SL_RAIL_PACKET_TIME_DEFAULT = 1u
    SL_RAIL_PACKET_TIME_AT_PREAMBLE_START = 2u
    SL_RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL = 3u
    SL_RAIL_PACKET_TIME_AT_SYNC_END = 4u
    SL_RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL = 5u
    SL_RAIL_PACKET_TIME_AT_PACKET_END = 6u
    SL_RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL = 7u
    SL_RAIL_PACKET_TIME_COUNT
}
```

**Description:**

The available packet time stamp position choices.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_PACKET_TIME_INVALID|Indicate that a time stamp is not to be or was not provided.|
|SL_RAIL_PACKET_TIME_DEFAULT|Request the choice most expedient for RAIL to calculate, which may depend on the radio and/or its configuration.|
|SL_RAIL_PACKET_TIME_AT_PREAMBLE_START|Request the time stamp corresponding to the first preamble bit sent or received.|
|SL_RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL|Request the time stamp corresponding to the first preamble bit sent or received.|
|SL_RAIL_PACKET_TIME_AT_SYNC_END|Request the time stamp corresponding to right after its last SYNC word bit has been sent or received.|
|SL_RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL|Request the time stamp corresponding to right after its last SYNC word bit has been sent or received.|
|SL_RAIL_PACKET_TIME_AT_PACKET_END|Request the time stamp corresponding to right after its last bit has been sent or received.|
|SL_RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL|Request the time stamp corresponding to right after its last bit has been sent or received.|
|SL_RAIL_PACKET_TIME_COUNT|A count of the choices in this enumeration.|

##### Typedefs

###### RAIL_Time_t

`RAIL_Time_t`

**Description:**

Time in microseconds.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_time_t](system-timing#sl-rail-time-t).

###### RAIL_TimerCallback_t

`typedef void(* RAIL_TimerCallback_t) (RAIL_Handle_t railHandle)`

**Description:**

A pointer to the callback called when the RAIL timer expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|railHandle|The RAIL handle that was used in the [RAIL_SetTimer()](system-timing#rail-set-timer) call.|

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_timer_callback_t()](system-timing#sl-rail-timer-callback-t).

###### RAIL_MultiTimerCallback_t

`RAIL_MultiTimerCallback_t`

**Description:**

Callback fired when timer expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|tmr|A pointer to an expired timer.|
||[in]|expectedTimeOfEvent|An absolute time event fired.|
||[in]|cbArg|A user-supplied callback argument. Since this callback doesn't include a parameter for the active [RAIL_Handle_t](general#rail-handle-t) that called [RAIL_SetMultiTimer()](system-timing#rail-set-multi-timer) it might be handy to pass that RAIL handle as the cbArg when calling [RAIL_SetMultiTimer()](system-timing#rail-set-multi-timer).|

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_callback_t()](system-timing#sl-rail-multi-timer-callback-t).

###### sl_rail_time_t

`sl_rail_time_t`

**Description:**

Time in microseconds.

###### sl_rail_timer_callback_t

`typedef void(* sl_rail_timer_callback_t) (sl_rail_handle_t rail_handle)`

**Description:**

A pointer to the callback called when the RAIL timer expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|rail_handle|The RAIL handle that was used in the [sl_rail_set_timer()](system-timing#sl-rail-set-timer) call.|

**Details:**

###### sl_rail_multi_timer_callback_t

`sl_rail_multi_timer_callback_t`

**Description:**

Callback fired when timer expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|p_tmr|A pointer to an expired timer.|
||[in]|expected_time_of_event|An absolute time event fired.|
||[in]|cb_arg|A user-supplied callback argument. Since this callback doesn't include a parameter for the [sl_rail_handle_t](general#sl-rail-handle-t) passed into [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer) it might be handy to also pass that RAIL handle as the cb_arg when calling [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer).|

**Details:**

##### Functions

###### RAIL_GetTime

`RAIL_Time_t RAIL_GetTime(void)`

**Description:** Get the current RAIL time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- The RAIL time in microseconds. Note that this wraps after about 1.19 hours since it's stored in a 32 bit value.

Returns the current time in the RAIL timebase (microseconds). It can be used to compare with packet time stamps or to schedule transmits.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_time()](system-timing#sl-rail-get-time) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_SetTime

`RAIL_Status_t RAIL_SetTime(RAIL_Time_t time)`

**Description:** Set the current RAIL time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|time|Set the RAIL timebase to this value in microseconds.|

**Returns**

- Status code indicating the success of the function call.

**Warnings**

- Use this API only for testing purposes or in very limited circumstances during RAIL Timer Synchronization. Undefined behavior can result by calling it in multiprotocol or when the radio is not idle or timed events are active. Applications using [RAIL_GetTime()](system-timing#rail-get-time) may not be designed for discontinuous changes to the RAIL time base.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_time()](system-timing#sl-rail-set-time) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_DelayUs

`RAIL_Status_t RAIL_DelayUs(RAIL_Time_t microseconds)`

**Description:** Blocking delay routine for a specified number of microseconds.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|microseconds|Delay duration in microseconds.|

**Returns**

- Status code indicating success of the function call.

Use this RAIL API only for short blocking delays because it has less overhead than calling [RAIL_GetTime()](system-timing#rail-get-time) in a loop.

**Note**

- Passing large delay values may give unpredictable results or trigger the Watchdog reset. <br />  
   Also, this function will start the clocks required for the RAIL timebase if they are not running, except between [RAIL_Sleep()](sleep#rail-sleep) and [RAIL_Wake()](sleep#rail-wake) where the timer must remain stopped. <br />  
   Interrupts are not disabled during the delay, so the delay may be longer if an interrupt extends beyond the delay duration.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_delay_us()](system-timing#sl-rail-delay-us) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_SetTimer

`RAIL_Status_t RAIL_SetTimer(RAIL_Handle_t railHandle, RAIL_Time_t time, RAIL_TimeMode_t mode, RAIL_TimerCallback_t cb)`

**Description:** Schedule a timer to expire using the RAIL timebase.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|time|The timer's expiration time in the RAIL timebase.|
|[RAIL_TimeMode_t](system-timing#rail-time-mode-t)|[in]|mode|Indicates whether the time argument is an absolute RAIL time or relative to the current RAIL time. Specifying mode [RAIL_TIME_DISABLED](system-timing#rail-time-disabled) is the same as calling [RAIL_CancelTimer()](system-timing#rail-cancel-timer).|
|[RAIL_TimerCallback_t](system-timing#rail-timer-callback-t)|[in]|cb|A pointer to a callback function that RAIL will call when the timer expires. May be NULL if no callback is desired.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success and [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if the timer can't be scheduled.

Configures a timer to expire after a period in the RAIL timebase. This timer can be used to implement low-level protocol features.

**Warnings**

- Attempting to schedule the timer when it is still running from a previous request is bad practice, unless the cb callback is identical to that used in the previous request, in which case the timer is rescheduled to the new time. Note that if the original timer expires as it is being rescheduled, the callback may or may not occur. It is generally good practice to cancel a running timer before rescheduling it to minimize ambiguity.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_timer()](system-timing#sl-rail-set-timer). 

###### RAIL_GetTimer

`RAIL_Time_t RAIL_GetTimer(RAIL_Handle_t railHandle)`

**Description:** Return the absolute time that the RAIL timer was configured to expire.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The absolute time that this timer was set to expire.

Provides the absolute time regardless of the [RAIL_TimeMode_t](system-timing#rail-time-mode-t) that was passed into [RAIL_SetTimer()](system-timing#rail-set-timer). Note that the time might be in the past if the timer has already expired. The return value is undefined if the timer was never set.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_timer()](system-timing#sl-rail-get-timer). 

###### RAIL_CancelTimer

`RAIL_Status_t RAIL_CancelTimer(RAIL_Handle_t railHandle)`

**Description:** Stop the currently scheduled RAIL timer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success and [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call) if the timer is not running.

Cancels the timer. If this function is called before the timer expires, the cb callback specified in the earlier [RAIL_SetTimer()](system-timing#rail-set-timer) call will never be called.

**Deprecated**RAIL 2.x synonym of [sl_rail_cancel_timer()](system-timing#sl-rail-cancel-timer). 

###### RAIL_IsTimerExpired

`bool RAIL_IsTimerExpired(RAIL_Handle_t railHandle)`

**Description:** Check whether the RAIL timer has expired.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if the previously scheduled timer has expired and false otherwise.

Polling with this function is an alternative to the callback.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_timer_expired()](system-timing#sl-rail-is-timer-expired). 

###### RAIL_IsTimerRunning

`bool RAIL_IsTimerRunning(RAIL_Handle_t railHandle)`

**Description:** Check whether the RAIL timer is currently running.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if the timer is running and false if the timer has expired or was never set.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_timer_running()](system-timing#sl-rail-is-timer-running). 

###### RAIL_ConfigMultiTimer

`bool RAIL_ConfigMultiTimer(bool enable)`

**Description:** Configure the RAIL software timer feature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|bool|[in]|enable|Enables/disables the RAIL multitimer.|

**Returns**

- true if the multitimer was successfully enabled/disabled, false otherwise.

Turning this on will add a software timer layer above the physical RAIL timer so that the user can have as many timers as desired. It is not necessary to call this function if the MultiTimer APIs are not used.

**Note**

- This function must be called before calling [RAIL_SetMultiTimer()](system-timing#rail-set-multi-timer). This function is a no-op on multiprotocol as this layer is already used under the hood. Do not call this function while the RAIL timer is running. Call [RAIL_IsTimerRunning()](system-timing#rail-is-timer-running) before enabling/disabling the multitimer. If the multitimer is not needed, do not call this function to allow the multitimer code to be dead stripped. If the multitimer is enabled for use, the multitimer and timer APIs can both be used. However, no timer can be in use while this function is being called.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_config_multi_timer()](system-timing#sl-rail-config-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_SetMultiTimer

`RAIL_Status_t RAIL_SetMultiTimer(RAIL_MultiTimer_t *tmr, RAIL_Time_t expirationTime, RAIL_TimeMode_t expirationMode, RAIL_MultiTimerCallback_t callback, void *cbArg)`

**Description:** Start a multitimer instance.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_MultiTimer_t](rail-multi-timer-t) *|[inout]|tmr|A pointer to the timer instance to start.|
|[RAIL_Time_t](system-timing#rail-time-t)|[in]|expirationTime|A time when the timer is set to expire.|
|[RAIL_TimeMode_t](system-timing#rail-time-mode-t)|[in]|expirationMode|Select mode of expirationTime. See [RAIL_TimeMode_t](system-timing#rail-time-mode-t).|
|[RAIL_MultiTimerCallback_t](system-timing#rail-multi-timer-callback-t)|[in]|callback|A function to call on timer expiry. See [RAIL_MultiTimerCallback_t()](system-timing#rail-multi-timer-callback-t). May be NULL if no callback is desired.|
|void *|[in]|cbArg|An extra callback function parameter for the user application. Since the [RAIL_MultiTimerCallback_t()](system-timing#rail-multi-timer-callback-t) callback function lacks a [RAIL_Handle_t](general#rail-handle-t) parameter this can be used to pass the current RAIL handle if desired.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) on success.<br />[RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if tmr has an illegal value or if timeout is in the past.

**Note**

- It is legal to start an already running timer. If this is done, the timer will first be stopped before the new configuration is applied. If expirationTime is 0, the callback is called immediately.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_CancelMultiTimer

`bool RAIL_CancelMultiTimer(RAIL_MultiTimer_t *tmr)`

**Description:** Stop the currently scheduled RAIL multitimer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_MultiTimer_t](rail-multi-timer-t) *|[inout]|tmr|A pointer to a RAIL timer instance.|

**Returns**

- true if the timer was successfully canceled; false if the timer was not running.

Cancels the timer. If this function is called before the timer expires, the cb callback specified in the earlier [RAIL_SetTimer()](system-timing#rail-set-timer) call will never be called.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_cancel_multi_timer()](system-timing#sl-rail-cancel-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_IsMultiTimerRunning

`bool RAIL_IsMultiTimerRunning(RAIL_MultiTimer_t *tmr)`

**Description:** Check if a given timer is running.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_MultiTimer_t](rail-multi-timer-t) *|[inout]|tmr|A pointer to the timer instance.|

**Returns**

- true if the timer is running; false if the timer is not running or tmr is not a timer instance.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_multi_timer_running()](system-timing#sl-rail-is-multi-timer-running) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_IsMultiTimerExpired

`bool RAIL_IsMultiTimerExpired(RAIL_MultiTimer_t *tmr)`

**Description:** Check if a given timer has expired.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_MultiTimer_t](rail-multi-timer-t) *|[inout]|tmr|A pointer to the timer instance.|

**Returns**

- true if the timer has expired or tmr is not a timer instance; false if the timer is running.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_is_multi_timer_expired()](system-timing#sl-rail-is-multi-timer-expired) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### RAIL_GetMultiTimer

`RAIL_Time_t RAIL_GetMultiTimer(RAIL_MultiTimer_t *tmr, RAIL_TimeMode_t timeMode)`

**Description:** Get time left before a given timer instance expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_MultiTimer_t](rail-multi-timer-t) *|[inout]|tmr|A pointer to the timer instance to query.|
|[RAIL_TimeMode_t](system-timing#rail-time-mode-t)|[in]|timeMode|Indicates how the function provides the time remaining. By choosing [RAIL_TimeMode_t::RAIL_TIME_ABSOLUTE](system-timing#rail-time-absolute), the function returns the absolute expiration time, and by choosing [RAIL_TimeMode_t::RAIL_TIME_DELAY](system-timing#rail-time-delay), the function returns the amount of time remaining before the timer's expiration.|

**Returns**

- Time left expressed in RAIL's time units. 0 if the timer is not running or has already expired.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_multi_timer()](system-timing#sl-rail-get-multi-timer) with additional [sl_rail_handle_t](general#sl-rail-handle-t) parameter. 

###### sl_rail_get_time

`sl_rail_time_t sl_rail_get_time(sl_rail_handle_t rail_handle)`

**Description:** Get the current RAIL radio time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|

**Returns**

- The RAIL radio time in microseconds. Note that this wraps after about 1.19 hours since it's stored in a 32 bit value.

Returns the current radio time in the RAIL timebase (microseconds). It can be used to compare with packet time stamps or to schedule transmits on that radio. 

###### sl_rail_set_time

`sl_rail_status_t sl_rail_set_time(sl_rail_handle_t rail_handle, sl_rail_time_t time)`

**Description:** Set the current RAIL radio time.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|time|Set the RAIL radio time to this value in microseconds.|

**Returns**

- Status code indicating the success of the function call.

**Warnings**

- Use this API only for testing purposes or in very limited circumstances during RAIL Timer Synchronization. Undefined behavior can result by calling it in multiprotocol or when the radio is not idle or timed events are active. Applications using [sl_rail_get_time()](system-timing#sl-rail-get-time) may not be designed for discontinuous changes to the RAIL time base.

###### sl_rail_delay_us

`sl_rail_status_t sl_rail_delay_us(sl_rail_handle_t rail_handle, sl_rail_time_t microseconds)`

**Description:** Blocking delay routine for a specified number of microseconds.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|microseconds|Delay duration in microseconds.|

**Returns**

- Status code indicating success of the function call.

Use this RAIL API only for short blocking delays because it has less overhead than calling [sl_rail_get_time()](system-timing#sl-rail-get-time) in a loop.

**Note**

- Passing large delay values may give unpredictable results or trigger the Watchdog reset. <br />  
   Also, this function will start the clocks required for the RAIL timebase if they are not running, except between [sl_rail_sleep()](sleep#sl-rail-sleep) and [sl_rail_wake()](sleep#sl-rail-wake) where the timer must remain stopped. <br />  
   Interrupts are not disabled during the delay, so the delay may be longer if an interrupt extends beyond the delay duration.

###### sl_rail_set_timer

`sl_rail_status_t sl_rail_set_timer(sl_rail_handle_t rail_handle, sl_rail_time_t time, sl_rail_time_mode_t mode, sl_rail_timer_callback_t expiration_callback)`

**Description:** Schedule a timer to expire using the RAIL timebase.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|time|The timer's expiration time in the RAIL timebase.|
|[sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t)|[in]|mode|Indicates whether the time argument is an absolute RAIL time or relative to the current RAIL time. Specifying mode [SL_RAIL_TIME_DISABLED](system-timing#sl-rail-time-disabled) is the same as calling [sl_rail_cancel_timer()](system-timing#sl-rail-cancel-timer).|
|[sl_rail_timer_callback_t](system-timing#sl-rail-timer-callback-t)|[in]|expiration_callback|A pointer to a callback function that RAIL will call when the timer expires. May be NULL if no callback is desired.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success and [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if the timer can't be scheduled.

Configures a timer to expire after a period in the RAIL timebase. This timer can be used to implement low-level protocol features.

**Warnings**

- Attempting to schedule the timer when it is still running from a previous request is bad practice, unless the cb callback is identical to that used in the previous request, in which case the timer is rescheduled to the new time. Note that if the original timer expires as it is being rescheduled, the callback may or may not occur. It is generally good practice to cancel a running timer before rescheduling it to minimize ambiguity.

###### sl_rail_get_timer

`sl_rail_time_t sl_rail_get_timer(sl_rail_handle_t rail_handle)`

**Description:** Return the absolute time that the RAIL timer was configured to expire.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The absolute time that this timer was set to expire.

Provides the absolute time regardless of the [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t) that was passed into [sl_rail_set_timer()](system-timing#sl-rail-set-timer). Note that the time might be in the past if the timer has already expired. The return value is undefined if the timer was never set. 

###### sl_rail_cancel_timer

`sl_rail_status_t sl_rail_cancel_timer(sl_rail_handle_t rail_handle)`

**Description:** Stop the currently scheduled RAIL timer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success and [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call) if the timer is not running.

Cancels the timer. If this function is called before the timer expires, the expiration_callback specified in the earlier [sl_rail_set_timer()](system-timing#sl-rail-set-timer) call will never be called. 

###### sl_rail_is_timer_expired

`bool sl_rail_is_timer_expired(sl_rail_handle_t rail_handle)`

**Description:** Check whether the RAIL timer has expired.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if the previously scheduled timer has expired and false otherwise.

Polling with this function is an alternative to the expiration_callback. 

###### sl_rail_is_timer_running

`bool sl_rail_is_timer_running(sl_rail_handle_t rail_handle)`

**Description:** Check whether the RAIL timer is currently running.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if the timer is running and false if the timer has expired or was never set.

###### sl_rail_config_multi_timer

`sl_rail_status_t sl_rail_config_multi_timer(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Configure the RAIL software timer feature on a radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|bool|[in]|enable|Enables/disables the RAIL multitimer.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the multitimer was successfully enabled/disabled, an appropriate error otherwise.

Turning this on will add a software timer layer above the physical RAIL timer so that the user can have as many timers as desired. It is not necessary to call this function if the multi_timer APIs are not used.

**Note**

- This function must be called before calling [sl_rail_set_multi_timer()](system-timing#sl-rail-set-multi-timer). This function is a no-op on multiprotocol as this layer is already used under the hood. Do not call this function while the RAIL timer is running. Call [sl_rail_is_timer_running()](system-timing#sl-rail-is-timer-running) before enabling/disabling the multitimer. If the multitimer is not needed, do not call this function to allow the multitimer code to be dead stripped. If the multitimer is enabled for use, the multitimer and timer APIs can both be used. However, no timer can be in use while this function is being called.

###### sl_rail_set_multi_timer

`sl_rail_status_t sl_rail_set_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr, sl_rail_time_t expiration_time, sl_rail_time_mode_t expiration_mode, sl_rail_multi_timer_callback_t expiration_callback, void *cb_arg)`

**Description:** Start a multitimer instance.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_multi_timer_t](sl-rail-multi-timer-t) *|[inout]|p_tmr|A pointer to the timer instance to start.|
|[sl_rail_time_t](system-timing#sl-rail-time-t)|[in]|expiration_time|A time when the timer is set to expire.|
|[sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t)|[in]|expiration_mode|Select mode of expiration_time. See [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t).|
|[sl_rail_multi_timer_callback_t](system-timing#sl-rail-multi-timer-callback-t)|[in]|expiration_callback|A function to call on timer expiry. See [sl_rail_multi_timer_callback_t()](system-timing#sl-rail-multi-timer-callback-t). May be NULL if no callback is desired.|
|void *|[in]|cb_arg|An extra callback function parameter for the user application. Since the [sl_rail_multi_timer_callback_t()](system-timing#sl-rail-multi-timer-callback-t) callback function lacks a [sl_rail_handle_t](general#sl-rail-handle-t) parameter this can be used to pass the current RAIL handle if desired.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) on success.<br />[SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if tmr has an illegal value or if timeout is in the past.

**Note**

- It is legal to start an already running timer. If this is done, the timer will first be stopped before the new configuration is applied. If expiration_time is 0, the callback is called immediately.

###### sl_rail_cancel_multi_timer

`sl_rail_status_t sl_rail_cancel_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)`

**Description:** Stop the currently scheduled RAIL multitimer.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_multi_timer_t](sl-rail-multi-timer-t) *|[inout]|p_tmr|A pointer to a RAIL timer instance.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the timer was successfully canceled, or an error status otherwise.

Cancels the timer. If this function is called before the timer expires, the expiration_callback specified in the earlier [sl_rail_set_timer()](system-timing#sl-rail-set-timer) call will never be called. 

###### sl_rail_is_multi_timer_running

`bool sl_rail_is_multi_timer_running(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)`

**Description:** Check if a given timer is running.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_multi_timer_t](sl-rail-multi-timer-t) *|[inout]|p_tmr|A pointer to the timer instance.|

**Returns**

- true if the timer is running; false if the timer is not running or p_tmr is not a timer instance associated with rail_handle.

###### sl_rail_is_multi_timer_expired

`bool sl_rail_is_multi_timer_expired(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)`

**Description:** Check if a given timer has expired.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_multi_timer_t](sl-rail-multi-timer-t) *|[inout]|p_tmr|A pointer to the timer instance.|

**Returns**

- true if the timer has expired or p_tmr is not a timer instance associated with rail_handle; false if the timer is running.

###### sl_rail_get_multi_timer

`sl_rail_time_t sl_rail_get_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr, sl_rail_time_mode_t time_mode)`

**Description:** Get time left before a given timer instance expires.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A radio-generic or real RAIL instance handle.|
|[sl_rail_multi_timer_t](sl-rail-multi-timer-t) *|[inout]|p_tmr|A pointer to the timer instance to query.|
|[sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t)|[in]|time_mode|Indicates how the function provides the time remaining. By choosing [sl_rail_time_mode_t::SL_RAIL_TIME_ABSOLUTE](system-timing#sl-rail-time-absolute), the function returns the absolute expiration time, and by choosing [sl_rail_time_mode_t::SL_RAIL_TIME_DELAY](system-timing#sl-rail-time-delay), the function returns the amount of time remaining before the timer's expiration.|

**Returns**

- Time left expressed in the RAIL radio's time units. 0 if the timer is not running or has already expired.

##### Macros

`#define RAIL_RX_STARTED_BYTES 0U`

**Description**: A value to pass as [RAIL_GetRxTimePreambleStartAlt()](packet-information#rail-get-rx-time-preamble-start-alt) or [RAIL_GetRxTimeSyncWordEndAlt()](packet-information#rail-get-rx-time-sync-word-end-alt)[RAIL_RxPacketDetails_t::timeReceived](rail-rx-packet-details-t#time-received) parameter field totalPacketBytes to use the packetDurationUs value for time stamp adjustment.

`#define SL_RAIL_RX_STARTED_BYTES 0U`

**Description**: A value to pass as [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start) or [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end)[sl_rail_rx_packet_details_t::time_received](sl-rail-rx-packet-details-t#time-received) parameter field total_packet_bytes to use the packet_duration_us value for time stamp adjustment.

RAIL timer state structure. 

This structure is filled out and maintained internally only. The user/application should not alter any elements of this structure.

**Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t](sl-rail-multi-timer-t). 

###### Public Attributes

###### absOffset (heading level 7)

```
RAIL_Time_t RAIL_MultiTimer_t::absOffset
```

**Description:** Absolute time before the next event.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::abs_offset](sl-rail-multi-timer-t#abs-offset).

###### relPeriodic (heading level 7)

```
RAIL_Time_t RAIL_MultiTimer_t::relPeriodic
```

**Description:** Relative, periodic time between events; 0 = timer is oneshot.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::rel_periodic](sl-rail-multi-timer-t#rel-periodic).

###### callback (heading level 7)

```
RAIL_MultiTimerCallback_t RAIL_MultiTimer_t::callback
```

**Description:** A user callback.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::callback](sl-rail-multi-timer-t#callback).

###### cbArg (heading level 7)

```
void* RAIL_MultiTimer_t::cbArg
```

**Description:** A user callback argument.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::cb_arg](sl-rail-multi-timer-t#cb-arg).

###### next (heading level 7)

```
struct RAIL_MultiTimer* RAIL_MultiTimer_t::next
```

**Description:** A pointer to the next soft timer structure.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::next](sl-rail-multi-timer-t#next).

###### priority (heading level 7)

```
uint8_t RAIL_MultiTimer_t::priority
```

**Description:** A priority of the callback; 0 = highest priority; 255 = lowest.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::priority](sl-rail-multi-timer-t#priority).

###### isRunning (heading level 7)

```
bool RAIL_MultiTimer_t::isRunning
```

**Description:** Indicates the timer is currently running.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::is_running](sl-rail-multi-timer-t#is-running).

###### doCallback (heading level 7)

```
bool RAIL_MultiTimer_t::doCallback
```

**Description:** Indicates the callback needs to run.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer_t::do_callback](sl-rail-multi-timer-t#do-callback).

Information for calculating and representing a packet time stamp. 

**Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_stamp_t](sl-rail-packet-time-stamp-t). 

###### Public Attributes

###### packetTime (heading level 7)

```
RAIL_Time_t RAIL_PacketTimeStamp_t::packetTime
```

**Description:** Time stamp of the packet in the RAIL timebase.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::packet_time](sl-rail-packet-time-stamp-t#packet-time).

###### totalPacketBytes (heading level 7)

```
uint16_t RAIL_PacketTimeStamp_t::totalPacketBytes
```

**Description:** A value specifying the total length in bytes of the packet used when calculating the packetTime requested by the timePosition field.

**Details:** This should account for all bytes sent over the air after the Preamble and Sync word(s) including CRC bytes.

**Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::total_packet_bytes](sl-rail-packet-time-stamp-t#total-packet-bytes).

###### timePosition (heading level 7)

```
RAIL_PacketTimePosition_t RAIL_PacketTimeStamp_t::timePosition
```

**Description:** A [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) value specifying the packet position to return in the packetTime field.

**Details:** If this is [RAIL_PACKET_TIME_DEFAULT](system-timing#rail-packet-time-default), this field will be updated with the actual position corresponding to the packetTime value filled in by a call using this structure.

**Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::time_position](sl-rail-packet-time-stamp-t#time-position).

###### packetDurationUs (heading level 7)

```
RAIL_Time_t RAIL_PacketTimeStamp_t::packetDurationUs
```

**Description:** In RX for all platforms (except EFR32xG21): A value specifying the on-air duration of the data packet, starting with the first bit of the PHR (i.e., end of sync word); preamble and sync word duration are hence excluded.

**Details:** It is not available with BLE. When not available it will be 0.

In Tx for all platforms: A value specifying the on-air duration of the data packet, starting at the preamble (i.e. includes preamble, sync word, PHR, payload and FCS). This value can be used to compute duty cycles. **Note**

- This field is currently valid only for normal transmits but not Auto-Ack transmits which set the field to zero.

**Deprecated**RAIL 2.x synonym of [sl_rail_packet_time_stamp_t::packet_duration_us](sl-rail-packet-time-stamp-t#packet-duration-us).

RAIL timer state structure. 

This structure is filled out and maintained internally only. The user/application should not alter any elements of this structure. 

###### Public Attributes

###### abs_offset (heading level 7)

```
sl_rail_time_t sl_rail_multi_timer_t::abs_offset
```

**Description:** Absolute time before the next event.

###### rel_periodic (heading level 7)

```
sl_rail_time_t sl_rail_multi_timer_t::rel_periodic
```

**Description:** Relative, periodic time between events; 0 = timer is oneshot.

###### callback (heading level 7)

```
sl_rail_multi_timer_callback_t sl_rail_multi_timer_t::callback
```

**Description:** A user callback.

###### cb_arg (heading level 7)

```
void* sl_rail_multi_timer_t::cb_arg
```

**Description:** A user callback argument.

###### next (heading level 7)

```
struct sl_rail_multi_timer* sl_rail_multi_timer_t::next
```

**Description:** A pointer to the next soft timer structure.

###### priority (heading level 7)

```
uint8_t sl_rail_multi_timer_t::priority
```

**Description:** A priority of the callback; 0 = highest priority; 255 = lowest.

###### is_running (heading level 7)

```
bool sl_rail_multi_timer_t::is_running
```

**Description:** Indicates the timer is currently running.

###### do_callback (heading level 7)

```
bool sl_rail_multi_timer_t::do_callback
```

**Description:** Indicates the callback needs to run.

Information for calculating and representing a packet time stamp. 

###### Public Attributes

###### packet_time (heading level 7)

```
sl_rail_time_t sl_rail_packet_time_stamp_t::packet_time
```

**Description:** Time stamp of the packet in the RAIL timebase.

###### total_packet_bytes (heading level 7)

```
uint16_t sl_rail_packet_time_stamp_t::total_packet_bytes
```

**Description:** A value specifying the total length in bytes of the packet used when calculating the packetTime requested by the time_position field.

**Details:** This should account for all bytes sent over the air after the Preamble and Sync word(s) including CRC bytes.

###### time_position (heading level 7)

```
sl_rail_packet_time_position_t sl_rail_packet_time_stamp_t::time_position
```

**Description:** A [sl_rail_packet_time_position_t](system-timing#sl-rail-packet-time-position-t) value specifying the packet position to return in the packet_time field.

**Details:** If this is [SL_RAIL_PACKET_TIME_DEFAULT](system-timing#sl-rail-packet-time-default), this field will be updated with the actual position corresponding to the packet_time value filled in by a call using this structure.

###### packet_duration_us (heading level 7)

```
sl_rail_time_t sl_rail_packet_time_stamp_t::packet_duration_us
```

**Description:** In RX for all platforms (except EFR32xG21): A value specifying the on-air duration of the data packet, starting with the first bit of the PHR (i.e., end of sync word); preamble and sync word duration are hence excluded.

**Details:** It is not available with BLE. When not available it will be 0.

In Tx for all platforms: A value specifying the on-air duration of the data packet, starting at the preamble (i.e. includes preamble, sync word, PHR, payload and FCS). This value can be used to compute duty cycles. **Note**

- This field is currently valid only for normal transmits but not Auto-Ack transmits which set the field to zero.

Forward structure declaration of [RAIL_MultiTimer_t](rail-multi-timer-t). 

**Deprecated**RAIL 2.x synonym of [sl_rail_multi_timer](sl-rail-multi-timer).

Forward structure declaration of [sl_rail_multi_timer_t](sl-rail-multi-timer-t).

#### TX Channel Hopping

##### Modules

[RAIL_TxChannelHoppingConfigEntry_t](rail-tx-channel-hopping-config-entry-t)

[RAIL_TxChannelHoppingConfig_t](rail-tx-channel-hopping-config-t)

[sl_rail_tx_channel_hopping_config_entry_t](sl-rail-tx-channel-hopping-config-entry-t)

[sl_rail_tx_channel_hopping_config_t](sl-rail-tx-channel-hopping-config-t)

##### Macros

`#define RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL_WORST_CASE (65U)`

**Description**: The worst-case platform-agnostic static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

`#define SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL_WORST_CASE (65U)`

**Description**: The worst-case platform-agnostic static amount of memory needed per channel for channel hopping, measured in 32 bit words, regardless of the size of radio configuration structures.

Structure that represents one of the channels that is part of a [RAIL_TxChannelHoppingConfig_t](rail-tx-channel-hopping-config-t) sequence of channels used in channel hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t](sl-rail-tx-channel-hopping-config-entry-t). 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t RAIL_TxChannelHoppingConfigEntry_t::channel
```

**Description:** The channel number to be used for this entry in the channel hopping sequence.

**Details:** If this is an invalid channel for the current PHY, the call to [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) will fail.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::channel](sl-rail-tx-channel-hopping-config-entry-t#channel).

###### reserved (heading level 7)

```
uint8_t RAIL_TxChannelHoppingConfigEntry_t::reserved[2]
```

**Description:** Pad bytes reserved for future use and currently ignored.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::reserved](sl-rail-tx-channel-hopping-config-entry-t#reserved).

###### delay (heading level 7)

```
uint32_t RAIL_TxChannelHoppingConfigEntry_t::delay
```

**Description:** Idle time in microseconds to wait before transmitting on the channel indicated by this entry.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_entry_t::delay_us](sl-rail-tx-channel-hopping-config-entry-t#delay-us).

Wrapper struct that will contain the sequence of [RAIL_TxChannelHoppingConfigEntry_t](rail-tx-channel-hopping-config-entry-t) that represents the channel sequence to use during TX Channel Hopping. 

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t](sl-rail-tx-channel-hopping-config-t). 

###### Public Attributes

###### buffer (heading level 7)

```
uint32_t* RAIL_TxChannelHoppingConfig_t::buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

**Note**

- The size of this buffer must be at least as large as 3 + [RAIL_CHANNEL_HOPPING_BUFFER_SIZE_PER_CHANNEL](rx-channel-hopping-sixx3-xx#rail-channel-hopping-buffer-size-per-channel) * numberOfChannels, plus the sum of the sizes of the radioConfigDeltaAdd's of the required channels, plus the size of the radioConfigDeltaSubtract. In the case that one channel appears two or more times in your channel sequence (e.g., 1, 2, 3, 2), you must account for the radio configuration size that number of times (i.e., need to count channel 2's radio configuration size twice for the given example). The buffer is for internal use to the library.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::p_buffer](sl-rail-tx-channel-hopping-config-t#p-buffer).

###### bufferLength (heading level 7)

```
uint16_t RAIL_TxChannelHoppingConfig_t::bufferLength
```

**Description:** This parameter must be set to the length of the buffer array, in 32 bit words.

**Details:** This way, during configuration, the software can confirm it's writing within the bounds of the buffer. The configuration API will return an error or trigger [RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT](assertions#rail-assert-channel-hopping-buffer-too-short) if bufferLength is insufficient.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::buffer_words](sl-rail-tx-channel-hopping-config-t#buffer-words).

###### numberOfChannels (heading level 7)

```
uint8_t RAIL_TxChannelHoppingConfig_t::numberOfChannels
```

**Description:** The number of channels in the channel hopping sequence, which is the number of elements in the array that entries points to.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::number_of_channels](sl-rail-tx-channel-hopping-config-t#number-of-channels).

###### reserved (heading level 7)

```
uint8_t RAIL_TxChannelHoppingConfig_t::reserved
```

**Description:** Pad byte reserved for future use and currently ignored.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::reserved](sl-rail-tx-channel-hopping-config-t#reserved).

###### entries (heading level 7)

```
RAIL_TxChannelHoppingConfigEntry_t* RAIL_TxChannelHoppingConfig_t::entries
```

**Description:** A pointer to the first element of an array of [RAIL_TxChannelHoppingConfigEntry_t](rail-tx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** The length of this array must be numberOfChannels.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_channel_hopping_config_t::p_entries](sl-rail-tx-channel-hopping-config-t#p-entries).

Structure that represents one of the channels that is part of a [sl_rail_tx_channel_hopping_config_t](sl-rail-tx-channel-hopping-config-t) sequence of channels used in channel hopping. 

###### Public Attributes

###### channel (heading level 7)

```
uint16_t sl_rail_tx_channel_hopping_config_entry_t::channel
```

**Description:** The channel number to be used for this entry in the channel hopping sequence.

**Details:** If this is an invalid channel for the current PHY, the call to [sl_rail_set_next_tx_repeat()](state-transitions#sl-rail-set-next-tx-repeat) will fail.

###### reserved (heading level 7)

```
uint8_t sl_rail_tx_channel_hopping_config_entry_t::reserved[2]
```

**Description:** Pad bytes reserved for future use and currently ignored.

###### delay_us (heading level 7)

```
sl_rail_transition_time_t sl_rail_tx_channel_hopping_config_entry_t::delay_us
```

**Description:** Idle time in microseconds to wait before transmitting on the channel indicated by this entry.

Wrapper struct that will contain the sequence of [sl_rail_tx_channel_hopping_config_entry_t](sl-rail-tx-channel-hopping-config-entry-t) that represents the channel sequence to use during TX Channel Hopping. 

###### Public Attributes

###### p_buffer (heading level 7)

```
uint32_t* sl_rail_tx_channel_hopping_config_t::p_buffer
```

**Description:** Pointer to contiguous global read-write memory that will be used by RAIL to store channel hopping information throughout its operation.

**Details:** It need not be initialized and applications should never write data anywhere in this buffer.

**Note**

- The size of this buffer must be at least as large as 3 + [SL_RAIL_CHANNEL_HOPPING_BUFFER_WORDS_PER_CHANNEL](rx-channel-hopping-sixx3-xx#sl-rail-channel-hopping-buffer-words-per-channel) * number_of_channels, plus the sum of the sizes of the radio_config_delta_add's of the required channels, plus the size of the radio_config_delta_subtract. In the case that one channel appears two or more times in your channel sequence (e.g., 1, 2, 3, 2), you must account for the radio configuration size that number of times (i.e., need to count channel 2's radio configuration size twice for the given example). The buffer is for internal use to the library.

###### buffer_words (heading level 7)

```
uint16_t sl_rail_tx_channel_hopping_config_t::buffer_words
```

**Description:** This parameter must be set to the length of the buffer array, in 32 bit words.

**Details:** This way, during configuration, the software can confirm it's writing within the bounds of the buffer. The configuration API will return an error or trigger [SL_RAIL_ASSERT_CHANNEL_HOPPING_BUFFER_TOO_SHORT](assertions#sl-rail-assert-channel-hopping-buffer-too-short) if buffer_words is insufficient.

###### number_of_channels (heading level 7)

```
uint8_t sl_rail_tx_channel_hopping_config_t::number_of_channels
```

**Description:** The number of channels in the channel hopping sequence, which is the number of elements in the array that entries points to.

###### reserved (heading level 7)

```
uint8_t sl_rail_tx_channel_hopping_config_t::reserved
```

**Description:** Pad byte reserved for future use and currently ignored.

###### p_entries (heading level 7)

```
sl_rail_tx_channel_hopping_config_entry_t* sl_rail_tx_channel_hopping_config_t::p_entries
```

**Description:** A pointer to the first element of an array of [sl_rail_tx_channel_hopping_config_entry_t](sl-rail-tx-channel-hopping-config-entry-t) that represents the channels used during channel hopping.

**Details:** The length of this array must be number_of_channels.

#### Thermal Protection

##### Modules

[RAIL_ChipTempConfig_t](rail-chip-temp-config-t)

[RAIL_ChipTempMetrics_t](rail-chip-temp-metrics-t)

[sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t)

[sl_rail_chip_temp_metrics_t](sl-rail-chip-temp-metrics-t)

##### Functions

###### RAIL_ConfigThermalProtection

`RAIL_Status_t RAIL_ConfigThermalProtection(RAIL_Handle_t genericRailHandle, const RAIL_ChipTempConfig_t *chipTempConfig)`

**Description:** Enable or disable the thermal protection if [RAIL_SUPPORTS_THERMAL_PROTECTION](features#rail-supports-thermal-protection-1) is defined and update the temperature threshold and cool down hysteresis preventing or allowing transmissions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A radio-generic RAIL handle.|
|const [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) *|[in]|chipTempConfig|A pointer to a [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) that contains the configuration to be applied.|

**Returns**

- Status code indicating the result of the function call. Returns [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) if enable field from [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) is set to false when an EFF is present on the board.

When the temperature threshold minus a precise number of degrees specified by the cool down hysteresis parameter is exceeded, any future transmits are blocked until the temperature decreases below that limit. Besides, if the temperature threshold is exceeded, any active transmit is aborted.

By default the threshold is set to [RAIL_CHIP_TEMP_THRESHOLD_MAX](thermal-protection#rail-chip-temp-threshold-max) and the cool down hysteresis is set to [RAIL_CHIP_TEMP_COOLDOWN_DEFAULT](thermal-protection#rail-chip-temp-cooldown-default).

**Note**

- The thermal protection is automatically enabled when an EFF is present on the board. There is no use in calling this API in this case.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_thermal_protection()](thermal-protection#sl-rail-config-thermal-protection). 

###### RAIL_GetThermalProtection

`RAIL_Status_t RAIL_GetThermalProtection(RAIL_Handle_t genericRailHandle, RAIL_ChipTempConfig_t *chipTempConfig)`

**Description:** Get the current thermal configuration parameter and status.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|genericRailHandle|A radio-generic RAIL handle.|
|[RAIL_ChipTempConfig_t](rail-chip-temp-config-t) *|[out]|chipTempConfig|A non-NULL pointer to a [RAIL_ChipTempConfig_t](rail-chip-temp-config-t) that will be updated with the current configuration.|

**Returns**

- Status code indicating the result of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_thermal_protection()](thermal-protection#sl-rail-get-thermal-protection). 

###### RAIL_GetTemperature

`RAIL_Status_t RAIL_GetTemperature(RAIL_Handle_t railHandle, int16_t tempBuffer[((3U)+(1U))], bool reset)`

**Description:** Get the different temperature measurements in Kelvin done by sequencer or host.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int16_t|[out]|tempBuffer|The address of the array that will contain temperatures. This array must have at least [RAIL_TEMP_MEASURE_COUNT](thermal-protection#rail-temp-measure-count) entries.|
|bool|[in]|reset|true to reset the temperature statistics, false otherwise.|

**Returns**

- Status code indicating success of the function call.

Temperatures, in Kelvin, are stored in tempBuffer such as:

- tempBuffer[0] is the chip temperature
- tempBuffer[1] is the minimal chip temperature
- tempBuffer[2] is the maximal chip temperature

Values that are not populated yet or incorrect are set to 0.

If [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1) tempBuffer[3] is the HFXO temperature

**Deprecated**RAIL 2.x synonym of [sl_rail_get_temperature()](thermal-protection#sl-rail-get-temperature). 

###### sl_rail_config_thermal_protection

`sl_rail_status_t sl_rail_config_thermal_protection(sl_rail_handle_t radio_handle, const sl_rail_chip_temp_config_t *p_chip_temp_config)`

**Description:** Enable or disable the thermal protection if [SL_RAIL_SUPPORTS_THERMAL_PROTECTION](features#sl-rail-supports-thermal-protection-1) is defined and update the temperature threshold and cool down hysteresis preventing or allowing transmissions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|const [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t) *|[in]|p_chip_temp_config|A pointer to a [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t) that contains the configuration to be applied.|

**Returns**

- Status code indicating the result of the function call. Returns [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) if enable field from [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t) is set to false when an EFF is present on the board.

When the temperature threshold minus a precise number of degrees specified by the cool down hysteresis parameter is exceeded, any future transmits are blocked until the temperature decreases below that limit. Besides, if the temperature threshold is exceeded, any active transmit is aborted.

By default the threshold is set to [SL_RAIL_CHIP_TEMP_THRESHOLD_MAX](thermal-protection#sl-rail-chip-temp-threshold-max) and the cool down hysteresis is set to [SL_RAIL_CHIP_TEMP_COOLDOWN_DEFAULT](thermal-protection#sl-rail-chip-temp-cooldown-default).

**Note**

- The thermal protection is automatically enabled when an EFF is present on the board. There is no use in calling this API in this case.

###### sl_rail_get_thermal_protection

`sl_rail_status_t sl_rail_get_thermal_protection(sl_rail_handle_t radio_handle, sl_rail_chip_temp_config_t *p_chip_temp_config)`

**Description:** Get the current thermal configuration parameter and status.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|[sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t) *|[out]|p_chip_temp_config|A non-NULL pointer to a [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t) that will be updated with the current configuration.|

**Returns**

- Status code indicating the result of the function call.

###### sl_rail_get_temperature

`sl_rail_status_t sl_rail_get_temperature(sl_rail_handle_t radio_handle, int16_t temp_buffer[((3U)+(1U))], bool reset)`

**Description:** Get the different temperature measurements in Kelvin done by sequencer or host.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|int16_t|[out]|temp_buffer|The array to be populated with temperatures (pointer). This array must have at least [SL_RAIL_TEMP_MEASURE_COUNT](thermal-protection#sl-rail-temp-measure-count) entries.|
|bool|[in]|reset|true to reset the temperature statistics, false otherwise.|

**Returns**

- Status code indicating success of the function call.

Temperatures, in Kelvin, are stored in temp_buffer[] such as:

- temp_buffer[0] is the chip temperature
- temp_buffer[1] is the minimal chip temperature
- temp_buffer[2] is the maximal chip temperature

Values that are not populated yet or incorrect are set to 0.

If [SL_RAIL_SUPPORTS_HFXO_COMPENSATION](features#sl-rail-supports-hfxo-compensation-1) temp_buffer[3] is the HFXO temperature 

##### Macros

`#define RAIL_HFXO_TEMP_MEASURE_COUNT (1U)`

**Description**: Number of temperature values provided for HFXO metrics.

`#define RAIL_TEMP_MEASURE_COUNT `

**Description**: Total number of temperature values provided by [RAIL_GetTemperature()](thermal-protection#rail-get-temperature).

`#define RAIL_CHIP_TEMP_THRESHOLD_MAX (398U)`

**Description**: Maximum junction temperature in Kelvin.

`#define RAIL_CHIP_TEMP_COOLDOWN_DEFAULT (7U)`

**Description**: Default number of Kelvin degrees below threshold needed to allow transmissions.

`#define RAIL_CHIP_TEMP_MEASURE_COUNT (3U)`

**Description**: Number of temperature values provided for the chip thermal protection.

`#define SL_RAIL_HFXO_TEMP_MEASURE_COUNT (1U)`

**Description**: Number of temperature values provided for HFXO metrics.

`#define SL_RAIL_TEMP_MEASURE_COUNT `

**Description**: Total number of temperature values provided by [sl_rail_get_temperature()](thermal-protection#sl-rail-get-temperature).

`#define SL_RAIL_CHIP_TEMP_THRESHOLD_MAX (398U)`

**Description**: Maximum junction temperature in Kelvin.

`#define SL_RAIL_CHIP_TEMP_COOLDOWN_DEFAULT (7U)`

**Description**: Default number of Kelvin degrees below threshold needed to allow transmissions.

`#define SL_RAIL_CHIP_TEMP_MEASURE_COUNT (3U)`

**Description**: Number of temperature values provided for the chip thermal protection.

Configuration parameters for thermal protection. 

**Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_config_t](sl-rail-chip-temp-config-t). 

###### Public Attributes

###### enable (heading level 7)

```
bool RAIL_ChipTempConfig_t::enable
```

**Description:** Indicates whether the protection is enabled.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_config_t::enable](sl-rail-chip-temp-config-t#enable).

###### coolDownK (heading level 7)

```
uint8_t RAIL_ChipTempConfig_t::coolDownK
```

**Description:** Mandatory temperature cool down when the threshold is exceeded, in degrees Kelvin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_config_t::cool_down_kelvin](sl-rail-chip-temp-config-t#cool-down-kelvin).

###### thresholdK (heading level 7)

```
uint16_t RAIL_ChipTempConfig_t::thresholdK
```

**Description:** Temperature above which transmit is blocked, in degrees Kelvin.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_config_t::threshold_kelvin](sl-rail-chip-temp-config-t#threshold-kelvin).

Data used for thermal protection. 

**Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t](sl-rail-chip-temp-metrics-t). 

###### Public Attributes

###### tempK (heading level 7)

```
uint16_t RAIL_ChipTempMetrics_t::tempK
```

**Description:** Store chip temperature for metrics.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::temp_kelvin](sl-rail-chip-temp-metrics-t#temp-kelvin).

###### minTempK (heading level 7)

```
uint16_t RAIL_ChipTempMetrics_t::minTempK
```

**Description:** Minimum temperature recorded.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::min_temp_kelvin](sl-rail-chip-temp-metrics-t#min-temp-kelvin).

###### maxTempK (heading level 7)

```
uint16_t RAIL_ChipTempMetrics_t::maxTempK
```

**Description:** Maximum temperature recorded.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::max_temp_kelvin](sl-rail-chip-temp-metrics-t#max-temp-kelvin).

###### resetPending (heading level 7)

```
bool RAIL_ChipTempMetrics_t::resetPending
```

**Description:** Indicates if data should be reset.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::reset_pending](sl-rail-chip-temp-metrics-t#reset-pending).

###### reservedChipTemp (heading level 7)

```
uint8_t RAIL_ChipTempMetrics_t::reservedChipTemp
```

**Description:** Reserved for future use.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_chip_temp_metrics_t::reserved](sl-rail-chip-temp-metrics-t#reserved).

Configuration parameters for thermal protection. 

###### Public Attributes

###### enable (heading level 7)

```
bool sl_rail_chip_temp_config_t::enable
```

**Description:** Indicates whether the protection is enabled.

###### cool_down_kelvin (heading level 7)

```
uint8_t sl_rail_chip_temp_config_t::cool_down_kelvin
```

**Description:** Mandatory temperature cool down when the threshold is exceeded, in degrees Kelvin.

###### threshold_kelvin (heading level 7)

```
uint16_t sl_rail_chip_temp_config_t::threshold_kelvin
```

**Description:** Temperature above which transmit is blocked, in degrees Kelvin.

Data used for thermal protection. 

###### Public Attributes

###### temp_kelvin (heading level 7)

```
uint16_t sl_rail_chip_temp_metrics_t::temp_kelvin
```

**Description:** Store chip temperature for metrics.

###### min_temp_kelvin (heading level 7)

```
uint16_t sl_rail_chip_temp_metrics_t::min_temp_kelvin
```

**Description:** Minimum temperature recorded.

###### max_temp_kelvin (heading level 7)

```
uint16_t sl_rail_chip_temp_metrics_t::max_temp_kelvin
```

**Description:** Maximum temperature recorded.

###### reset_pending (heading level 7)

```
bool sl_rail_chip_temp_metrics_t::reset_pending
```

**Description:** Indicates if data should be reset.

###### reserved (heading level 7)

```
uint8_t sl_rail_chip_temp_metrics_t::reserved
```

**Description:** Reserved for future use.

#### Transmit

APIs related to transmitting data packets. 

##### Modules

[RAIL_TxPacketDetails_t](rail-tx-packet-details-t)

[RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t)

[RAIL_CsmaConfig_t](rail-csma-config-t)

[RAIL_LbtConfig_t](rail-lbt-config-t)

[RAIL_SyncWordConfig_t](rail-sync-word-config-t)

[RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t)

[sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t)

[sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t)

[sl_rail_csma_config_t](sl-rail-csma-config-t)

[sl_rail_lbt_config_t](sl-rail-lbt-config-t)

[sl_rail_sync_word_config_t](sl-rail-sync-word-config-t)

[sl_rail_tx_repeat_config_t](sl-rail-tx-repeat-config-t)

[Packet Transmit](packet-tx)

[Power Amplifier (PA)](pa)

##### Enumerations

###### RAIL_StopMode_t

```
enum RAIL_StopMode_t {
    RAIL_STOP_MODE_ACTIVE_SHIFT = 0
    RAIL_STOP_MODE_PENDING_SHIFT = 1
}
```

**Description:**

Stop radio operation options bit mask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_stop_mode_t](transmit#sl-rail-stop-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_STOP_MODE_ACTIVE_SHIFT|Shift position of [RAIL_STOP_MODE_ACTIVE](transmit#rail-stop-mode-active) bit.|
|RAIL_STOP_MODE_PENDING_SHIFT|Shift position of [RAIL_STOP_MODE_PENDING](transmit#rail-stop-mode-pending) bit.|

###### RAIL_TxOptions_t

```
enum RAIL_TxOptions_t {
    RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT = 0
    RAIL_TX_OPTION_REMOVE_CRC_SHIFT = 1
    RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT = 2
    RAIL_TX_OPTION_ANTENNA0_SHIFT = 3
    RAIL_TX_OPTION_ANTENNA1_SHIFT = 4
    RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT = 5
    RAIL_TX_OPTION_CCA_PEAK_RSSI_SHIFT = 6
    RAIL_TX_OPTION_CCA_ONLY_SHIFT = 7
    RAIL_TX_OPTION_RESEND_SHIFT = 8
    RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT = 9
    RAIL_TX_OPTIONS_COUNT
}
```

**Description:**

Transmit options, in reality a bitmask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_options_t](transmit#sl-rail-tx-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT|Shift position of [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack) bit.|
|RAIL_TX_OPTION_REMOVE_CRC_SHIFT|Shift position of [RAIL_TX_OPTION_REMOVE_CRC](transmit#rail-tx-option-remove-crc) bit.|
|RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT|Shift position of [RAIL_TX_OPTION_SYNC_WORD_ID](transmit#rail-tx-option-sync-word-id) bit.|
|RAIL_TX_OPTION_ANTENNA0_SHIFT|Shift position of [RAIL_TX_OPTION_ANTENNA0](transmit#rail-tx-option-antenna0) bit.|
|RAIL_TX_OPTION_ANTENNA1_SHIFT|Shift position of [RAIL_TX_OPTION_ANTENNA1](transmit#rail-tx-option-antenna1) bit.|
|RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT|Shift position of [RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#rail-tx-option-alt-preamble-len) bit.|
|RAIL_TX_OPTION_CCA_PEAK_RSSI_SHIFT|Shift position of [RAIL_TX_OPTION_CCA_PEAK_RSSI](transmit#rail-tx-option-cca-peak-rssi) bit.|
|RAIL_TX_OPTION_CCA_ONLY_SHIFT|Shift position of [RAIL_TX_OPTION_CCA_ONLY](transmit#rail-tx-option-cca-only) bit.|
|RAIL_TX_OPTION_RESEND_SHIFT|Shift position of [RAIL_TX_OPTION_RESEND](transmit#rail-tx-option-resend) bit.|
|RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT|Shift position of [RAIL_TX_OPTION_CONCURRENT_PHY_ID](transmit#rail-tx-option-concurrent-phy-id) bit.|
|RAIL_TX_OPTIONS_COUNT|A count of the choices in this enumeration.|

###### RAIL_ScheduledTxDuringRx_t

```
enum RAIL_ScheduledTxDuringRx_t {
    RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX = 0
    RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX = 1
}
```

**Description:**

Enumerates the possible outcomes of what will occur if a scheduled TX ends up firing during RX.

**Details:**

Because RX and TX can't happen at the same time, it is up to the user how the TX should be handled. This enumeration is passed into [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx) as part of [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t).

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_tx_during_rx_t](transmit#sl-rail-scheduled-tx-during-rx-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX|The scheduled TX will be postponed until RX completes and then sent.|
|RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX|The scheduled TX will be aborted and a [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) event will fire.|

###### RAIL_TxRepeatOptions_t

```
enum RAIL_TxRepeatOptions_t {
    RAIL_TX_REPEAT_OPTION_HOP_SHIFT = 0
    RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT = 1
}
```

**Description:**

Transmit repeat options, in reality a bitmask.

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_options_t](transmit#sl-rail-tx-repeat-options-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_TX_REPEAT_OPTION_HOP_SHIFT|Shift position of [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) bit.|
|RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT|Shift position of the [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start) bit.|

###### sl_rail_stop_mode_t

```
enum sl_rail_stop_mode_t {
    SL_RAIL_STOP_MODE_ACTIVE_SHIFT = 0
    SL_RAIL_STOP_MODE_PENDING_SHIFT = 1
}
```

**Description:**

Stop radio operation options bit mask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_STOP_MODE_ACTIVE_SHIFT|Shift position of [SL_RAIL_STOP_MODE_ACTIVE](transmit#sl-rail-stop-mode-active) bit.|
|SL_RAIL_STOP_MODE_PENDING_SHIFT|Shift position of [SL_RAIL_STOP_MODE_PENDING](transmit#sl-rail-stop-mode-pending) bit.|

###### sl_rail_tx_options_t

```
enum sl_rail_tx_options_t {
    SL_RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT = 0
    SL_RAIL_TX_OPTION_REMOVE_CRC_SHIFT = 1
    SL_RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT = 2
    SL_RAIL_TX_OPTION_ANTENNA_0_SHIFT = 3
    SL_RAIL_TX_OPTION_ANTENNA_1_SHIFT = 4
    SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT = 5
    SL_RAIL_TX_OPTION_RESERVED_6_SHIFT = 6
    SL_RAIL_TX_OPTION_CCA_ONLY_SHIFT = 7
    SL_RAIL_TX_OPTION_RESEND_SHIFT = 8
    SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT = 9
    SL_RAIL_TX_OPTIONS_COUNT
}
```

**Description:**

Transmit options, in reality a bitmask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT|Shift position of [SL_RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#sl-rail-tx-option-wait-for-ack) bit.|
|SL_RAIL_TX_OPTION_REMOVE_CRC_SHIFT|Shift position of [SL_RAIL_TX_OPTION_REMOVE_CRC](transmit#sl-rail-tx-option-remove-crc) bit.|
|SL_RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT|Shift position of [SL_RAIL_TX_OPTION_SYNC_WORD_ID](transmit#sl-rail-tx-option-sync-word-id) bit.|
|SL_RAIL_TX_OPTION_ANTENNA_0_SHIFT|Shift position of [SL_RAIL_TX_OPTION_ANTENNA_0](transmit#sl-rail-tx-option-antenna-0) bit.|
|SL_RAIL_TX_OPTION_ANTENNA_1_SHIFT|Shift position of [SL_RAIL_TX_OPTION_ANTENNA_1](transmit#sl-rail-tx-option-antenna-1) bit.|
|SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT|Shift position of [SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#sl-rail-tx-option-alt-preamble-len) bit.|
|SL_RAIL_TX_OPTION_RESERVED_6_SHIFT|Reserved for future use.|
|SL_RAIL_TX_OPTION_CCA_ONLY_SHIFT|Shift position of [SL_RAIL_TX_OPTION_CCA_ONLY](transmit#sl-rail-tx-option-cca-only) bit.|
|SL_RAIL_TX_OPTION_RESEND_SHIFT|Shift position of [SL_RAIL_TX_OPTION_RESEND](transmit#sl-rail-tx-option-resend) bit.|
|SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT|Shift position of [SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID](transmit#sl-rail-tx-option-concurrent-phy-id) bit.|
|SL_RAIL_TX_OPTIONS_COUNT|A count of the choices in this enumeration.|

###### sl_rail_scheduled_tx_during_rx_t

```
enum sl_rail_scheduled_tx_during_rx_t {
    SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX = 0u
    SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX = 1u
}
```

**Description:**

Enumerates the possible outcomes of what will occur if a scheduled TX ends up firing during RX.

**Details:**

Because RX and TX can't happen at the same time, it is up to the user how the TX should be handled. This enumeration is passed into [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx) as part of [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t).

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX|The scheduled TX will be postponed until RX completes and then sent.|
|SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX|The scheduled TX will be aborted and a [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked) event will fire.|

###### sl_rail_tx_repeat_options_t

```
enum sl_rail_tx_repeat_options_t {
    SL_RAIL_TX_REPEAT_OPTION_HOP_SHIFT = 0
    SL_RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT = 1
}
```

**Description:**

Transmit repeat options, in reality a bitmask.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TX_REPEAT_OPTION_HOP_SHIFT|Shift position of [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop) bit.|
|SL_RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT|Shift position of the [SL_RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#sl-rail-tx-repeat-option-start-to-start) bit.|

##### Functions

###### RAIL_StopTx

`RAIL_Status_t RAIL_StopTx(RAIL_Handle_t railHandle, RAIL_StopMode_t mode)`

**Description:** Stop an active or pending transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_StopMode_t](transmit#rail-stop-mode-t)|[in]|mode|Specifies the type(s) of transmit to stop.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the transmit was successfully stopped or [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if there is no transmit operation to stop.

**Note**

- When mode includes [RAIL_STOP_MODE_ACTIVE](transmit#rail-stop-mode-active), this can also stop an active Auto-Ack transmit. When an active transmit is stopped, [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) or [RAIL_EVENT_TXACK_ABORTED](events#rail-event-txack-aborted) should occur. When mode includes [RAIL_STOP_MODE_PENDING](transmit#rail-stop-mode-pending) this can also stop a [RAIL_TX_OPTION_CCA_ONLY](transmit#rail-tx-option-cca-only) transmit operation. When a pending transmit is stopped, [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) should occur.

**Deprecated**RAIL 2.x synonym of [sl_rail_stop_tx()](transmit#sl-rail-stop-tx). 

###### RAIL_SetCcaThreshold

`RAIL_Status_t RAIL_SetCcaThreshold(RAIL_Handle_t railHandle, int8_t ccaThresholdDbm)`

**Description:** Set the CCA threshold in dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|int8_t|[in]|ccaThresholdDbm|The CCA threshold in dBm.|

**Returns**

- Status code indicating success of the function call.

Unlike [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) or [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx), which can cause a transmit, this function only modifies the CCA threshold. A possible use case for this function involves setting the CCA threshold to invalid RSSI of -128 which blocks transmission by preventing clear channel assessments from succeeding.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_cca_threshold()](transmit#sl-rail-set-cca-threshold). 

###### RAIL_GetTxPacketDetails

`RAIL_Status_t RAIL_GetTxPacketDetails(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)`

**Description:** Get detailed information about the last packet transmitted.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *|[inout]|pPacketDetails|An application-provided pointer to store [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) corresponding to the transmit event. The isAck and timeSent fields totalPacketBytes and timePosition must be initialized prior to each call:<br/><br/>- isAck true to obtain details about the most recent Ack transmit, false to obtain details about the most recent app-initiated transmit.<br/>- totalPacketBytes with the total number of bytes of the transmitted packet for RAIL to use when calculating the specified time stamp. This should account for all bytes sent over the air after the Preamble and Sync word(s), including CRC bytes.<br/>- timePosition with a [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) value specifying the packet position to put in the timeSent field on return. This field will also be updated with the actual position corresponding to the timeSent value filled in.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketDetails was filled in, or an appropriate error code otherwise.

**Note**

- Consider using [RAIL_GetTxPacketDetailsAlt2](transmit#rail-get-tx-packet-details-alt2) for smaller code size.

This function can only be called from callback context for either [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) or [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent) events.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) with different parameters. 

###### RAIL_GetTxPacketDetailsAlt

`RAIL_Status_t RAIL_GetTxPacketDetailsAlt(RAIL_Handle_t railHandle, bool isAck, RAIL_Time_t *pPacketTime)`

**Description:** Get detailed information about the last packet transmitted.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|isAck|true to obtain details about the most recent Ack transmit. false to obtain details about the most recent app-initiated transmit.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[out]|pPacketTime|An application-provided non-NULL pointer to store a RAIL_Time_t corresponding to the transmit event. This will be populated with a time stamp corresponding to an arbitrary location in the packet. Call [RAIL_GetTxTimePreambleStart](transmit#rail-get-tx-time-preamble-start), [RAIL_GetTxTimeSyncWordEnd](transmit#rail-get-tx-time-sync-word-end), or [RAIL_GetTxTimeFrameEnd](transmit#rail-get-tx-time-frame-end) to adjust the time stamp for different locations in the packet.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was filled in, or an appropriate error code otherwise.

**Note**

- Consider using [RAIL_GetTxPacketDetailsAlt2](transmit#rail-get-tx-packet-details-alt2) to pass in a [RAIL_PacketTimeStamp_t](rail-packet-time-stamp-t) structure instead of a [RAIL_Time_t](system-timing#rail-time-t) structure, particularly when [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) information is needed or useful.

This function can only be called from callback context for either [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) or [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent) events.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) with different parameters. 

###### RAIL_GetTxPacketDetailsAlt2

`RAIL_Status_t RAIL_GetTxPacketDetailsAlt2(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)`

**Description:** Get detailed information about the last packet transmitted.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *|[inout]|pPacketDetails|An application-provided pointer to store [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) corresponding to the transmit event. The isAck field must be initialized prior to each call:<br/><br/>- isAck true to obtain details about the most recent Ack transmit, false to obtain details about the most recent app-initiated transmit. The timeSent field packetTime will be populated with a time stamp corresponding to a default location in the packet. The timeSent field timePosition will be populated with a [RAIL_PacketTimePosition_t](system-timing#rail-packet-time-position-t) value specifying that default packet location. Call [RAIL_GetTxTimePreambleStartAlt()](transmit#rail-get-tx-time-preamble-start-alt), [RAIL_GetTxTimeSyncWordEndAlt()](transmit#rail-get-tx-time-sync-word-end-alt), or [RAIL_GetTxTimeFrameEndAlt()](transmit#rail-get-tx-time-frame-end-alt) to adjust the time stamp for different locations in the packet.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketDetails was filled in, or an appropriate error code otherwise.

This function can only be called from callback context for either [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) or [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent) events.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details). 

###### RAIL_GetTxTimePreambleStart

`RAIL_Status_t RAIL_GetTxTimePreambleStart(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL TX completion time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the transmitted packet for RAIL to use when adjusting the provided time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. Pass [RAIL_TX_STARTED_BYTES](events#rail-tx-started-bytes) to retrieve the start-of-normal-TX time stamp (see below).|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|This points to the [RAIL_Time_t](system-timing#rail-time-t) returned from a previous call to [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) for this same packet. That time will be updated with the time that the preamble for this packet started on air. Must be non-NULL.|

Also used to retrieve the [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) time stamp.

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully determined or an appropriate error code otherwise.

When used for time stamp adjustment, call this function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) is called.

This function may be called when handling the [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) event to retrieve that event's start-of-normal-TX time stamp. (Ack transmits currently have no equivalent event or associated time stamp.) In this case, totalPacketBytes must be [RAIL_TX_STARTED_BYTES](events#rail-tx-started-bytes), and pPacketTime is an output-only parameter filled in with that time (so no need to initialize it beforehand by calling [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt)).

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start) with different parameters. 

###### RAIL_GetTxTimePreambleStartAlt

`RAIL_Status_t RAIL_GetTxTimePreambleStartAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL TX completion time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) for this same packet. The application must update the timeSent field totalPacketBytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. Pass [RAIL_TX_STARTED_BYTES](events#rail-tx-started-bytes) to retrieve the start-of-normal-TX time stamp (see below). After this function, the timeSent field packetTime will be updated with the time that the preamble for this packet started on air.|

Also used to retrieve the [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) time stamp.

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

When used for time stamp adjustment, call this function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) is called.

This function may be called when handling the [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started) event to retrieve that event's start-of-normal-TX time stamp. (Ack transmits currently have no equivalent event or associated time stamp.) In this case, the timeSent field totalPacketBytes must be [RAIL_TX_STARTED_BYTES](events#rail-tx-started-bytes), and the timeSent field packetTime is an output-only parameter filled in with that time (so no need to initialize it beforehand by calling [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2)).

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start). 

###### RAIL_GetTxTimeSyncWordEnd

`RAIL_Status_t RAIL_GetTxTimeSyncWordEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the transmitted packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|The time that was returned in a [RAIL_Time_t](system-timing#rail-time-t) from a previous call to [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) for this same packet. After this function, the time at that location will be updated with the time that the sync word for this packet finished on air. Must be non-NULL.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) is called.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_sync_word_end()](transmit#sl-rail-get-tx-time-sync-word-end) with different parameters. 

###### RAIL_GetTxTimeSyncWordEndAlt

`RAIL_Status_t RAIL_GetTxTimeSyncWordEndAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) for this same packet. The application must update the timeSent field totalPacketBytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the timeSent field packetTime will be updated with the time that the sync word for this packet finished on air.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) is called.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_time_sync_word_end()](transmit#sl-rail-get-tx-time-sync-word-end). 

###### RAIL_GetTxTimeFrameEnd

`RAIL_Status_t RAIL_GetTxTimeFrameEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|totalPacketBytes|The total number of bytes of the transmitted packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes.|
|[RAIL_Time_t](system-timing#rail-time-t) *|[inout]|pPacketTime|The time that was returned in a [RAIL_Time_t](system-timing#rail-time-t) from a previous call to [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) for this same packet. After this function, the time at that location will be updated with the time that this packet finished on air. Must be non-NULL.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if pPacketTime was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt) is called.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_get_tx_time_frame_end()](transmit#sl-rail-get-tx-time-frame-end) with different parameters. 

###### RAIL_GetTxTimeFrameEndAlt

`RAIL_Status_t RAIL_GetTxTimeFrameEndAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPacketDetails_t](rail-tx-packet-details-t) *|[inout]|pPacketDetails|A non-NULL pointer to the details that were returned from a previous call to [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) for this same packet. The application must update the timeSent field totalPacketBytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the timeSent field packetTime will be updated with the time that this packet finished on air.|

**Returns**

- [RAIL_STATUS_NO_ERROR](general#rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [RAIL_GetTxPacketDetailsAlt2()](transmit#rail-get-tx-packet-details-alt2) is called.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_time_frame_end()](transmit#sl-rail-get-tx-time-frame-end). 

###### RAIL_EnableTxHoldOff

`RAIL_Status_t RAIL_EnableTxHoldOff(RAIL_Handle_t railHandle, bool enable)`

**Description:** Prevent the radio from starting a transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|bool|[in]|enable|Enable/Disable TX hold off.|

**Returns**

- Status code indicating success of the function call.

Enable TX hold off to prevent the radio from starting any transmits. Disable TX hold off to allow the radio to transmit again. Attempting to transmit with the TX hold off enabled will result in [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) and/or [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked) events.

**Note**

- This function does not affect a transmit that has already started. To stop an already-started transmission, use [RAIL_Idle()](state-transitions#rail-idle-1) with [RAIL_IDLE_ABORT](state-transitions#rail-idle-abort).

**Deprecated**RAIL 2.x synonym of [sl_rail_enable_tx_hold_off()](transmit#sl-rail-enable-tx-hold-off). 

###### RAIL_IsTxHoldOffEnabled

`bool RAIL_IsTxHoldOffEnabled(RAIL_Handle_t railHandle)`

**Description:** Check whether or not TX hold off is enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- true if TX hold off is enabled, false otherwise.

TX hold off can be enabled/disabled using [RAIL_EnableTxHoldOff()](transmit#rail-enable-tx-hold-off). Attempting to transmit with the TX hold off enabled will block the transmission and result in [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) and/or [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked) events.

**Deprecated**RAIL 2.x synonym of [sl_rail_is_tx_hold_off_enabled()](transmit#sl-rail-is-tx-hold-off-enabled). 

###### RAIL_SetTxAltPreambleLength

`RAIL_Status_t RAIL_SetTxAltPreambleLength(RAIL_Handle_t railHandle, uint16_t length)`

**Description:** Set an alternate transmitter preamble length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|length|The desired preamble length, in bits.|

**Returns**

- Status code indicating success of the function call.

To cause a transmission to use this alternate preamble length, specify [RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#rail-tx-option-alt-preamble-len) in the txOptions parameter passed to the respective RAIL transmit API.

**Note**

- Attempting to set a preamble length of 0xFFFF bits will result in [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tx_alt_preamble_length()](transmit#sl-rail-set-tx-alt-preamble-length). 

###### sl_rail_stop_tx

`sl_rail_status_t sl_rail_stop_tx(sl_rail_handle_t rail_handle, sl_rail_stop_mode_t mode)`

**Description:** Stop an active or pending transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_stop_mode_t](transmit#sl-rail-stop-mode-t)|[in]|mode|Specifies the type(s) of transmit to stop.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the transmit was successfully stopped or [SL_RAIL_STATUS_INVALID_STATE](general#sl-rail-status-invalid-state) if there is no transmit operation to stop.

**Note**

- When mode includes [SL_RAIL_STOP_MODE_ACTIVE](transmit#sl-rail-stop-mode-active), this can also stop an active Auto-Ack transmit. When an active transmit is stopped, [SL_RAIL_EVENT_TX_ABORTED](events#sl-rail-event-tx-aborted) or [SL_RAIL_EVENT_TXACK_ABORTED](events#sl-rail-event-txack-aborted) should occur. When mode includes [SL_RAIL_STOP_MODE_PENDING](transmit#sl-rail-stop-mode-pending) this can also stop a [SL_RAIL_TX_OPTION_CCA_ONLY](transmit#sl-rail-tx-option-cca-only) transmit operation. When a pending transmit is stopped, [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked) should occur.

###### sl_rail_set_cca_threshold

`sl_rail_status_t sl_rail_set_cca_threshold(sl_rail_handle_t rail_handle, int8_t cca_threshold_dbm)`

**Description:** Set the CCA threshold in dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|int8_t|[in]|cca_threshold_dbm|The CCA threshold in dBm.|

**Returns**

- Status code indicating success of the function call.

Unlike [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx) or [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx), which can cause a transmit, this function only modifies the CCA threshold. A possible use case for this function involves setting the CCA threshold to invalid RSSI of -128 which blocks transmission by preventing clear channel assessments from succeeding. 

###### sl_rail_get_tx_packet_details

`sl_rail_status_t sl_rail_get_tx_packet_details(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)`

**Description:** Get detailed information about the last packet transmitted.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t) *|[inout]|p_packet_details|An application-provided pointer to store [sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t) corresponding to the transmit event. The is_ack field must be initialized prior to each call:<br/><br/>- is_ack true to obtain details about the most recent Ack transmit, false to obtain details about the most recent app-initiated transmit. The time_sent field packet_time will be populated with a time stamp corresponding to a default location in the packet. The time_sent field time_position will be populated with a [sl_rail_packet_time_position_t](system-timing#sl-rail-packet-time-position-t) value specifying that default packet location. Call [sl_rail_get_tx_time_preamble_start()](transmit#sl-rail-get-tx-time-preamble-start), [sl_rail_get_tx_time_sync_word_end()](transmit#sl-rail-get-tx-time-sync-word-end), or [sl_rail_get_tx_time_frame_end()](transmit#sl-rail-get-tx-time-frame-end) to adjust the time stamp for different locations in the packet.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if p_packet_details was filled in, or an appropriate error code otherwise.

This function can only be called from callback context for either [SL_RAIL_EVENT_TX_PACKET_SENT](events#sl-rail-event-tx-packet-sent) or [SL_RAIL_EVENT_TXACK_PACKET_SENT](events#sl-rail-event-txack-packet-sent) events. 

###### sl_rail_get_tx_time_preamble_start

`sl_rail_status_t sl_rail_get_tx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL TX completion time stamp to refer to the start of the preamble.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) for this same packet. The application must update the time_sent field total_packet_bytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. Pass [SL_RAIL_TX_STARTED_BYTES](events#sl-rail-tx-started-bytes) to retrieve the start-of-normal-TX time stamp (see below). After this function, the time_sent field packet_time will be updated with the time that the preamble for this packet started on air.|

Also used to retrieve the [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started) time stamp.

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

When used for time stamp adjustment, call this function in the same transmit-complete event-handling context as [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) is called.

This function may be called when handling the [SL_RAIL_EVENT_TX_STARTED](events#sl-rail-event-tx-started) event to retrieve that event's start-of-normal-TX time stamp. (Ack transmits currently have no equivalent event or associated time stamp.) In this case, the time_sent field total_packet_bytes must be [SL_RAIL_TX_STARTED_BYTES](events#sl-rail-tx-started-bytes), and the time_sent field packet_time is an output-only parameter filled in with that time (so no need to initialize it beforehand by calling [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details)). 

###### sl_rail_get_tx_time_sync_word_end

`sl_rail_status_t sl_rail_get_tx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of the sync word.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) for this same packet. The application must update the time_sent field total_packet_bytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the time_sent field packet_time will be updated with the time that the sync word for this packet finished on air.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) is called. 

###### sl_rail_get_tx_time_frame_end

`sl_rail_status_t sl_rail_get_tx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)`

**Description:** Adjust a RAIL TX time stamp to refer to the end of frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t) *|[inout]|p_packet_details|A non-NULL pointer to the details that were returned from a previous call to [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) for this same packet. The application must update the time_sent field total_packet_bytes to be the total number of bytes of the sent packet for RAIL to use when calculating the specified time stamp. This should account for all bytes transmitted over the air after the Preamble and Sync word(s), including CRC bytes. After this function, the time_sent field packet_time will be updated with the time that this packet finished on air.|

**Returns**

- [SL_RAIL_STATUS_NO_ERROR](general#sl-rail-status-no-error) if the packet time was successfully calculated, or an appropriate error code otherwise.

Call the time stamp adjustment function in the same transmit-complete event-handling context as [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details) is called. 

###### sl_rail_enable_tx_hold_off

`sl_rail_status_t sl_rail_enable_tx_hold_off(sl_rail_handle_t rail_handle, bool enable)`

**Description:** Prevent the radio from starting a transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|bool|[in]|enable|Enable/Disable TX hold off.|

**Returns**

- Status code indicating success of the function call.

Enable TX hold off to prevent the radio from starting any transmits. Disable TX hold off to allow the radio to transmit again. Attempting to transmit with the TX hold off enabled will result in [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked) and/or [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked) events.

**Note**

- This function does not affect a transmit that has already started. To stop an already-started transmission, use [sl_rail_idle()](state-transitions#sl-rail-idle-1) with [SL_RAIL_IDLE_ABORT](state-transitions#sl-rail-idle-abort).

###### sl_rail_is_tx_hold_off_enabled

`bool sl_rail_is_tx_hold_off_enabled(sl_rail_handle_t rail_handle)`

**Description:** Check whether or not TX hold off is enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- true if TX hold off is enabled, false otherwise.

TX hold off can be enabled/disabled using [sl_rail_enable_tx_hold_off()](transmit#sl-rail-enable-tx-hold-off). Attempting to transmit with the TX hold off enabled will block the transmission and result in [SL_RAIL_EVENT_TX_BLOCKED](events#sl-rail-event-tx-blocked) and/or [SL_RAIL_EVENT_TXACK_BLOCKED](events#sl-rail-event-txack-blocked) events. 

###### sl_rail_set_tx_alt_preamble_length

`sl_rail_status_t sl_rail_set_tx_alt_preamble_length(sl_rail_handle_t rail_handle, uint16_t bits)`

**Description:** Set an alternate transmitter preamble length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|bits|The desired preamble length, in bits.|

**Returns**

- Status code indicating success of the function call.

To cause a transmission to use this alternate preamble length, specify [SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#sl-rail-tx-option-alt-preamble-len) in the tx_options parameter passed to the respective RAIL transmit API.

**Note**

- Attempting to set a preamble length of 0xFFFF bits will result in [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).

##### Macros

`#define RAIL_STOP_MODES_NONE (0U)`

**Description**: Do not stop any radio operations.

`#define RAIL_STOP_MODE_ACTIVE (1U << RAIL_STOP_MODE_ACTIVE_SHIFT)`

**Description**: Stop active radio operations only.

`#define RAIL_STOP_MODE_PENDING (1U << RAIL_STOP_MODE_PENDING_SHIFT)`

**Description**: Stop pending radio operations.

`#define RAIL_STOP_MODES_ALL (0xFFU)`

**Description**: Stop all radio operations.

`#define RAIL_TX_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define RAIL_TX_OPTIONS_DEFAULT RAIL_TX_OPTIONS_NONE`

**Description**: All options disabled by default.

`#define RAIL_TX_OPTION_WAIT_FOR_ACK (1UL << RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT)`

**Description**: An option when Auto-Ack has been configured, enabled, and not TX paused, to configure whether or not the transmitting node will listen for an Ack response.

`#define RAIL_TX_OPTION_REMOVE_CRC (1UL << RAIL_TX_OPTION_REMOVE_CRC_SHIFT)`

**Description**: An option to remove CRC bytes from TX packets.

`#define RAIL_TX_OPTION_SYNC_WORD_ID (1UL << RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT)`

**Description**: An option to select which sync word is used during the transmission.

`#define RAIL_TX_OPTION_ANTENNA0 (1UL << RAIL_TX_OPTION_ANTENNA0_SHIFT)`

**Description**: An option to select antenna 0 for transmission.

`#define RAIL_TX_OPTION_ANTENNA1 (1UL << RAIL_TX_OPTION_ANTENNA1_SHIFT)`

**Description**: An option to select antenna 1 for transmission.

`#define RAIL_TX_OPTION_ALT_PREAMBLE_LEN (1UL << RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT)`

**Description**: An option to use the alternate preamble length established by [RAIL_SetTxAltPreambleLength()](transmit#rail-set-tx-alt-preamble-length) for the transmission.

`#define RAIL_TX_OPTION_CCA_PEAK_RSSI (1UL << RAIL_TX_OPTION_CCA_PEAK_RSSI_SHIFT)`

**Description**: Former option to specify using peak RSSI during CCA.

`#define RAIL_TX_OPTION_CCA_ONLY (1UL << RAIL_TX_OPTION_CCA_ONLY_SHIFT)`

**Description**: An option to only perform the CCA (CSMA/LBT) operation but **not** automatically transmit if the channel is clear.

`#define RAIL_TX_OPTION_RESEND (1UL << RAIL_TX_OPTION_RESEND_SHIFT)`

**Description**: An option to resend packet at the beginning of the Transmit FIFO.

`#define RAIL_TX_OPTION_CONCURRENT_PHY_ID (1UL << RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT)`

**Description**: An option to specify which PHY is used to transmit in the case of concurrent mode.

`#define RAIL_TX_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define RAIL_MAX_LBT_TRIES (15U)`

**Description**: The maximum number of LBT/CSMA retries supported.

`#define RAIL_MAX_CSMA_EXPONENT (8U)`

**Description**: The maximum power-of-2 exponent for CSMA backoffs.

`#define RAIL_CSMA_CONFIG_802_15_4_2003_2p4_GHz_OQPSK_CSMA `

**Description**: [RAIL_CsmaConfig_t](rail-csma-config-t) initializer configuring CSMA per IEEE 802.15.4-2003 on 2.4 GHz OSPSK, commonly used by Zigbee.

`#define RAIL_CSMA_CONFIG_SINGLE_CCA `

**Description**: [RAIL_CsmaConfig_t](rail-csma-config-t) initializer configuring a single CCA prior to TX.

`#define RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V2_4_1 `

**Description**: [RAIL_LbtConfig_t](rail-lbt-config-t) initializer configuring LBT per ETSI 300 220-1 V2.4.1 for a typical Sub-GHz band.

`#define RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V3_1_0 `

**Description**: [RAIL_LbtConfig_t](rail-lbt-config-t) initializer configuring LBT per ETSI 300 220-1 V3.1.0 for a typical Sub-GHz band.

`#define RAIL_TX_REPEAT_OPTIONS_NONE 0U`

**Description**: A value representing no repeat options enabled.

`#define RAIL_TX_REPEAT_OPTIONS_DEFAULT RAIL_TX_REPEAT_OPTIONS_NONE`

**Description**: All repeat options disabled by default.

`#define RAIL_TX_REPEAT_OPTION_HOP (1U << RAIL_TX_REPEAT_OPTION_HOP_SHIFT)`

**Description**: An option to configure whether or not to channel-hop before each repeated transmit.

`#define RAIL_TX_REPEAT_OPTION_START_TO_START (1 << RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT)`

**Description**: An option to configure the delay between transmissions to be from start to start instead of end to start.

`#define RAIL_TX_REPEAT_INFINITE_ITERATIONS (0xFFFFU)`

**Description**: [RAIL_TxRepeatConfig_t::iterations](rail-tx-repeat-config-t#iterations) initializer configuring infinite repeated transmissions.

`#define SL_RAIL_STOP_MODES_NONE (0U)`

**Description**: Do not stop any radio operations.

`#define SL_RAIL_STOP_MODE_ACTIVE (1U << SL_RAIL_STOP_MODE_ACTIVE_SHIFT)`

**Description**: Stop active radio operations only.

`#define SL_RAIL_STOP_MODE_PENDING (1U << SL_RAIL_STOP_MODE_PENDING_SHIFT)`

**Description**: Stop pending radio operations.

`#define SL_RAIL_STOP_MODES_ALL (0xFFU)`

**Description**: Stop all radio operations.

`#define SL_RAIL_TX_OPTIONS_NONE 0UL`

**Description**: A value representing no options enabled.

`#define SL_RAIL_TX_OPTIONS_DEFAULT SL_RAIL_TX_OPTIONS_NONE`

**Description**: All options disabled by default.

`#define SL_RAIL_TX_OPTION_WAIT_FOR_ACK (1UL << SL_RAIL_TX_OPTION_WAIT_FOR_ACK_SHIFT)`

**Description**: An option when Auto-Ack has been configured, enabled, and not TX paused, to configure whether or not the transmitting node will listen for an Ack response.

`#define SL_RAIL_TX_OPTION_REMOVE_CRC (1UL << SL_RAIL_TX_OPTION_REMOVE_CRC_SHIFT)`

**Description**: An option to remove CRC bytes from TX packets.

`#define SL_RAIL_TX_OPTION_SYNC_WORD_ID (1UL << SL_RAIL_TX_OPTION_SYNC_WORD_ID_SHIFT)`

**Description**: An option to select which sync word is used during the transmission.

`#define SL_RAIL_TX_OPTION_ANTENNA_0 (1UL << SL_RAIL_TX_OPTION_ANTENNA_0_SHIFT)`

**Description**: An option to select antenna 0 for transmission.

`#define SL_RAIL_TX_OPTION_ANTENNA_1 (1UL << SL_RAIL_TX_OPTION_ANTENNA_1_SHIFT)`

**Description**: An option to select antenna 1 for transmission.

`#define SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN (1UL << SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN_SHIFT)`

**Description**: An option to use the alternate preamble length established by [sl_rail_set_tx_alt_preamble_length()](transmit#sl-rail-set-tx-alt-preamble-length) for the transmission.

`#define SL_RAIL_TX_OPTION_CCA_ONLY (1UL << SL_RAIL_TX_OPTION_CCA_ONLY_SHIFT)`

**Description**: An option to only perform the CCA (CSMA/LBT) operation but **not** automatically transmit if the channel is clear.

`#define SL_RAIL_TX_OPTION_RESEND (1UL << SL_RAIL_TX_OPTION_RESEND_SHIFT)`

**Description**: An option to resend packet at the beginning of the Transmit FIFO.

`#define SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID (1UL << SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID_SHIFT)`

**Description**: An option to specify which PHY is used to transmit in the case of concurrent mode.

`#define SL_RAIL_TX_OPTIONS_ALL 0xFFFFFFFFUL`

**Description**: A value representing all possible options.

`#define SL_RAIL_MAX_LBT_TRIES (15U)`

**Description**: The maximum number of LBT/CSMA retries supported.

`#define SL_RAIL_MAX_CSMA_EXPONENT (8U)`

**Description**: The maximum power-of-2 exponent for CSMA backoffs.

`#define SL_RAIL_CSMA_CONFIG_802_15_4_2003_2P4_GHZ_OQPSK_CSMA `

**Description**: [sl_rail_csma_config_t](sl-rail-csma-config-t) initializer configuring CSMA per IEEE 802.15.4-2003 on 2.4 GHz OSPSK, commonly used by Zigbee.

`#define SL_RAIL_CSMA_CONFIG_SINGLE_CCA `

**Description**: [sl_rail_csma_config_t](sl-rail-csma-config-t) initializer configuring a single CCA prior to TX.

`#define SL_RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V2_4_1 `

**Description**: [sl_rail_lbt_config_t](sl-rail-lbt-config-t) initializer configuring LBT per ETSI 300 220-1 V2.4.1 for a typical Sub-GHz band.

`#define SL_RAIL_LBT_CONFIG_ETSI_EN_300_220_1_V3_1_0 `

**Description**: [sl_rail_lbt_config_t](sl-rail-lbt-config-t) initializer configuring LBT per ETSI 300 220-1 V3.1.0 for a typical Sub-GHz band.

`#define SL_RAIL_TX_REPEAT_OPTIONS_NONE 0U`

**Description**: A value representing no repeat options enabled.

`#define SL_RAIL_TX_REPEAT_OPTIONS_DEFAULT SL_RAIL_TX_REPEAT_OPTIONS_NONE`

**Description**: All repeat options disabled by default.

`#define SL_RAIL_TX_REPEAT_OPTION_HOP (1U << SL_RAIL_TX_REPEAT_OPTION_HOP_SHIFT)`

**Description**: An option to configure whether or not to channel-hop before each repeated transmit.

`#define SL_RAIL_TX_REPEAT_OPTION_START_TO_START (1 << SL_RAIL_TX_REPEAT_OPTION_START_TO_START_SHIFT)`

**Description**: An option to configure the delay between transmissions to be from start to start instead of end to start.

`#define SL_RAIL_TX_REPEAT_INFINITE_ITERATIONS (0xFFFFU)`

**Description**: [sl_rail_tx_repeat_config_t::iterations](sl-rail-tx-repeat-config-t#iterations) initializer configuring infinite repeated transmissions.

Detailed information requested about the packet that was just, or is currently being, transmitted. 

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_packet_details_t](sl-rail-tx-packet-details-t). 

###### Public Attributes

###### timeSent (heading level 7)

```
RAIL_PacketTimeStamp_t RAIL_TxPacketDetails_t::timeSent
```

**Description:** The time stamp of the transmitted packet in the RAIL timebase, filled in by [RAIL_GetTxPacketDetails()](transmit#rail-get-tx-packet-details).

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_packet_details_t::time_sent](sl-rail-tx-packet-details-t#time-sent).

###### isAck (heading level 7)

```
bool RAIL_TxPacketDetails_t::isAck
```

**Description:** Indicate whether the transmitted packet was an automatic Ack.

**Details:** In a generic sense, an automatic Ack is defined as a packet sent in response to a received Ack-requesting frame when Auto-Ack is enabled. In a protocol specific sense this definition may be more or less restrictive to match the specification and you should refer to that protocol's documentation.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_packet_details_t::is_ack](sl-rail-tx-packet-details-t#is-ack).

A configuration structure for a scheduled transmit. 

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t). 

###### Public Attributes

###### when (heading level 7)

```
RAIL_Time_t RAIL_ScheduleTxConfig_t::when
```

**Description:** The time when to transmit this packet.

**Details:** The exact interpretation of this value depends on the mode specified below.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::when](sl-rail-scheduled-tx-config-t#when).

###### mode (heading level 7)

```
RAIL_TimeMode_t RAIL_ScheduleTxConfig_t::mode
```

**Description:** The type of delay.

**Details:** See the [RAIL_TimeMode_t](system-timing#rail-time-mode-t) documentation for more information. Be sure to use [RAIL_TIME_ABSOLUTE](system-timing#rail-time-absolute) delays for time-critical protocols.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::mode](sl-rail-scheduled-tx-config-t#mode).

###### txDuringRx (heading level 7)

```
RAIL_ScheduledTxDuringRx_t RAIL_ScheduleTxConfig_t::txDuringRx
```

**Description:** Indicate which action to take with a scheduled TX if it occurs during RX.

**Details:** See [RAIL_ScheduledTxDuringRx_t](transmit#rail-scheduled-tx-during-rx-t) structure for more information on potential options.

**Deprecated**RAIL 2.x synonym of [sl_rail_scheduled_tx_config_t::tx_during_rx](sl-rail-scheduled-tx-config-t#tx-during-rx).

A configuration structure for the CSMA transmit algorithm. 

One of RAIL's schemes for polite spectrum access is an implementation of a Carrier-Sense Multiple Access (CSMA) algorithm based on IEEE 802.15.4 (unslotted). <br />
 In pseudo-code it works like this, showing relevant event notifications: 

```c
// Return true to transmit packet, false to not transmit packet.
bool performCsma(const RAIL_CsmaConfig_t *csmaConfig)
{
  extern int idleToRxUs;
  bool isFixedBackoff = ((csmaConfig->csmaMinBoExp == 0)
                         && (csmaConfig->csmaMaxBoExp == 0));
  int backoffExp = csmaConfig->csmaMinBoExp; // Initial backoff exponent
  int backoffMultiplier = 1; // Assume fixed backoff
  int try;

  // Special-case tries == 0 to transmit immediately without backoff+CCA
  if (csmaConfig->csmaTries == 0) {
    return true;
  }

  // Start overall timeout if specified:
  if (csmaConfig->csmaTimeout > 0) {
    StartAbortTimer(csmaConfig->csmaTimeout, RAIL_EVENT_TX_CHANNEL_BUSY);
    // If timeout occurs, abort and signal the indicated event.
  }

  for (try = 0; try < csmaConfig->csmaTries; try++) {
    if (try > 0) {
      signalEvent(RAIL_EVENT_TX_CCA_RETRY);
    }
    // Determine the backoff multipler for this try:
    if (isFixedBackoff) {
      // backoffMultiplier already set to 1 for fixed backoff
    } else {
      // Start with the backoff exponent for this try:
      if (try > 0) {
        backoffExp++;
        if (backoffExp > csmaConfig->csmaMaxBoExp) {
          backoffExp = csmaConfig->csmaMaxBoExp;
        }
      }
      // Pick random multiplier between 0 and 2^backoffExp - 1 inclusive:
      backoffMultiplier = pickRandomInteger(0, (1 << backoffExp) - 1);
    }
    // Perform the backoff:
    if (backoffMultiplier > 0) {
      delayMicroseconds((backoffMultiplier * csmaConfig->ccaBackoff)
                        - idleToRxUs);
    }
    enableRadioReceive();
    signalEvent(RAIL_EVENT_TX_START_CCA);
    delayMicroseconds(idleToRxUs);
    // Perform the Clear-Channel Assessment (CCA):
    // Channel is considered busy if radio is actively receiving or
    // transmitting, or the energy detected during the duration period
    // is above the threshold.
    signalEvent(RAIL_EVENT_TX_CCA_ACTIVATED);
    if (performCca(csmaConfig->ccaDuration, csmaConfig->ccaThreshold)) {
      // CCA (and CSMA) success: Transmit after RX-to-TX turnaround
      StopAbortTimer();
      signalEvent(RAIL_EVENT_TX_CHANNEL_CLEAR);
      return true;
    } else {
      // CCA failed: loop to try again, or exit if out of tries
    }
  }
  // Overall CSMA failure: Don't transmit
  StopAbortTimer();
  signalEvent(RAIL_EVENT_TX_CHANNEL_BUSY);
  return false;
}

```

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t](sl-rail-csma-config-t). 

###### Public Attributes

###### csmaMinBoExp (heading level 7)

```
uint8_t RAIL_CsmaConfig_t::csmaMinBoExp
```

**Description:** The minimum (starting) exponent for CSMA random backoff (2^exp - 1).

**Details:** It can range from 0 to [RAIL_MAX_CSMA_EXPONENT](transmit#rail-max-csma-exponent).

**Warnings**

- On EFR32, due to a hardware limitation, this can only be 0 if [csmaMaxBoExp](rail-csma-config-t#csma-max-bo-exp) is also 0 specifying a non-random fixed backoff. [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) will result otherwise. If you really want CSMA's first iteration to have no backoff prior to CCA, with subsequent iterations having random backoff as the exponent is increased, you must do a fixed backoff of 0 operation first ([csmaMinBoExp](rail-csma-config-t#csma-min-bo-exp) = 0, [csmaMaxBoExp](rail-csma-config-t#csma-max-bo-exp) = 0, [ccaBackoff](rail-csma-config-t#cca-backoff) = 0, [csmaTries](rail-csma-config-t#csma-tries) = 1), and if that fails ([RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy)), follow up with a random backoff operation starting at [csmaMinBoExp](rail-csma-config-t#csma-min-bo-exp) = 1 for the remaining iterations.

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp).

###### csmaMaxBoExp (heading level 7)

```
uint8_t RAIL_CsmaConfig_t::csmaMaxBoExp
```

**Description:** The maximum exponent for CSMA random backoff (2^exp - 1).

**Details:** It can range from 0 to [RAIL_MAX_CSMA_EXPONENT](transmit#rail-max-csma-exponent) and must be greater than or equal to [csmaMinBoExp](rail-csma-config-t#csma-min-bo-exp). <br />
 If both exponents are 0, a non-random fixed backoff of [ccaBackoff](rail-csma-config-t#cca-backoff) duration results.

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::csma_max_bo_exp](sl-rail-csma-config-t#csma-max-bo-exp).

###### csmaTries (heading level 7)

```
uint8_t RAIL_CsmaConfig_t::csmaTries
```

**Description:** The number of backoff-then-CCA iterations that can fail before reporting [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy).

**Details:** Typically ranges from 1 to [RAIL_MAX_LBT_TRIES](transmit#rail-max-lbt-tries); higher values are disallowed. A value 0 always transmits immediately without performing CSMA, similar to calling [RAIL_StartTx()](packet-tx#rail-start-tx).

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::csma_tries](sl-rail-csma-config-t#csma-tries).

###### ccaThreshold (heading level 7)

```
int8_t RAIL_CsmaConfig_t::ccaThreshold
```

**Description:** The CCA RSSI threshold, in dBm, above which the channel is considered 'busy'.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::cca_threshold_dbm](sl-rail-csma-config-t#cca-threshold-dbm).

###### ccaBackoff (heading level 7)

```
uint16_t RAIL_CsmaConfig_t::ccaBackoff
```

**Description:** The backoff unit period in RAIL's microsecond time base.

**Details:** It is multiplied by the random backoff exponential controlled by [csmaMinBoExp](rail-csma-config-t#csma-min-bo-exp) and [csmaMaxBoExp](rail-csma-config-t#csma-max-bo-exp) to determine the overall backoff period. For random backoffs, any value above 32768 microseconds for the 'EFR Series 2' and 8192 microseconds for the 'Series 3' will be truncated for a single backoff period. Up to 255 backoff periods are supported. For fixed backoffs it can go up to 65535 microseconds.

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us).

###### ccaDuration (heading level 7)

```
uint16_t RAIL_CsmaConfig_t::ccaDuration
```

**Description:** The minimum desired CCA check duration in microseconds.

**Details:** The RSSI is sampled during this duration.

**Note**

- Depending on the radio configuration, due to hardware constraints, the actual duration may be longer. Also, if the requested duration is too large for the radio to accommodate, [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) will fail returning [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::cca_duration_us](sl-rail-csma-config-t#cca-duration-us).

###### csmaTimeout (heading level 7)

```
RAIL_Time_t RAIL_CsmaConfig_t::csmaTimeout
```

**Description:** An overall timeout, in RAIL's microsecond time base, for the operation.

**Details:** If the transmission doesn't start before this timeout expires, the transmission will fail with [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy). A value 0 means no timeout is imposed.

**Deprecated**RAIL 2.x synonym of [sl_rail_csma_config_t::csma_timeout_us](sl-rail-csma-config-t#csma-timeout-us).

A configuration structure for the LBT transmit algorithm. 

One of RAIL's schemes for polite spectrum access is an implementation of a Listen-Before-Talk (LBT) algorithm, loosely based on ETSI 300 220-1. <br />
 Currently, however, it is constrained by the EFR32's CSMA-oriented hardware so is turned into an equivalent [RAIL_CsmaConfig_t](rail-csma-config-t) configuration and passed to the CSMA engine: 

```c
if (lbtMaxBoRand == lbtMinBoRand) {
  // Fixed backoff
  csmaMinBoExp = csmaMaxBoExp = 0;
  if (lbtMinBoRand == 0) {
    ccaBackoff = lbtBackoff;
  } else {
    ccaBackoff = lbtMinBoRand * lbtBackoff;
  }
  ccaDuration = lbtDuration;
} else {
  // Random backoff: map to random range 0 .. (lbtMaxBoRand - lbtMinBoRand)
  csmaMinBoExp = csmaMaxBoExp = ceiling(log2(lbtMaxBoRand - lbtMinBoRand));
  ccaBackoff = round((lbtBackoff * (lbtMaxBoRand - lbtMinBoRand))
                     / (1 << csmaMinBoExp));
  ccaDuration = lbtDuration + (lbtMinBoRand * lbtBackoff);
}
csmaTries    = lbtTries;
ccaThreshold = lbtThreshold;
csmaTimeout  = lbtTimeout;

```

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t](sl-rail-lbt-config-t). 

###### Public Attributes

###### lbtMinBoRand (heading level 7)

```
uint8_t RAIL_LbtConfig_t::lbtMinBoRand
```

**Description:** The minimum backoff random multiplier.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_min_bo_rand](sl-rail-lbt-config-t#lbt-min-bo-rand).

###### lbtMaxBoRand (heading level 7)

```
uint8_t RAIL_LbtConfig_t::lbtMaxBoRand
```

**Description:** The maximum backoff random multiplier.

**Details:** It must be greater than or equal to [lbtMinBoRand](rail-lbt-config-t#lbt-min-bo-rand). <br />
 If both backoff multipliers are identical, a non-random fixed backoff of [lbtBackoff](rail-lbt-config-t#lbt-backoff) times the multiplier (minimum 1) duration results.

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_max_bo_rand](sl-rail-lbt-config-t#lbt-max-bo-rand).

###### lbtTries (heading level 7)

```
uint8_t RAIL_LbtConfig_t::lbtTries
```

**Description:** The number of LBT iterations that can fail before reporting [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy).

**Details:** Typically ranges from 1 to [RAIL_MAX_LBT_TRIES](transmit#rail-max-lbt-tries); higher values are disallowed. A value 0 always transmits immediately without performing LBT, similar to calling [RAIL_StartTx()](packet-tx#rail-start-tx).

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_tries](sl-rail-lbt-config-t#lbt-tries).

###### lbtThreshold (heading level 7)

```
int8_t RAIL_LbtConfig_t::lbtThreshold
```

**Description:** The LBT RSSI threshold, in dBm, above which the channel is considered 'busy'.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_threshold_dbm](sl-rail-lbt-config-t#lbt-threshold-dbm).

###### lbtBackoff (heading level 7)

```
uint16_t RAIL_LbtConfig_t::lbtBackoff
```

**Description:** The backoff unit period, in RAIL's microsecond time base.

**Details:** It is multiplied by the random backoff multiplier controlled by [lbtMinBoRand](rail-lbt-config-t#lbt-min-bo-rand) and [lbtMaxBoRand](rail-lbt-config-t#lbt-max-bo-rand) to determine the overall backoff period. For random backoffs, any value above 32768 microseconds for the 'EFR Series 2' and 8192 microseconds for the 'Series 3' will be truncated for a single backoff period. Up to 255 backoff periods are supported. For fixed backoffs, it can go up to 65535 microseconds.

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_backoff_us](sl-rail-lbt-config-t#lbt-backoff-us).

###### lbtDuration (heading level 7)

```
uint16_t RAIL_LbtConfig_t::lbtDuration
```

**Description:** The minimum desired LBT check duration in microseconds.

**Details:** **Note**

- Depending on the radio configuration, due to hardware constraints, the actual duration may be longer. Also, if the requested duration is too large for the radio to accommodate, [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) will fail returning [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_duration_us](sl-rail-lbt-config-t#lbt-duration-us).

###### lbtTimeout (heading level 7)

```
RAIL_Time_t RAIL_LbtConfig_t::lbtTimeout
```

**Description:** An overall timeout, in RAIL's microsecond time base, for the operation.

**Details:** If the transmission doesn't start before this timeout expires, the transmission will fail with [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy). This is important for limiting LBT due to LBT's unbounded requirement that if the channel is busy, the next try must wait for the channel to clear. A value 0 means no timeout is imposed.

**Deprecated**RAIL 2.x synonym of [sl_rail_lbt_config_t::lbt_timeout_us](sl-rail-lbt-config-t#lbt-timeout-us).

RAIL sync words and length configuration. 

**Deprecated**RAIL 2.x synonym of [sl_rail_sync_word_config_t](sl-rail-sync-word-config-t).

###### Public Attributes

###### syncWordBits (heading level 7)

```
uint8_t RAIL_SyncWordConfig_t::syncWordBits
```

**Description:** Sync word length in bits, between 2 and 32, inclusive.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_bits](sl-rail-sync-word-config-t#sync-word-bits).

###### syncWord1 (heading level 7)

```
uint32_t RAIL_SyncWordConfig_t::syncWord1
```

**Description:** Sync Word1.

**Details:** **Note**

- Only the least-significant [syncWordBits](rail-sync-word-config-t#sync-word-bits) bits are used, which are sent or received on air least-significant-bit first.

**Deprecated**RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_0](sl-rail-sync-word-config-t#sync-word-0).

###### syncWord2 (heading level 7)

```
uint32_t RAIL_SyncWordConfig_t::syncWord2
```

**Description:** Sync Word2.

**Details:** **Note**

- Only the least-significant [syncWordBits](rail-sync-word-config-t#sync-word-bits) bits are used, which are sent or received on air least-significant-bit first.

**Deprecated**RAIL 2.x synonym of [sl_rail_sync_word_config_t::sync_word_1](sl-rail-sync-word-config-t#sync-word-1).

A configuration structure for repeated transmits. 

**Note**

- The PA will always be ramped down and up in between transmits so there will always be some minimum delay between transmits depending on the ramp time configuration.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t](sl-rail-tx-repeat-config-t). 

###### Public Attributes

###### iterations (heading level 7)

```
uint16_t RAIL_TxRepeatConfig_t::iterations
```

**Description:** The number of repeated transmits to run.

**Details:** A total of (iterations + 1) transmits will go on-air in the absence of errors.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::iterations](sl-rail-tx-repeat-config-t#iterations).

###### repeatOptions (heading level 7)

```
RAIL_TxRepeatOptions_t RAIL_TxRepeatConfig_t::repeatOptions
```

**Description:** Repeat option(s) to apply.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::repeat_options](sl-rail-tx-repeat-config-t#repeat-options).

###### delay (heading level 7)

```
RAIL_TransitionTime_t RAIL_TxRepeatConfig_t::delay
```

**Description:** When [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) is not set, specifies the delay time between each repeated transmit.

**Details:** Specify [RAIL_TRANSITION_TIME_KEEP](state-transitions#rail-transition-time-keep) to use the current [RAIL_StateTiming_t::txToTx](rail-state-timing-t#tx-to-tx) transition time setting. When using [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start) the delay must be long enough to cover the prior transmit's time.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::delay_us](sl-rail-tx-repeat-config-t#delay-us).

###### channelHopping (heading level 7)

```
RAIL_TxChannelHoppingConfig_t RAIL_TxRepeatConfig_t::channelHopping
```

**Description:** When [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) is set, this specifies the channel hopping configuration to use when hopping between repeated transmits.

**Details:** Per-hop delays are configured within each [RAIL_TxChannelHoppingConfigEntry_t::delay](rail-tx-channel-hopping-config-entry-t#delay) rather than this union's delay field. When using [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start) the hop delay must be long enough to cover the prior transmit's time.

**Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::channel_hopping](sl-rail-tx-repeat-config-t#channel-hopping).

###### delayOrHop (heading level 7)

```
union RAIL_TxRepeatConfig_t::@0 RAIL_TxRepeatConfig_t::delayOrHop
```

**Description:** Per-repeat delay or hopping configuration, depending on repeatOptions.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tx_repeat_config_t::delay_or_hop](sl-rail-tx-repeat-config-t#delay-or-hop).

Detailed information requested about the packet that was just, or is currently being, transmitted. 

###### Public Attributes

###### time_sent (heading level 7)

```
sl_rail_packet_time_stamp_t sl_rail_tx_packet_details_t::time_sent
```

**Description:** The time stamp of the transmitted packet in the RAIL timebase, filled in by [sl_rail_get_tx_packet_details()](transmit#sl-rail-get-tx-packet-details).

###### is_ack (heading level 7)

```
bool sl_rail_tx_packet_details_t::is_ack
```

**Description:** Indicate whether the transmitted packet was an Auto-Ack.

**Details:** In a generic sense, an automatic Ack is defined as a packet sent in response to a received Ack-requesting frame when Auto-Ack is enabled. In a protocol specific sense this definition may be more or less restrictive to match the specification and you should refer to that protocol's documentation.

A configuration structure for a scheduled transmit. 

###### Public Attributes

###### when (heading level 7)

```
sl_rail_time_t sl_rail_scheduled_tx_config_t::when
```

**Description:** The time when to transmit this packet.

**Details:** The exact interpretation of this value depends on the mode specified below.

###### mode (heading level 7)

```
sl_rail_time_mode_t sl_rail_scheduled_tx_config_t::mode
```

**Description:** The type of delay.

**Details:** See the [sl_rail_time_mode_t](system-timing#sl-rail-time-mode-t) documentation for more information. Be sure to use [SL_RAIL_TIME_ABSOLUTE](system-timing#sl-rail-time-absolute) delays for time-critical protocols.

###### tx_during_rx (heading level 7)

```
sl_rail_scheduled_tx_during_rx_t sl_rail_scheduled_tx_config_t::tx_during_rx
```

**Description:** Indicate which action to take with a scheduled TX if it occurs during RX.

**Details:** See [sl_rail_scheduled_tx_during_rx_t](transmit#sl-rail-scheduled-tx-during-rx-t) structure for more information on potential options.

A configuration structure for the CSMA transmit algorithm. 

One of RAIL's schemes for polite spectrum access is an implementation of a Carrier-Sense Multiple Access (CSMA) algorithm based on IEEE 802.15.4 (unslotted). <br />
 In pseudo-code it works like this, showing relevant event notifications: 

```c
// Return true to transmit packet, false to not transmit packet.
bool perform_csma(const sl_rail_csma_config_t *csma_config)
{
  extern int idle_to_rx_us;
  bool is_fixed_backoff = ((csma_config->csma_min_bo_exp == 0)
                           && (csma_config->csma_max_bo_exp == 0));
  int backoff_exp = csma_config->csma_min_bo_exp; // Initial backoff exponent
  int backoff_multiplier = 1; // Assume fixed backoff
  int try;

  // Special-case tries == 0 to transmit immediately without backoff+CCA
  if (csma_config->csma_tries == 0) {
    return true;
  }

  // Start overall timeout if specified:
  if (csma_config->csma_timeout_us > 0) {
    start_abort_timer(csma_config->csma_timeout_us, SL_RAIL_EVENT_TX_CHANNEL_BUSY);
    // If timeout occurs, abort and signal the indicated event.
  }

  for (try = 0; try < csma_config->csma_tries; try++) {
    if (try > 0) {
      signal_event(SL_RAIL_EVENT_TX_CCA_RETRY);
    }
    // Determine the backoff multipler for this try:
    if (is_fixed_backoff) {
      // backoff_multiplier already set to 1 for fixed backoff
    } else {
      // Start with the backoff exponent for this try:
      if (try > 0) {
        backoff_exp++;
        if (backoff_exp > csma_config->csma_max_bo_exp) {
          backoff_exp = csma_config->csma_max_bo_exp;
        }
      }
      // Pick random multiplier between 0 and 2^backoff_exp - 1 inclusive:
      backoff_multiplier = pick_random_integer(0, (1 << backoff_exp) - 1);
    }
    // Perform the backoff:
    if (backoff_multiplier > 0) {
      delay_microseconds((backoff_multiplier * csma_config->cca_backoff_us)
                         - idle_to_rx_us);
    }
    enable_radio_receive();
    signal_event(SL_RAIL_EVENT_TX_START_CCA);
    delay_microseconds(idle_to_rx_us);
    // Perform the Clear-Channel Assessment (CCA):
    // Channel is considered busy if radio is actively receiving or
    // transmitting, or the energy detected during the duration period
    // is above the threshold.
    signal_event(SL_RAIL_EVENT_TX_CCA_ACTIVATED);
    if (perform_cca(csma_config->cca_duration_us, csma_config->cca_threshold_dbm)) {
      // CCA (and CSMA) success: Transmit after RX-to-TX turnaround
      stop_abort_timer();
      signal_event(SL_RAIL_EVENT_TX_CHANNEL_CLEAR);
      return true;
    } else {
      // CCA failed: loop to try again, or exit if out of tries
    }
  }
  // Overall CSMA failure: Don't transmit
  stop_abort_timer();
  signal_event(SL_RAIL_EVENT_TX_CHANNEL_BUSY);
  return false;
}

```

###### Public Attributes

###### csma_min_bo_exp (heading level 7)

```
uint8_t sl_rail_csma_config_t::csma_min_bo_exp
```

**Description:** The minimum (starting) exponent for CSMA random backoff (2^exp - 1).

**Details:** It can range from 0 to [SL_RAIL_MAX_CSMA_EXPONENT](transmit#sl-rail-max-csma-exponent).

**Warnings**

- On EFR32, due to a hardware limitation, this can only be 0 if [csma_max_bo_exp](sl-rail-csma-config-t#csma-max-bo-exp) is also 0 specifying a non-random fixed backoff. [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter) will result otherwise. If you really want CSMA's first iteration to have no backoff prior to CCA, with subsequent iterations having random backoff as the exponent is increased, you must do a fixed backoff of 0 operation first ([csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp) = 0, [csma_max_bo_exp](sl-rail-csma-config-t#csma-max-bo-exp) = 0, [cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us) = 0, [csma_tries](sl-rail-csma-config-t#csma-tries) = 1), and if that fails ([SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy)), follow up with a random backoff operation starting at [csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp) = 1 for the remaining iterations.

###### csma_max_bo_exp (heading level 7)

```
uint8_t sl_rail_csma_config_t::csma_max_bo_exp
```

**Description:** The maximum exponent for CSMA random backoff (2^exp - 1).

**Details:** It can range from 0 to [SL_RAIL_MAX_CSMA_EXPONENT](transmit#sl-rail-max-csma-exponent) and must be greater than or equal to [csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp). <br />
 If both exponents are 0, a non-random fixed backoff of [cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us) duration results.

###### csma_tries (heading level 7)

```
uint8_t sl_rail_csma_config_t::csma_tries
```

**Description:** The number of backoff-then-CCA iterations that can fail before reporting [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy).

**Details:** Typically ranges from 1 to [SL_RAIL_MAX_LBT_TRIES](transmit#sl-rail-max-lbt-tries); higher values are disallowed. A value 0 always transmits immediately without performing CSMA, similar to calling [sl_rail_start_tx()](packet-tx#sl-rail-start-tx).

###### cca_threshold_dbm (heading level 7)

```
int8_t sl_rail_csma_config_t::cca_threshold_dbm
```

**Description:** The CCA RSSI threshold, in dBm, above which the channel is considered 'busy'.

###### cca_backoff_us (heading level 7)

```
uint16_t sl_rail_csma_config_t::cca_backoff_us
```

**Description:** The backoff unit period in RAIL's microsecond time base.

**Details:** It is multiplied by the random backoff exponential controlled by [csma_min_bo_exp](sl-rail-csma-config-t#csma-min-bo-exp) and [csma_max_bo_exp](sl-rail-csma-config-t#csma-max-bo-exp) to determine the overall backoff period. For random backoffs, any value above 32768 microseconds for the 'EFR Series 2' and 8192 microseconds for the 'Series 3' will be truncated for a single backoff period. Up to 255 backoff periods are supported. For fixed backoffs it can go up to 65535 microseconds.

###### cca_duration_us (heading level 7)

```
uint16_t sl_rail_csma_config_t::cca_duration_us
```

**Description:** The minimum desired CCA check duration in microseconds.

**Details:** The RSSI is sampled during this duration.

**Note**

- Depending on the radio configuration, due to hardware constraints, the actual duration may be longer. Also, if the requested duration is too large for the radio to accommodate, [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx) will fail returning [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).

###### csma_timeout_us (heading level 7)

```
sl_rail_time_t sl_rail_csma_config_t::csma_timeout_us
```

**Description:** An overall timeout, in RAIL's microsecond time base, for the operation.

**Details:** If the transmission doesn't start before this timeout expires, the transmission will fail with [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy). A value 0 means no timeout is imposed.

A configuration structure for the LBT transmit algorithm. 

One of RAIL's schemes for polite spectrum access is an implementation of a Listen-Before-Talk (LBT) algorithm, loosely based on ETSI 300 220-1. <br />
 Currently, however, it is constrained by the EFR32's CSMA-oriented hardware so is turned into an equivalent [sl_rail_csma_config_t](sl-rail-csma-config-t) configuration and passed to the CSMA engine: 

```c
if (lbt_max_bo_rand == lbt_min_bo_rand) {
  // Fixed backoff
  csma_min_bo_exp = csma_max_bo_exp = 0;
  if (lbt_min_bo_rand == 0) {
    cca_backoff_us = lbt_backoff_us;
  } else {
    cca_backoff_us = lbt_min_bo_rand * lbt_backoff_us;
  }
  cca_duration_us = lbt_duration_us;
} else {
  // Random backoff: map to random range 0 .. (lbt_max_bo_rand - lbt_min_bo_rand)
  csma_min_bo_exp = csma_max_bo_exp = ceiling(log2(lbt_max_bo_rand - lbt_min_bo_rand));
  cca_backoff_us = round((lbt_backoff_us * (lbt_max_bo_rand - lbt_min_bo_rand))
                         / (1 << csma_mi_nb_oexp));
  cca_duration_us = lbt_duration_us + (lbt_min_bo_rand * lbt_backoff_us);
}
csma_tries        = lbt_tries;
cca_threshold_dbm = lbt_threshold_dbm;
csma_timeout_us   = lbt_timeout_us;

```

###### Public Attributes

###### lbt_min_bo_rand (heading level 7)

```
uint8_t sl_rail_lbt_config_t::lbt_min_bo_rand
```

**Description:** The minimum backoff random multiplier.

###### lbt_max_bo_rand (heading level 7)

```
uint8_t sl_rail_lbt_config_t::lbt_max_bo_rand
```

**Description:** The maximum backoff random multiplier.

**Details:** It must be greater than or equal to [lbt_min_bo_rand](sl-rail-lbt-config-t#lbt-min-bo-rand). <br />
 If both backoff multipliers are identical, a non-random fixed backoff of [lbt_backoff_us](sl-rail-lbt-config-t#lbt-backoff-us) times the multiplier (minimum 1) duration results.

###### lbt_tries (heading level 7)

```
uint8_t sl_rail_lbt_config_t::lbt_tries
```

**Description:** The number of LBT iterations that can fail before reporting [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy).

**Details:** Typically ranges from 1 to [SL_RAIL_MAX_LBT_TRIES](transmit#sl-rail-max-lbt-tries); higher values are disallowed. A value 0 always transmits immediately without performing LBT, similar to calling [sl_rail_start_tx()](packet-tx#sl-rail-start-tx).

###### lbt_threshold_dbm (heading level 7)

```
int8_t sl_rail_lbt_config_t::lbt_threshold_dbm
```

**Description:** The LBT RSSI threshold, in dBm, above which the channel is considered 'busy'.

###### lbt_backoff_us (heading level 7)

```
uint16_t sl_rail_lbt_config_t::lbt_backoff_us
```

**Description:** The backoff unit period, in RAIL's microsecond time base.

**Details:** It is multiplied by the random backoff multiplier controlled by [lbt_min_bo_rand](sl-rail-lbt-config-t#lbt-min-bo-rand) and [lbt_max_bo_rand](sl-rail-lbt-config-t#lbt-max-bo-rand) to determine the overall backoff period. For random backoffs, any value above 32768 microseconds for the 'EFR Series 2' and 8192 microseconds for the 'Series 3' will be truncated for a single backoff period. Up to 255 backoff periods are supported. For fixed backoffs it can go up to 65535 microseconds.

###### lbt_duration_us (heading level 7)

```
uint16_t sl_rail_lbt_config_t::lbt_duration_us
```

**Description:** The minimum desired LBT check duration in microseconds.

**Details:** **Note**

- Depending on the radio configuration, due to hardware constraints, the actual duration may be longer. Also, if the requested duration is too large for the radio to accommodate, [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx) will fail returning [SL_RAIL_STATUS_INVALID_PARAMETER](general#sl-rail-status-invalid-parameter).

###### lbt_timeout_us (heading level 7)

```
sl_rail_time_t sl_rail_lbt_config_t::lbt_timeout_us
```

**Description:** An overall timeout, in RAIL's microsecond time base, for the operation.

**Details:** If the transmission doesn't start before this timeout expires, the transmission will fail with [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy). This is important for limiting LBT due to LBT's unbounded requirement that if the channel is busy, the next try must wait for the channel to clear. A value 0 means no timeout is imposed.

RAIL sync words and length configuration. 

###### Public Attributes

###### sync_word_bits (heading level 7)

```
uint8_t sl_rail_sync_word_config_t::sync_word_bits
```

**Description:** Sync word length in bits, between 2 and 32, inclusive.

###### sync_word_0 (heading level 7)

```
uint32_t sl_rail_sync_word_config_t::sync_word_0
```

**Description:** Sync Word 0.

**Details:** **Note**

- Only the least-significant [sync_word_bits](sl-rail-sync-word-config-t#sync-word-bits) bits are used, which are sent or received on air least-significant-bit first.

###### sync_word_1 (heading level 7)

```
uint32_t sl_rail_sync_word_config_t::sync_word_1
```

**Description:** Sync Word 1.

**Details:** **Note**

- Only the least-significant [sync_word_bits](sl-rail-sync-word-config-t#sync-word-bits) bits are used, which are sent or received on air least-significant-bit first.

A configuration structure for repeated transmits. 

**Note**

- The PA will always be ramped down and up in between transmits so there will always be some minimum delay between transmits depending on the ramp time configuration.

###### Public Attributes

###### iterations (heading level 7)

```
uint16_t sl_rail_tx_repeat_config_t::iterations
```

**Description:** The number of repeated transmits to run.

**Details:** A total of (iterations + 1) transmits will go on-air in the absence of errors.

###### repeat_options (heading level 7)

```
sl_rail_tx_repeat_options_t sl_rail_tx_repeat_config_t::repeat_options
```

**Description:** Repeat option(s) to apply.

###### delay_us (heading level 7)

```
sl_rail_transition_time_t sl_rail_tx_repeat_config_t::delay_us
```

**Description:** When [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop) is not set, specifies the delay time between each repeated transmit.

**Details:** Specify [SL_RAIL_TRANSITION_TIME_KEEP](state-transitions#sl-rail-transition-time-keep) to use the current [sl_rail_state_timing_t::tx_to_tx](sl-rail-state-timing-t#tx-to-tx) transition time setting. When using [SL_RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#sl-rail-tx-repeat-option-start-to-start) the delay must be long enough to cover the prior transmit's time.

###### channel_hopping (heading level 7)

```
sl_rail_tx_channel_hopping_config_t sl_rail_tx_repeat_config_t::channel_hopping
```

**Description:** When [SL_RAIL_TX_REPEAT_OPTION_HOP](transmit#sl-rail-tx-repeat-option-hop) is set, this specifies the channel hopping configuration to use when hopping between repeated transmits.

**Details:** Per-hop delays are configured within each [sl_rail_tx_channel_hopping_config_entry_t::delay_us](sl-rail-tx-channel-hopping-config-entry-t#delay-us) rather than this union's delay field. When using [SL_RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#sl-rail-tx-repeat-option-start-to-start) the hop delay must be long enough to cover the prior transmit's time.

###### delay_or_hop (heading level 7)

```
union sl_rail_tx_repeat_config_t::@5 sl_rail_tx_repeat_config_t::delay_or_hop
```

**Description:** Per-repeat delay or hopping configuration, depending on repeat_options.

##### Packet Transmit

APIs which initiate a packet transmission in RAIL. 

When using any of these functions, the data to be transmitted must have been previously written to the transmit FIFO via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) and/or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo).

When using any of these functions, the data to be transmitted must have been previously written to the transmit FIFO via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) and/or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). 

###### Functions

###### RAIL_StartTx (heading level 7)

`RAIL_Status_t RAIL_StartTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Start a transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|Define the channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

The transmit process will begin immediately or as soon as a packet being received has finished. The data to be transmitted must have been previously established via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) and/or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo).

Returns an error if a previous transmit is still in progress. If changing channels, any ongoing packet reception is aborted.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_tx()](packet-tx#sl-rail-start-tx). 

###### RAIL_StartScheduledTx (heading level 7)

`RAIL_Status_t RAIL_StartScheduledTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_ScheduleTxConfig_t *config, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Schedule sending a packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *|[in]|config|A pointer to the [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) structure indicating when and how the transmit should occur.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

The transmit process will begin at the scheduled time. The data to be transmitted must have been previously established via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) and/or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo). The time (in microseconds) and whether that time is absolute or relative is specified using the [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) structure. What to do if a scheduled transmit fires in the middle of receiving a packet is also specified in this structure.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and will abort any ongoing packet reception.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_scheduled_tx()](packet-tx#sl-rail-start-scheduled-tx). 

###### RAIL_StartCcaCsmaTx (heading level 7)

`RAIL_Status_t RAIL_StartCcaCsmaTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_CsmaConfig_t *csmaConfig, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Start a transmit using CSMA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_CsmaConfig_t](rail-csma-config-t) *|[in]|csmaConfig|A pointer to the [RAIL_CsmaConfig_t](rail-csma-config-t) structure describing the CSMA parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

Perform the Carrier Sense Multiple Access (CSMA) algorithm, and if the channel is deemed clear (RSSI below the specified threshold), it will commence transmission. The data to be transmitted must have been previously established via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) and/or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo). Packets can be received during CSMA backoff periods if receive is active throughout the CSMA process. This will happen either by starting the CSMA process while receive is already active, or if the [RAIL_CsmaConfig_t::ccaBackoff](rail-csma-config-t#cca-backoff) time is less than the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) time. If the [RAIL_CsmaConfig_t::ccaBackoff](rail-csma-config-t#cca-backoff) time is greater than the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) time, receive will only be active during CSMA's clear channel assessments.

If the CSMA algorithm deems the channel busy, the [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) occurs with [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy), and the contents of the transmit FIFO remain intact.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx). 

###### RAIL_StartCcaLbtTx (heading level 7)

`RAIL_Status_t RAIL_StartCcaLbtTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_LbtConfig_t *lbtConfig, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Start a transmit using LBT.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_LbtConfig_t](rail-lbt-config-t) *|[in]|lbtConfig|A pointer to the [RAIL_LbtConfig_t](rail-lbt-config-t) structure describing the LBT parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

Performs the Listen Before Talk (LBT) algorithm, and if the channel is deemed clear (RSSI below the specified threshold), it will commence transmission. The data to be transmitted must have been previously established via [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) and/or [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo). Packets can be received during LBT backoff periods if receive is active throughout the LBT process. This will happen either by starting the LBT process while receive is already active, or if the [RAIL_LbtConfig_t::lbtBackoff](rail-lbt-config-t#lbt-backoff) time is less than the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) time. If the [RAIL_LbtConfig_t::lbtBackoff](rail-lbt-config-t#lbt-backoff) time is greater than the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) time, receive will only be active during LBT's clear channel assessments.

If the LBT algorithm deems the channel busy, the [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) occurs with [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy), and the contents of the transmit FIFO remain intact.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx). 

###### RAIL_StartScheduledCcaCsmaTx (heading level 7)

`RAIL_Status_t RAIL_StartScheduledCcaCsmaTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_ScheduleTxConfig_t *scheduleTxConfig, const RAIL_CsmaConfig_t *csmaConfig, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Schedule a transmit using CSMA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *|[in]|scheduleTxConfig|A pointer to the [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) structure indicating when the CSMA operation should commence.|
|const [RAIL_CsmaConfig_t](rail-csma-config-t) *|[in]|csmaConfig|A pointer to the [RAIL_CsmaConfig_t](rail-csma-config-t) structure describing the CSMA parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

Internally, the RAIL library needs a PRS channel for this feature. It will allocate an available PRS channel to use and hold onto that channel for future use. If no PRS channel is available, the function returns with [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

This is a scheduled variation of [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx); refer to that function for CSMA details.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx). 

###### RAIL_StartScheduledCcaLbtTx (heading level 7)

`RAIL_Status_t RAIL_StartScheduledCcaLbtTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_ScheduleTxConfig_t *scheduleTxConfig, const RAIL_LbtConfig_t *lbtConfig, const RAIL_SchedulerInfo_t *schedulerInfo)`

**Description:** Schedule a transmit using LBT.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[RAIL_TxOptions_t](transmit#rail-tx-options-t)|[in]|options|TX options to be applied to this transmit only.|
|const [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) *|[in]|scheduleTxConfig|A pointer to the [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t) structure indicating when the LBT operation should commence.|
|const [RAIL_LbtConfig_t](rail-lbt-config-t) *|[in]|lbtConfig|A pointer to the [RAIL_LbtConfig_t](rail-lbt-config-t) structure describing the LBT parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [RAIL_SchedulerInfo_t](rail-scheduler-info-t) *|[in]|schedulerInfo|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [RAIL_Config_t::eventsCallback()](rail-config-t#events-callback) with the appropriate [RAIL_Events_t](events#rail-events-t).

Internally, the RAIL library needs a PRS channel for this feature. It will allocate an available PRS channel to use and hold onto that channel for future use. If no PRS channel is available, the function returns with [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call).

This is a scheduled variation of [RAIL_StartCcaLbtTx](packet-tx#rail-start-cca-lbt-tx); refer to that function for LBT details.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details.

**Deprecated**RAIL 2.x synonym of [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx). 

###### RAIL_IsNextCcaNow (heading level 7)

`bool RAIL_IsNextCcaNow(RAIL_Handle_t railHandle)`

**Description:** Check whether next CCA is imminent.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

Valid only when handing [RAIL_EVENT_TX_CCA_RETRY](events#rail-event-tx-cca-retry). Typically used for coexistence signalling.

**Returns**

- true if the next CCA is imminent (zero backoff).

**Deprecated**RAIL 2.x synonym of [sl_rail_is_next_cca_now()](packet-tx#sl-rail-is-next-cca-now). 

###### sl_rail_start_tx (heading level 7)

`sl_rail_status_t sl_rail_start_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Start a transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|Define the channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

The transmit process will begin immediately or as soon as a packet being received has finished. The data to be transmitted must have been previously established via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) and/or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo).

Returns an error if a previous transmit is still in progress. If changing channels, any ongoing packet reception is aborted.

Returns an error if no receive FIFO or Packet Queue have been configured and either of the TX state transitions are to [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx).

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_start_scheduled_tx (heading level 7)

`sl_rail_status_t sl_rail_start_scheduled_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Schedule sending a packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) *|[in]|p_scheduled_tx_config|A pointer to the [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) structure indicating when and how the transmit should occur.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

The transmit process will begin at the scheduled time. The data to be transmitted must have been previously established via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) and/or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). The time (in microseconds) and whether that time is absolute or relative is specified using the [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) structure. What to do if a scheduled transmit fires in the middle of receiving a packet is also specified in this structure.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and will abort any ongoing packet reception.

Returns an error if no receive FIFO or Packet Queue have been configured and either of the TX state transitions are to [SL_RAIL_RF_STATE_RX](state-transitions#sl-rail-rf-state-rx).

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_start_cca_csma_tx (heading level 7)

`sl_rail_status_t sl_rail_start_cca_csma_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_csma_config_t *p_csma_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Start a transmit using CSMA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_csma_config_t](sl-rail-csma-config-t) *|[in]|p_csma_config|A pointer to the [sl_rail_csma_config_t](sl-rail-csma-config-t) structure describing the CSMA parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

Perform the Carrier Sense Multiple Access (CSMA) algorithm, and if the channel is deemed clear (RSSI below the specified threshold), it will commence transmission. The data to be transmitted must have been previously established via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) and/or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). Packets can be received during CSMA backoff periods if receive is active throughout the CSMA process. This will happen either by starting the CSMA process while receive is already active, or if the [sl_rail_csma_config_t::cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us) is less than [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx) time. If the [sl_rail_csma_config_t::cca_backoff_us](sl-rail-csma-config-t#cca-backoff-us) time is greater than the [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx) time, receive will only be active during CSMA's clear channel assessments.

If the CSMA algorithm deems the channel busy, the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) occurs with [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy), and the contents of the transmit FIFO remain intact.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress, or if no receive FIFO or Packet Queue have been configured.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_start_cca_lbt_tx (heading level 7)

`sl_rail_status_t sl_rail_start_cca_lbt_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_lbt_config_t *p_lbt_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Start a transmit using LBT.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_lbt_config_t](sl-rail-lbt-config-t) *|[in]|p_lbt_config|A pointer to the [sl_rail_lbt_config_t](sl-rail-lbt-config-t) structure describing the LBT parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

Performs the Listen Before Talk (LBT) algorithm, and if the channel is deemed clear (RSSI below the specified threshold), it will commence transmission. The data to be transmitted must have been previously established via [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) and/or [sl_rail_write_tx_fifo()](data-management#sl-rail-write-tx-fifo). Packets can be received during LBT backoff periods if receive is active throughout the LBT process. This will happen either by starting the LBT process while receive is already active, or if the [sl_rail_lbt_config_t::lbt_backoff_us](sl-rail-lbt-config-t#lbt-backoff-us) is less than [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx) time. If the [sl_rail_lbt_config_t::lbt_backoff_us](sl-rail-lbt-config-t#lbt-backoff-us) time is greater than the [sl_rail_state_timing_t::idle_to_rx](sl-rail-state-timing-t#idle-to-rx) time, receive will only be active during LBT's clear channel assessments.

If the LBT algorithm deems the channel busy, the [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) occurs with [SL_RAIL_EVENT_TX_CHANNEL_BUSY](events#sl-rail-event-tx-channel-busy), and the contents of the transmit FIFO remain intact.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress, or if no receive FIFO or Packet Queue have been configured.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_start_scheduled_cca_csma_tx (heading level 7)

`sl_rail_status_t sl_rail_start_scheduled_cca_csma_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_csma_config_t *p_csma_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Schedule a transmit using CSMA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) *|[in]|p_scheduled_tx_config|A pointer to the [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) structure indicating when the CSMA operation should commence.|
|const [sl_rail_csma_config_t](sl-rail-csma-config-t) *|[in]|p_csma_config|A pointer to the [sl_rail_csma_config_t](sl-rail-csma-config-t) structure describing the CSMA parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

Internally, the RAIL library needs a PRS channel for this feature. It will allocate an available PRS channel to use and hold onto that channel for future use. If no PRS channel is available, the function returns with [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

This is a scheduled variation of [sl_rail_start_cca_csma_tx()](packet-tx#sl-rail-start-cca-csma-tx); refer to that function for CSMA details.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress, or if no receive FIFO or Packet Queue have been configured.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_start_scheduled_cca_lbt_tx (heading level 7)

`sl_rail_status_t sl_rail_start_scheduled_cca_lbt_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_lbt_config_t *p_lbt_config, const sl_rail_scheduler_info_t *p_scheduler_info)`

**Description:** Schedule a transmit using LBT.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|channel|The channel to transmit on.|
|[sl_rail_tx_options_t](transmit#sl-rail-tx-options-t)|[in]|tx_options|TX options to be applied to this transmit only.|
|const [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) *|[in]|p_scheduled_tx_config|A pointer to the [sl_rail_scheduled_tx_config_t](sl-rail-scheduled-tx-config-t) structure indicating when the LBT operation should commence.|
|const [sl_rail_lbt_config_t](sl-rail-lbt-config-t) *|[in]|p_lbt_config|A pointer to the [sl_rail_lbt_config_t](sl-rail-lbt-config-t) structure describing the LBT parameters to use for this transmit. <br /><br/> In multiprotocol this must point to global or heap storage that remains valid after the API returns until the transmit is actually started.|
|const [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) *|[in]|p_scheduler_info|A pointer to information to allow the radio scheduler to place this transmit appropriately. This is only used in multiprotocol version of RAIL and may be set to NULL in all other versions.|

**Returns**

- Status code indicating success of the function call. If successfully initiated, a transmit completion or failure will be reported by a later [sl_rail_config_t::events_callback()](sl-rail-config-t#events-callback) with the appropriate [sl_rail_events_t](events#sl-rail-events-t).

Internally, the RAIL library needs a PRS channel for this feature. It will allocate an available PRS channel to use and hold onto that channel for future use. If no PRS channel is available, the function returns with [SL_RAIL_STATUS_INVALID_CALL](general#sl-rail-status-invalid-call).

This is a scheduled variation of [sl_rail_start_cca_lbt_tx()](packet-tx#sl-rail-start-cca-lbt-tx); refer to that function for LBT details.

Returns an error if a previous transmit is still in progress. If changing channels, the channel is changed immediately and any ongoing packet reception is aborted.

Returns an error if a scheduled RX is still in progress, or if no receive FIFO or Packet Queue have been configured.

In multiprotocol, ensure that the radio is properly yielded after this operation completes. See [Yielding the Radio](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-yield) for more details. 

###### sl_rail_is_next_cca_now (heading level 7)

`bool sl_rail_is_next_cca_now(sl_rail_handle_t rail_handle)`

**Description:** Check whether next CCA is imminent.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

Valid only when handing [SL_RAIL_EVENT_TX_CCA_RETRY](events#sl-rail-event-tx-cca-retry). Typically used for coexistence signalling.

**Returns**

- true if the next CCA is imminent (zero backoff).

##### Power Amplifier (PA)

APIs for interacting with one of the on chip PAs. 

These APIs let you configure the on-chip PA to get the appropriate output power.

These are the function types: 1) Configuration functions: These functions set and get configuration for the PA. In this case, "configuration" refers to a) indicating which PA to use, b) the voltage supplied by your board to the PA, and c) the ramp time over which to ramp the PA up to its full power. 2) Power-setting functions: These functions consume the actual values written to the PA registers and write them appropriately. These values are referred to as "(raw) power levels". The range of acceptable values for these functions depends on which PA is currently active. The higher the power level set, the higher the dBm power output by the radio. However, the mapping between dBm and these power levels can vary greatly between modules/boards. 3) Conversion functions: These functions convert between the "power levels" discussed previously and the dBm values output by the radio. Continue reading for more information about unit conversion.

The accuracy of the radio output power is application-specific. For some protocols or channels, the protocol itself or legal limitations require applications to know exactly what power they're transmitting at, in dBm. Other applications do not have these restrictions, and users determine power level(s) that fit their criteria for the trade-off between radio range and power savings, regardless of what dBm power that maps to.

[RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) and [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw), which convert between the dBm power and the raw power levels, provide a solution that fits all these applications. The levels of customization are outlined below: 1) No customization needed: for a given dBm value, the result of [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) provides an appropriate raw power level that, when written to the registers via [RAIL_SetTxPower()](pa#rail-set-tx-power), causes the radio to output at that dBm power. In this case, no action is needed by the user, the WEAK versions of the conversion functions can be used and the default include paths in [pa_conversions_efr32.h](pa-conversions-efr32-h) can be used. 2) The mapping of power level to dBm is not ideal, but the level of precision is sufficient: In pa_conversions_efr32.c, the WEAK versions of the conversion functions work by using 8-segment piecewise linear curves to convert between dBm and power levels for PA's with hundreds of power levels and simple mapping tables for use with PA's with only a few levels. If this method is sufficiently precise, but the mapping between power levels and dBm is incorrect, copy pa_curves_efr32.h into a new file, updating the segments to form a better fit (_DCDC_CURVES or _VBAT_CURVES defines) and then add the RAIL_PA_CURVES define to your build with the path to the new file. 3) A different level of precision is needed and the fit is bad: If the piecewise-linear line segment fit is not appropriate for your solution, the functions in pa_conversions_efr32.c can be totally rewritten, as long as [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) and [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) have the same signatures. It is completely acceptable to re-write these in a way that makes the pa_curves_efr32.h and [pa_curve_types_efr32.h](pa-curve-types-efr32-h) files referenced in [pa_conversions_efr32.h](pa-conversions-efr32-h) unnecessary. Those files are needed solely for the provided conversion methods. 4) dBm values are not necessary: If the application does not require dBm values at all, overwrite [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) and [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) with smaller functions (i.e., return 0 or whatever was input). These functions are called from within the RAIL library, so they can never be deadstripped, but making them as small as possible is the best way to reduce code size. From there, call [RAIL_SetTxPower()](pa#rail-set-tx-power), without converting from a dBm value. To stop the library from coercing the power based on channels, overwrite [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) to always return 0 and overwrite [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) to always return 255.

The following is example code that shows how to initialize your PA 

```c
#include "pa_conversions_efr32.h"

// A macro RAIL_TX_POWER_CURVES_CONFIG is used as the curve
// structures used by the provided conversion functions.
RAIL_TxPowerCurvesConfigAlt_t tx_power_curves_config = RAIL_TX_POWER_CURVES_CONFIG;
// Saves those curves
// to be referenced when the conversion functions are called.
RAIL_InitTxPowerCurves(rail_handle, &tx_power_curves_config);

// Declares the structure used to configure the PA.
RAIL_TxPowerConfig_t txPowerConfig = {
  .mode     = RAIL_TX_POWER_MODE_2P4_HP,
  .voltage  = 3300,
  .rampTime = 10,
};

// Initializes the PA. Here, it is assumed that 'railHandle' is a valid RAIL_Handle_t
// that has already been initialized.
RAIL_ConfigTxPower(railHandle, &txPowerConfig);

// Picks a dBm power to use: 100 deci-dBm = 10 dBm. See docs on RAIL_TxPower_t.
RAIL_TxPower_t power = 100;

// Gets the config written by RAIL_ConfigTxPower() to confirm what was actually set.
RAIL_GetTxPowerConfig(railHandle, &txPowerConfig);

// RAIL_ConvertDbmToRaw() is the default weak version,
// or the customer version, if overwritten.
RAIL_TxPowerLevel_t powerLevel
  = RAIL_ConvertDbmToRaw(railHandle, txPowerConfig.mode, power);

// Writes the result of the conversion to the PA power registers in terms
// of raw power levels.
RAIL_SetTxPower(railHandle, powerLevel);

```

**Note**

- All lines following "RAIL_TxPower_t power = 100;" can be replaced with the provided utility function, [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm). However, the full example here was provided for clarity. See the documentation on [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm) for more details.

These APIs let you configure the on-chip PA to get the desired deci-dBm output power. Applications should only interact with RAIL using dBm power units (or fraction thereof). The RAIL library requires an implementation of [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) for performing the conversion of dBm to a chip-supported PA ([sl_rail_tx_power_mode_t](pa#sl-rail-tx-power-mode-t)) and raw power level.

Refer to the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin for an implementation of that callback and information on how PA conversion tables/curves are established to support such conversion. 

###### Modules

[RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t)

[RAIL_TxPowerConfig_t](rail-tx-power-config-t)

[RAIL_PaAutoModeConfigEntry_t](rail-pa-auto-mode-config-entry-t)

[sl_rail_nvm_pa_curve_t](sl-rail-nvm-pa-curve-t)

[sl_rail_nvm_pa_table_t](sl-rail-nvm-pa-table-t)

[sl_rail_nvm_pa_descriptor_t](sl-rail-nvm-pa-descriptor-t)

[sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t)

[sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t)

[sl_rail_tx_power_config_t](sl-rail-tx-power-config-t)

[RAIL_TxPowerCurvesConfigAlt](rail-tx-power-curves-config-alt)

[sl_rail_tx_power_table_config](sl-rail-tx-power-table-config)

[EFR32xG2x](pa-efr32-xg2-x)

[PA Curve Conversions](pa-curve-conversions)

[PA Power Conversions](pa-power-conversions)

[SIxx3xx](pa-sixx3-xx)

###### Enumerations

###### RAIL_TxPowerMode_t (heading level 7)

```
enum RAIL_TxPowerMode_t {
    RAIL_TX_POWER_MODE_2P4GIG_HP = 0U
    RAIL_TX_POWER_MODE_2P4_HP = RAIL_TX_POWER_MODE_2P4GIG_HP
    RAIL_TX_POWER_MODE_2P4GIG_MP = 1U
    RAIL_TX_POWER_MODE_2P4_MP = RAIL_TX_POWER_MODE_2P4GIG_MP
    RAIL_TX_POWER_MODE_2P4GIG_LP = 2U
    RAIL_TX_POWER_MODE_2P4_LP = RAIL_TX_POWER_MODE_2P4GIG_LP
    RAIL_TX_POWER_MODE_2P4GIG_LLP = 3U
    RAIL_TX_POWER_MODE_2P4GIG_HIGHEST = 4U
    RAIL_TX_POWER_MODE_2P4_HIGHEST = RAIL_TX_POWER_MODE_2P4GIG_HIGHEST
    RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE = 5U
    RAIL_TX_POWER_MODE_SUBGIG_HP = 6U
    RAIL_TX_POWER_MODE_SUBGIG = RAIL_TX_POWER_MODE_SUBGIG_HP
    RAIL_TX_POWER_MODE_SUBGIG_MP = 7U
    RAIL_TX_POWER_MODE_SUBGIG_LP = 8U
    RAIL_TX_POWER_MODE_SUBGIG_LLP = 9U
    RAIL_TX_POWER_MODE_SUBGIG_HIGHEST = 10U
    RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE = 11U
    RAIL_TX_POWER_MODE_OFDM_PA = RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE
    RAIL_TX_POWER_MODE_NONE
}
```

**Description:**

An enumeration of the EFR32 power modes.

**Details:**

The power modes on the EFR32 correspond to the different on-chip PAs that are available. For more information about the power and performance characteristics of a given amplifier, see the data sheet.

**Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_mode_t](pa#sl-rail-tx-power-mode-t).

**Enumerator:**

|   |   |
|---|---|
|RAIL_TX_POWER_MODE_2P4GIG_HP|High-power 2.4 GHz amplifier EFR32xG21: up to 20 dBm, raw values: 1-180 EFR32xG22: up to 6 dBm, raw values: 1-128 EFR32xG24: up to 20 dBm, raw values: 0-180, or up to 10 dBm, raw values: 0-90 EFR32xG26: same as EFR32xG24 EFR32xG27: up to 6 dBm, raw values: 1-128 EFR32xG28: up to 10 dBm, raw values: 0-240 Not supported on other platforms.|
|RAIL_TX_POWER_MODE_2P4_HP|**Deprecated**Please use [RAIL_TX_POWER_MODE_2P4GIG_HP](pa#rail-tx-power-mode-2-p4-gig-hp) instead.|
|RAIL_TX_POWER_MODE_2P4GIG_MP|Mid-power 2.4 GHz amplifier EFR32xG21: up to 10 dBm, raw values: 1-90 Not supported on other platforms.|
|RAIL_TX_POWER_MODE_2P4_MP|**Deprecated**Please use [RAIL_TX_POWER_MODE_2P4GIG_MP](pa#rail-tx-power-mode-2-p4-gig-mp) instead.|
|RAIL_TX_POWER_MODE_2P4GIG_LP|Low-power 2.4 GHz amplifier EFR32xG21: up to 0 dBm, raw values: 1-64 EFR32xG22: up to 0 dBm, raw values: 1-16 EFR32xG24: up to 0 dBm, raw values: 1-16 EFR32xG26: same as EFR32xG24 EFR32xG27: up to 0 dBm, raw values: 1-16 Not supported on other platforms.|
|RAIL_TX_POWER_MODE_2P4_LP|**Deprecated**Please use [RAIL_TX_POWER_MODE_2P4GIG_LP](pa#rail-tx-power-mode-2-p4-gig-lp) instead.|
|RAIL_TX_POWER_MODE_2P4GIG_LLP|Low-Low-power 2.4 GHz amplifier Not currently supported on any EFR32 platform.|
|RAIL_TX_POWER_MODE_2P4GIG_HIGHEST|Select the highest 2.4 GHz power PA available on the current chip.|
|RAIL_TX_POWER_MODE_2P4_HIGHEST|**Deprecated**Please use [RAIL_TX_POWER_MODE_2P4GIG_HIGHEST](pa#rail-tx-power-mode-2-p4-gig-highest) instead.|
|RAIL_TX_POWER_MODE_SUBGIG_POWERSETTING_TABLE|PA for all Sub-GHz dBm values in range, using [RAIL_PaPowerSetting_t](pa#rail-pa-power-setting-t) table.|
|RAIL_TX_POWER_MODE_SUBGIG_HP|High-power Sub-GHz amplifier (Class D mode) Supported on EFR32xG23 and EFR32xG28.|
|RAIL_TX_POWER_MODE_SUBGIG|**Deprecated**Please use [RAIL_TX_POWER_MODE_SUBGIG_HP](pa#rail-tx-power-mode-subgig-hp) instead.|
|RAIL_TX_POWER_MODE_SUBGIG_MP|Mid-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|RAIL_TX_POWER_MODE_SUBGIG_LP|Low-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|RAIL_TX_POWER_MODE_SUBGIG_LLP|Low-Low-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|RAIL_TX_POWER_MODE_SUBGIG_HIGHEST|Select the highest Sub-GHz power PA available on the current chip.|
|RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE|PA for all OFDM Sub-GHz dBm values in range, using [RAIL_PaPowerSetting_t](pa#rail-pa-power-setting-t) table.|
|RAIL_TX_POWER_MODE_OFDM_PA|**Deprecated**Please use [RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE](pa#rail-tx-power-mode-ofdm-pa-powersetting-table) instead.|
|RAIL_TX_POWER_MODE_NONE|Invalid amplifier Selection.|

###### RAIL_PaBand_t (heading level 7)

```
enum RAIL_PaBand_t {
    RAIL_PA_BAND_2P4GIG
    RAIL_PA_BAND_SUBGIG
    RAIL_PA_BAND_COUNT
}
```

**Description:**

Enum used to specify the band for a PA.

**Details:**

**Deprecated**This RAIL 2.x enum has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

**Enumerator:**

|   |   |
|---|---|
|RAIL_PA_BAND_2P4GIG|Indicates a 2.4 GHz band PA.|
|RAIL_PA_BAND_SUBGIG|Indicates a Sub-GHz band PA.|
|RAIL_PA_BAND_COUNT|A count of the choices in this enumeration.|

###### sl_rail_tx_pa_mode_t (heading level 7)

```
enum sl_rail_tx_pa_mode_t {
    SL_RAIL_TX_PA_MODE_2P4_GHZ = 0U
    SL_RAIL_TX_PA_MODE_SUB_GHZ = 1U
    SL_RAIL_TX_PA_MODE_SUB_GHZ_OFDM = 2U
    SL_RAIL_TX_PA_MODE_INVALID = 4U
}
```

**Description:**

Suitable type for the supported PA modes.

**Details:**

The PA modes correspond to the different on-chip PAs that are physically available. For more information about the power and performance characteristics of a given amplifier, see the data sheet.

**Note**

- Some platforms support only a subset of these PAs.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TX_PA_MODE_2P4_GHZ|PA for 2.4 GHz.|
|SL_RAIL_TX_PA_MODE_SUB_GHZ|PA for Sub-GHz.|
|SL_RAIL_TX_PA_MODE_SUB_GHZ_OFDM|PA for Sub-GHz OFDM.|
|SL_RAIL_TX_PA_MODE_INVALID|An invalid Power Amplifier (PA) mode in the RAIL TX configuration.|

###### sl_rail_tx_power_mode_t (heading level 7)

```
enum sl_rail_tx_power_mode_t {
    SL_RAIL_TX_POWER_MODE_2P4_GHZ_HP = 0U
    SL_RAIL_TX_POWER_MODE_2P4_GHZ_MP = 1U
    SL_RAIL_TX_POWER_MODE_2P4_GHZ_LP = 2U
    SL_RAIL_TX_POWER_MODE_2P4_GHZ_LLP = 3U
    SL_RAIL_TX_POWER_MODE_2P4_GHZ_HIGHEST = 4U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_POWERSETTING_TABLE = 5U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_HP = 6U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_MP = 7U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_LP = 8U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_LLP = 9U
    SL_RAIL_TX_POWER_MODE_SUB_GHZ_HIGHEST = 10U
    SL_RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE = 11U
    SL_RAIL_TX_POWER_MODE_NONE
}
```

**Description:**

An enumeration of the power modes.

**Details:**

The power modes correspond to the different on-chip PAs that are available. For more information about the power and performance characteristics of a given amplifier, see the data sheet.

**Enumerator:**

|   |   |
|---|---|
|SL_RAIL_TX_POWER_MODE_2P4_GHZ_HP|High-power 2.4 GHz amplifier EFR32xG21: up to 20 dBm, raw values: 1-180 EFR32xG22: up to 6 dBm, raw values: 1-128 EFR32xG24: up to 20 dBm, raw values: 0-180, or up to 10 dBm, raw values: 0-90 EFR32xG26: same as EFR32xG24 EFR32xG27: up to 6 dBm, raw values: 1-128 EFR32xG28: up to 10 dBm, raw values: 0-240 Not supported on other platforms.|
|SL_RAIL_TX_POWER_MODE_2P4_GHZ_MP|Mid-power 2.4 GHz amplifier EFR32xG21: up to 10 dBm, raw values: 1-90 Not supported on other platforms.|
|SL_RAIL_TX_POWER_MODE_2P4_GHZ_LP|Low-power 2.4 GHz amplifier EFR32xG21: up to 0 dBm, raw values: 1-64 EFR32xG22: up to 0 dBm, raw values: 1-16 EFR32xG24: up to 0 dBm, raw values: 1-16 EFR32xG26: same as EFR32xG24 EFR32xG27: up to 0 dBm, raw values: 1-16 Not supported on other platforms.|
|SL_RAIL_TX_POWER_MODE_2P4_GHZ_LLP|Low-Low-power 2.4 GHz amplifier Not currently supported on any EFR32 platform.|
|SL_RAIL_TX_POWER_MODE_2P4_GHZ_HIGHEST|Select the highest 2.4 GHz power PA available on the current chip.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_POWERSETTING_TABLE|PA for all Sub-GHz dBm values in range, using [sl_rail_pa_power_setting_t](pa#sl-rail-pa-power-setting-t) table.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_HP|High-power Sub-GHz amplifier (Class D mode) Supported on EFR32xG23 and EFR32xG28.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_MP|Mid-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_LP|Low-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_LLP|Low-Low-power Sub-GHz amplifier Supported only on EFR32xG23 and EFR32xG28.|
|SL_RAIL_TX_POWER_MODE_SUB_GHZ_HIGHEST|Select the highest Sub-GHz power PA available on the current chip.|
|SL_RAIL_TX_POWER_MODE_OFDM_PA_POWERSETTING_TABLE|PA for all OFDM Sub-GHz dBm values in range, using [sl_rail_pa_power_setting_t](pa#sl-rail-pa-power-setting-t) table.|
|SL_RAIL_TX_POWER_MODE_NONE|Invalid amplifier Selection.|

###### Typedefs

###### RAIL_TxPower_t (heading level 7)

`typedef int16_t RAIL_TxPower_t`

**Description:**

The transmit power in deci-dBm units (e.g., 4.5 dBm -> 45 deci-dBm).

**Details:**

These values are used by the conversion functions to convert a [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) to deci-dBm for the application consumption. On EFR32, they can range from [RAIL_TX_POWER_MIN](pa#rail-tx-power-min) to [RAIL_TX_POWER_MAX](pa#rail-tx-power-max).

**Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).

###### RAIL_TxPowerLevel_t (heading level 7)

`typedef uint8_t RAIL_TxPowerLevel_t`

**Description:**

Raw power levels used directly by [RAIL_GetTxPower()](pa#rail-get-tx-power) and [RAIL_SetTxPower()](pa#rail-set-tx-power) where a higher numerical value corresponds to a higher output power.

**Details:**

These are referred to as 'raw (values/units)'. On EFR32, they can range from one of [RAIL_TX_POWER_LEVEL_2P4_LP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-lp-min), [RAIL_TX_POWER_LEVEL_2P4_HP_MIN](pa-efr32-xg2-x#rail-tx-power-level-2-p4-hp-min), or [RAIL_TX_POWER_LEVEL_SUBGIG_HP_MIN](pa-efr32-xg2-x#rail-tx-power-level-subgig-hp-min) to one of [RAIL_TX_POWER_LEVEL_2P4_LP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-lp-max), [RAIL_TX_POWER_LEVEL_2P4_HP_MAX](pa-efr32-xg2-x#rail-tx-power-level-2-p4-hp-max), and [RAIL_TX_POWER_LEVEL_SUBGIG_HP_MAX](pa-efr32-xg2-x#rail-tx-power-level-subgig-hp-max), respectively, depending on the selected [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t).

**Deprecated**This RAIL 2.x tpye has been eliminated in RAIL 3, temporarily a synonym of sli_rail_tx_power_level_t.

###### RAIL_PaPowerSetting_t (heading level 7)

`typedef uint32_t RAIL_PaPowerSetting_t`

**Description:**

PA power setting used directly by [RAIL_GetPaPowerSetting()](pa#rail-get-pa-power-setting) and [RAIL_SetPaPowerSetting()](pa#rail-set-pa-power-setting) which is decoded to the actual hardware register value(s).

**Details:**

**Deprecated**RAIL 2.x synonym for [sl_rail_pa_power_setting_t](pa#sl-rail-pa-power-setting-t).

###### sl_rail_tx_power_t (heading level 7)

`typedef int16_t sl_rail_tx_power_t`

**Description:**

The transmit power in deci-dBm units (e.g., 4.5 dBm -> 45 deci-dBm).

**Details:**

On EFR32 they can range from [SL_RAIL_TX_POWER_MIN](pa#sl-rail-tx-power-min) to [SL_RAIL_TX_POWER_MAX](pa#sl-rail-tx-power-max).

###### sl_rail_pa_power_setting_t (heading level 7)

`typedef uint32_t sl_rail_pa_power_setting_t`

**Description:**

PA power setting type used directly by the [PA Power Conversions](pa-power-conversions) component which is decoded to the actual hardware register value(s).

###### Variables

###### RAIL_PaAutoModeConfig (heading level 7)

```
const RAIL_PaAutoModeConfigEntry_t* RAIL_PaAutoModeConfig
```

**Description:** The actual PA auto mode configuration structure used by the auto mode plugin to control output power.

**Details:** **Deprecated**This RAIL 2.x variable has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

###### Functions

###### RAIL_ConfigTxPower (heading level 7)

`RAIL_Status_t RAIL_ConfigTxPower(RAIL_Handle_t railHandle, const RAIL_TxPowerConfig_t *config)`

**Description:** Initialize TX power settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_TxPowerConfig_t](rail-tx-power-config-t) *|[in]|config|A pointer to a power config with the desired initial settings for the TX amplifier.|

**Returns**

- Status code indicating success of the function call.

These settings include the selection between the multiple TX amplifiers, voltage supplied to the TX power amplifier, and ramp times. This must be called before any transmit occurs or [RAIL_SetTxPower()](pa#rail-set-tx-power) is called. While this function should always be called during initialization, it can also be called any time if these settings need to change to adapt to a different application/protocol. This API also resets TX power to [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid), so [RAIL_SetTxPower()](pa#rail-set-tx-power) must be called afterwards.

At times, certain combinations of configurations cannot be achieved. This API attempts to get as close as possible to the requested settings. The following "RAIL_GetTxPower..." API can be used to determine what values were set. A change in [RAIL_TxPowerConfig_t::rampTime](rail-tx-power-config-t#ramp-time) may affect the minimum timings that can be achieved in [RAIL_StateTiming_t::idleToTx](rail-state-timing-t#idle-to-tx) and [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx). Call [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing) again to check whether these times have changed.

**Deprecated**RAIL 2.x synonym of [sl_rail_config_tx_power()](pa#sl-rail-config-tx-power). 

###### RAIL_GetTxPowerConfig (heading level 7)

`RAIL_Status_t RAIL_GetTxPowerConfig(RAIL_Handle_t railHandle, RAIL_TxPowerConfig_t *config)`

**Description:** Get the TX power settings currently used in the amplifier.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerConfig_t](rail-tx-power-config-t) *|[out]|config|A non-NULL pointer to a [RAIL_TxPowerConfig_t](rail-tx-power-config-t) structure filled in by the function.|

**Returns**

- Status code indicating success of the function call.

Note that this API does not return the current TX power, which is separately managed by the [RAIL_GetTxPower()](pa#rail-get-tx-power) / [RAIL_SetTxPower()](pa#rail-set-tx-power) APIs. Use this API to determine which values were set as a result of [RAIL_ConfigTxPower()](pa#rail-config-tx-power).

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_tx_power_config(). 

###### RAIL_SetTxPower (heading level 7)

`RAIL_Status_t RAIL_SetTxPower(RAIL_Handle_t railHandle, RAIL_TxPowerLevel_t powerLevel)`

**Description:** Set the TX power in units of raw units (see [rail_chip_specific.h](rail-chip-specific-h-1) for value ranges).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t)|[in]|powerLevel|Power in radio-specific [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) units.|

**Returns**

- Status code indicating success of the function call.

To convert between decibels and the integer values that the registers take, call [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw). A weak version of this function, which works well with our boards is provided. However, customers using a custom board need to characterize radio operation on that board and override the function to convert appropriately from the desired dB values to raw integer values.

Depending on the configuration used in [RAIL_ConfigTxPower()](pa#rail-config-tx-power), not all power levels are achievable. This API will get as close as possible to the desired power without exceeding it, and calling [RAIL_GetTxPower()](pa#rail-get-tx-power) is the only way to know the exact value written.

Calling this function before configuring the PA (i.e., before a successful call to [RAIL_ConfigTxPower()](pa#rail-config-tx-power)) will return an error.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_set_tx_power(). 

###### RAIL_GetTxPower (heading level 7)

`RAIL_TxPowerLevel_t RAIL_GetTxPower(RAIL_Handle_t railHandle)`

**Description:** Return the current power setting of the PA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The radio-specific [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) value of the current transmit power.

This API returns the raw value that was set by [RAIL_SetTxPower()](pa#rail-set-tx-power). A weak version of [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) that works with Silicon Labs boards to convert the raw values into actual output dBm values is provided. However, customers using a custom board need to re-characterize the relationship between raw and decibel values and rewrite the provided function.

Calling this function before configuring the PA (i.e., before a successful call to [RAIL_ConfigTxPower()](pa#rail-config-tx-power)) will return error [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid).

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_tx_power(). 

###### RAIL_ConvertRawToDbm (heading level 7)

`RAIL_TxPower_t RAIL_ConvertRawToDbm(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPowerLevel_t powerLevel)`

**Description:** Convert raw values written to registers to decibel value (in units of deci-dBm).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode for which to convert.|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t)|[in]|powerLevel|A raw amplifier register value to be converted to deci-dBm.|

**Returns**

- raw amplifier values converted to units of deci-dBm.

A weak version of this function is provided that is tuned to provide accurate values for our boards. For a custom board, the relationship between what is written to the TX amplifier and the actual output power should be re-characterized and implemented in an overriding version of [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm). For minimum code size and best speed, use only raw values with the [RAIL_SetTxPower()](pa#rail-set-tx-power) API and override this function with a smaller function. In the weak version provided with the RAIL library, railHandle is only used to indicate to the user from where the function was called, so it is okay to use either a real protocol handle, or one of the radio-generic ones, such as [RAIL_EFR32_HANDLE](general#rail-efr32-handle).

Although the implementation of this function may change, the signature must be as declared here.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3 with the use of PA power tables. 

###### RAIL_ConvertDbmToRaw (heading level 7)

`RAIL_TxPowerLevel_t RAIL_ConvertDbmToRaw(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t power)`

**Description:** Convert the desired decibel value (in units of deci-dBm) to raw integer values used by the TX amplifier registers.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode for which to do the conversion.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|power|Desired dBm value in units of deci-dBm.|

**Returns**

- deci-dBm value converted to a raw integer value that can be used directly with [RAIL_SetTxPower()](pa#rail-set-tx-power).

A weak version of this function is provided that is tuned to provide accurate values for our boards. For a custom board, the relationship between what is written to the TX amplifier and the actual output power should be characterized and implemented in an overriding version of [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw). For minimum code size and best speed use only raw values with the [RAIL_SetTxPower()](pa#rail-set-tx-power) API and override this function with a smaller function. In the weak version provided with the RAIL library, railHandle is only used to indicate to the user from where the function was called, so it is okay to use either a real protocol handle, or one of the radio-generic ones, such as [RAIL_EFR32_HANDLE](general#rail-efr32-handle).

Although the implementation of this function may change, the signature must be as declared here.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) with different parameters. 

###### RAIL_ConvertDbmToPowerSettingEntry (heading level 7)

`RAIL_Status_t RAIL_ConvertDbmToPowerSettingEntry(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t power, RAIL_TxPowerSettingEntry_t *pPowerSettingInfo)`

**Description:** Converts the desired decibel value (in units of deci-dBm) to a [RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode for which the conversion is to be done.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|power|Desired dBm value in units of deci-dBm.|
|[RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t) *|[out]|pPowerSettingInfo|A non-NULL pointer to the [RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t) structure to be filled in with the converted value.|

**Returns**

- Status code indicating success of function call.

A weak version of this function is provided that is tuned to provide accurate values for our boards. For a custom board, the relationship between what is written to the TX amplifier and the actual output power should be characterized and implemented in an overriding version of [RAIL_ConvertDbmToPowerSettingEntry()](pa#rail-convert-dbm-to-power-setting-entry). In the weak version provided with the RAIL library, railHandle is only used to indicate to the user from where the function was called, so it is okay to use either a real protocol handle, or one of the radio-generic ones, such as [RAIL_EFR32_HANDLE](general#rail-efr32-handle).

Although the implementation of this function may change, the signature must be as declared here.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_railcb_convert_ddbm_to_power_setting_entry()](pa#sl-railcb-convert-ddbm-to-power-setting-entry) with different parameters. 

###### RAIL_VerifyTxPowerCurves (heading level 7)

`RAIL_Status_t RAIL_VerifyTxPowerCurves(const struct RAIL_TxPowerCurvesConfigAlt *config)`

**Description:** Verify the TX Power Curves on modules.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const struct [RAIL_TxPowerCurvesConfigAlt](rail-tx-power-curves-config-alt) *|[in]|config|A pointer to TX Power Curves to use on this module.|

**Returns**

- Status code indicating success of function call.

This function only needs to be called when using a module and has no effect otherwise. Transmit will not work before this function is called.

**Deprecated**RAIL 2.x synonym of [sl_rail_verify_tx_power_conversion()](pa#sl-rail-verify-tx-power-conversion). 

###### RAIL_SetTxPowerDbm (heading level 7)

`RAIL_Status_t RAIL_SetTxPowerDbm(RAIL_Handle_t railHandle, RAIL_TxPower_t power)`

**Description:** Set the TX power in terms of deci-dBm instead of raw power level.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|power|A desired deci-dBm power to be set.|

**Returns**

- Status code indicating success of the function call.

This is a utility function for user convenience. Normally, to set TX power in dBm, do the following: 

```c
RAIL_TxPower_t power = 100; // 100 deci-dBm, 10 dBm
RAIL_TxPowerConfig_t txPowerConfig;
RAIL_GetTxPowerConfig(railHandle, &txPowerConfig);
// RAIL_ConvertDbmToRaw() will be the weak version provided by Silicon Labs
// by default, or the customer version, if overwritten.
RAIL_TxPowerLevel_t powerLevel
  = RAIL_ConvertDbmToRaw(railHandle, txPowerConfig.mode, power);
RAIL_SetTxPower(railHandle, powerLevel);

```

This function wraps all those calls in a single function with power passed in as a parameter.

**Deprecated**RAIL 2.x synonym of [sl_rail_set_tx_power_dbm()](pa#sl-rail-set-tx-power-dbm). 

###### RAIL_GetTxPowerDbm (heading level 7)

`RAIL_TxPower_t RAIL_GetTxPowerDbm(RAIL_Handle_t railHandle)`

**Description:** Get the TX power in terms of deci-dBm instead of raw power level.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The current output power in deci-dBm.

This is a utility function for user convenience. Normally, to get TX power in dBm, do the following: 

```c
RAIL_TxPowerLevel_t powerLevel = RAIL_GetTxPower(railHandle);
RAIL_TxPowerConfig_t txPowerConfig;
RAIL_GetTxPowerConfig(railHandle, &txPowerConfig);
// RAIL_ConvertRawToDbm() will be the weak version provided by Silicon Labs
// by default, or the customer version, if overwritten.
RAIL_TxPower_t power
  = RAIL_ConvertRawToDbm(railHandle, txPowerConfig.mode, powerLevel);
return power;

```

This function wraps all those calls in a single function with power returned as the result.

**Deprecated**RAIL 2.x synonym of [sl_rail_get_tx_power_dbm()](pa#sl-rail-get-tx-power-dbm). 

###### RAIL_GetPowerSettingTable (heading level 7)

`const RAIL_PaPowerSetting_t * RAIL_GetPowerSettingTable(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t *minPower, RAIL_TxPower_t *maxPower, RAIL_TxPowerLevel_t *step)`

**Description:** Get the TX PA power setting table and related values.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode for which to get the powersetting table.|
|[RAIL_TxPower_t](pa#rail-tx-power-t) *|[out]|minPower|A pointer to a [RAIL_TxPower_t](pa#rail-tx-power-t).|
|[RAIL_TxPower_t](pa#rail-tx-power-t) *|[out]|maxPower|A pointer to a [RAIL_TxPower_t](pa#rail-tx-power-t).|
|[RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) *|[out]|step|A pointer to a [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t), but in deci-dBm units.|

**Returns**

- Power setting table start address. When NULL is returned all out params above won't be set.

The number of entries in the table can be calculated based on output minPower, maxPower, and step parameters. For example, for minPower = 115 (11.5 dBm), maxPower = 300 (30 dBm), and step = 1 (0.1 dBm), the number of entries in table would be 186.

**Deprecated**RAIL 2.x synonym of [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table). 

###### RAIL_SetPaPowerSetting (heading level 7)

`RAIL_Status_t RAIL_SetPaPowerSetting(RAIL_Handle_t railHandle, RAIL_PaPowerSetting_t paPowerSetting, RAIL_TxPower_t minPowerDbm, RAIL_TxPower_t maxPowerDbm, RAIL_TxPower_t currentPowerDbm)`

**Description:** Set the TX PA power setting used to configure the PA hardware for the PA output power determined by [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_PaPowerSetting_t](pa#rail-pa-power-setting-t)|[in]|paPowerSetting|The desired PA power setting.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|minPowerDbm|The minimum power in dBm that the PA can output.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|maxPowerDbm|The maximum power in dBm that the PA can output.|
|[RAIL_TxPower_t](pa#rail-tx-power-t)|[in]|currentPowerDbm|The corresponding output power in dBm for this power setting.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3 with the use of PA power tables. 

###### RAIL_GetPaPowerSetting (heading level 7)

`RAIL_PaPowerSetting_t RAIL_GetPaPowerSetting(RAIL_Handle_t railHandle)`

**Description:** Get the TX PA power setting, which is used to configure power configurations when the dBm to paPowerSetting mapping table mode is used.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|

**Returns**

- The current PA power setting.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3, temporarily a synonym of sli_rail_get_pa_power_setting(). 

###### RAIL_EnablePaAutoMode (heading level 7)

`RAIL_Status_t RAIL_EnablePaAutoMode(RAIL_Handle_t railHandle, bool enable)`

**Description:** Enable automatic switching between PAs internally to the RAIL library.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A real RAIL instance handle.|
|bool|[in]|enable|Enable or disable PA Auto Mode.|

**Returns**

- Status code indicating success of the function call.

While PA Automode is enabled, the PA will be chosen and set automatically whenever [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm) is called or whenever powers are coerced automatically, internally to the RAIL library during a channel change. While PA Auto Mode is enabled, users cannot call [RAIL_ConfigTxPower()](pa#rail-config-tx-power) or [RAIL_SetTxPower()](pa#rail-set-tx-power). When entering auto mode, [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm) must be called to specify the desired power. When leaving auto mode, [RAIL_ConfigTxPower()](pa#rail-config-tx-power) as well as one of [RAIL_SetTxPower()](pa#rail-set-tx-power) or [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm) must be called to re-specify the desired PA and power level combination.

**Note**

- : Power conversion curves must be initialized before calling this function. That is, [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) and [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm) most both be able to operate properly to ensure that PA Auto Mode functions correctly. See the PA Conversions plugin or AN1127 for more details.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves. 

###### RAIL_IsPaAutoModeEnabled (heading level 7)

`bool RAIL_IsPaAutoModeEnabled(RAIL_Handle_t railHandle)`

**Description:** Query status of PA Auto Mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A real RAIL instance handle.|

**Returns**

- Indicator of whether Auto Mode is enabled (true) or not (false).

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves. 

###### RAILCb_PaAutoModeDecision (heading level 7)

`RAIL_Status_t RAILCb_PaAutoModeDecision(RAIL_Handle_t railHandle, RAIL_TxPower_t *power, RAIL_TxPowerMode_t *mode, const RAIL_ChannelConfigEntry_t *chCfgEntry)`

**Description:** Callback that decides which PA and power level should be used while in PA auto mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPower_t](pa#rail-tx-power-t) *|[inout]|power|A pointer to the dBm output power (in deci-dBm, 10*dBm) being requested. The value this points to when the function returns will be applied to the radio.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) *|[out]|mode|A pointer to the [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) to be used to achieve the requested power. The value this points to when the function returns will be applied to the radio.|
|const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *|[in]|chCfgEntry|A pointer to a [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t). While switching channels, it will be the entry RAIL is switch **to**, during a call to [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm), it will be the entry RAIL is **already on**. Can be NULL if a channel configuration was not set or no valid channels are present.|

**Returns**

- Status code indicating success of the function call. If this is anything except [RAIL_STATUS_NO_ERROR](general#rail-status-no-error), neither PA's nor their powers will be configured automatically.

Whatever values mode and powerLevel point to when this function return will be applied to the PA hardware and used for transmits.

**Note**

- The mode and power level provided by this function depends on the [RAIL_PaAutoModeConfig](pa#rail-pa-auto-mode-config) provided for the radio. The [RAIL_PaAutoModeConfig](pa#rail-pa-auto-mode-config) definition for a radio should tend to cover all the bands supported by the radio and cover the full range of power in each to find a valid entry for requested power for a specific band.

**Deprecated**This RAIL 2.x callback has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves. 

###### RAIL_ConfigPaAutoEntry (heading level 7)

`RAIL_Status_t RAIL_ConfigPaAutoEntry(RAIL_Handle_t railHandle, const RAIL_PaAutoModeConfigEntry_t *paAutoModeEntry)`

**Description:** Configure the PA auto mode entries.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|const [RAIL_PaAutoModeConfigEntry_t](rail-pa-auto-mode-config-entry-t) *|[in]|paAutoModeEntry|A pointer to entries used to configure PA auto mode decision points. The final entry must set its [RAIL_PaAutoModeConfigEntry_t::band](rail-pa-auto-mode-config-entry-t#band) to [RAIL_PA_BAND_COUNT](pa#rail-pa-band-count).|

**Returns**

- Status parameter indicating success of function call.

**Deprecated**This RAIL 2.x function has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves. 

###### sl_rail_util_pa_nvm_write_mode (heading level 7)

`sl_status_t sl_rail_util_pa_nvm_write_mode(RAIL_TxPowerMode_t pa_mode)`

**Description:** Store a [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) into NVM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|pa_mode|The PA mode.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_util_pa_nvm_read_mode (heading level 7)

`RAIL_TxPowerMode_t sl_rail_util_pa_nvm_read_mode(void)`

**Description:** Reads stored [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) from NVM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- The stored PA mode, or RAIL_TX_POWER_MODE_NONE if no stored PA mode exists or is invalid.

###### sl_rail_util_pa_nvm_write_config (heading level 7)

`sl_status_t sl_rail_util_pa_nvm_write_config(const sl_rail_nvm_pa_config_t *p_pa_config)`

**Description:** Stores a [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) into NVM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) *|[in]|p_pa_config|A non-NULL pointer to PA curves/table config.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_util_pa_nvm_read_config (heading level 7)

`sl_status_t sl_rail_util_pa_nvm_read_config(sl_rail_nvm_pa_config_t *p_pa_config)`

**Description:** Reads stored [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) from NVM.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) *|[out]|p_pa_config|A non-NULL pointer to the PA curves/table config read from NVM.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_config_tx_power (heading level 7)

`sl_rail_status_t sl_rail_config_tx_power(sl_rail_handle_t rail_handle, const sl_rail_tx_power_config_t *p_config)`

**Description:** Initialize TX power settings (provided primarily for compatibility with the older RAIL 2.x [RAIL 2.x PA Power Conversion Utility](rail-util-pa) power curve plugin).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|const [sl_rail_tx_power_config_t](sl-rail-tx-power-config-t) *|[in]|p_config|A pointer to a power config with the desired initial settings for the TX amplifier.|

**Returns**

- Status code indicating success of the function call.

This function is generally unnecessary when using the [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) plugin. It is primarily for backwards compatibility usage with the older [RAIL 2.x PA Power Conversion Utility](rail-util-pa) plugin, or possibly of use for performing PA RF path characterization to generate or adjust the power conversion tables/curves provided by Silicon Labs in [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) / [RAIL 2.x PA Power Conversion Utility](rail-util-pa) plugins.

When using [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa), the PA ramp time and voltage can be set via [sl_rail_set_tx_pa_ramp_time()](pa#sl-rail-set-tx-pa-ramp-time) and [sl_rail_set_tx_pa_voltage()](pa#sl-rail-set-tx-pa-voltage), respectively.

**Note**

- A change in [sl_rail_tx_power_config_t::ramp_time_us](sl-rail-tx-power-config-t#ramp-time-us) may affect the minimum timings that can be achieved in [sl_rail_state_timing_t::idle_to_tx](sl-rail-state-timing-t#idle-to-tx) and [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx). Call [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing) again to check whether these times have changed.

###### sl_rail_set_tx_power_dbm (heading level 7)

`sl_rail_status_t sl_rail_set_tx_power_dbm(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm)`

**Description:** Set the TX power in deci-dBm for all supported PA modes.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t)|[in]|power_ddbm|A desired deci-dBm power to be set.|

**Returns**

- Status code indicating success of the function call.

This function sets the TX power for use with all supported PA modes. If you want different power settings for any particular PA mode(s) use [sl_rail_set_tx_power_dbm_with_pa_mode()](pa#sl-rail-set-tx-power-dbm-with-pa-mode) instead.

**Note**

- RAIL will try its best to effect the requested TX power but it may end up being truncated, rounded, or limited based on the PA mode's PA power conversion tables/curves limits or granularity. One can use [sl_rail_util_pa_convert_power_to_actual()](pa-power-conversions#sl-rail-util-pa-convert-power-to-actual) to find the actual power utilized, however that power is further subject to any channel power limit specified in the channel configuration ([sl_rail_channel_config_entry_t::max_power_ddbm](sl-rail-channel-config-entry-t#max-power-ddbm)).

###### sl_rail_set_tx_power_dbm_with_pa_mode (heading level 7)

`sl_rail_status_t sl_rail_set_tx_power_dbm_with_pa_mode(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm, sl_rail_tx_pa_mode_t pa_mode)`

**Description:** Set the TX power in deci-dBm for just the specified PA mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A RAIL instance handle.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t)|[in]|power_ddbm|The desired output power in deci-dBm.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|The PA mode to use (platform-specific,|

**Returns**

- Status code indicating result of the function call.

This function sets the TX power for use with an explicit PA mode.

**Note**

- RAIL will try its best to effect the requested TX power but it may end up being truncated, rounded, or limited based on the PA mode's PA power conversion tables/curves limits or granularity. One can use [sl_rail_util_pa_convert_power_to_actual()](pa-power-conversions#sl-rail-util-pa-convert-power-to-actual) to find the actual power utilized, however that power is further subject to any channel power limit specified in the channel configuration ([sl_rail_channel_config_entry_t::max_power_ddbm](sl-rail-channel-config-entry-t#max-power-ddbm)).

###### sl_rail_get_tx_power_dbm (heading level 7)

`sl_rail_tx_power_t sl_rail_get_tx_power_dbm(sl_rail_handle_t rail_handle)`

**Description:** Get the TX power in deci-dBm.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The actual current output power in deci-dBm.

###### sl_rail_verify_tx_power_conversion (heading level 7)

`sl_rail_status_t sl_rail_verify_tx_power_conversion(const struct sl_rail_tx_power_table_config *p_config)`

**Description:** Verify the TX Power Conversion configuration on modules.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const struct [sl_rail_tx_power_table_config](sl-rail-tx-power-table-config) *|[in]|p_config|A pointer to TX Power Table to use on this module.|

**Returns**

- Status code indicating success of function call.

This function only needs to be called when using a module and has no effect otherwise. Transmit will not work before this function is called. 

###### sl_rail_get_pa_mode (heading level 7)

`sl_rail_tx_pa_mode_t sl_rail_get_pa_mode(sl_rail_handle_t rail_handle)`

**Description:** Gets the current PA mode from the state.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The PA mode.

###### sl_rail_get_pa_mode_from_channel_entry (heading level 7)

`sl_rail_tx_pa_mode_t sl_rail_get_pa_mode_from_channel_entry(sl_rail_handle_t rail_handle)`

**Description:** Gets the PA mode using the current channel config entry.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|

**Returns**

- The PA mode.

###### sl_rail_set_tx_pa_ramp_time (heading level 7)

`sl_rail_status_t sl_rail_set_tx_pa_ramp_time(sl_rail_handle_t rail_handle, uint16_t ramp_time_us)`

**Description:** Sets the PA ramp time for transmission.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|ramp_time_us|Desired ramp time in units of microseconds.|

**Returns**

- Status code indicating success of the function call.

**Note**

- The ramp_time_us may affect the minimum timings that can be achieved in [sl_rail_state_timing_t::idle_to_tx](sl-rail-state-timing-t#idle-to-tx) and [sl_rail_state_timing_t::rx_to_tx](sl-rail-state-timing-t#rx-to-tx). Call [sl_rail_set_state_timing()](state-transitions#sl-rail-set-state-timing) again to check whether these times have changed.

###### sl_rail_set_tx_pa_voltage (heading level 7)

`sl_rail_status_t sl_rail_set_tx_pa_voltage(sl_rail_handle_t rail_handle, uint16_t voltage_mv)`

**Description:** Sets the PA voltage for transmission.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|uint16_t|[in]|voltage_mv|Desired voltage in units of millivolts.|

**Returns**

- Status code indicating success of the function call.

###### sl_railcb_convert_ddbm_to_power_setting_entry (heading level 7)

`sl_rail_status_t sl_railcb_convert_ddbm_to_power_setting_entry(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t channel_restr_max_power_ddbm, sl_rail_tx_power_setting_entry_t *p_power_setting_info)`

**Description:** Convert the desired decibel value (in units of deci-dBm) to a power setting value that describes the configuration of TX amplifier registers.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t)|[in]|power_ddbm|Desired dBm value in units of deci-dBm.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|PA mode used for this conversion.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t)|[in]|channel_restr_max_power_ddbm|The maximum power(in deci-dBm) allowed on the channel|
|[sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t) *|[out]|p_power_setting_info|A non-NULL pointer to memory allocated to hold the result of the call in [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t).|

**Returns**

- Status code indicating success of the function call.

###### Macros

`#define RAIL_TX_POWER_MAX ((RAIL_TxPower_t)0x7FFF)`

**Description**: The maximum valid value for a [RAIL_TxPower_t](pa#rail-tx-power-t).

`#define RAIL_TX_POWER_MIN ((RAIL_TxPower_t)0x8000)`

**Description**: The minimum valid value for a [RAIL_TxPower_t](pa#rail-tx-power-t).

`#define RAIL_TX_POWER_CURVE_DEFAULT_MAX ((RAIL_TxPower_t)200)`

**Description**: The maximum power in deci-dBm the curve supports.

`#define RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT ((RAIL_TxPower_t)40)`

**Description**: The increment step in deci-dBm for calculating power level.

`#define RAIL_TX_POWER_VOLTAGE_SCALING_FACTOR 1000`

**Description**: mV are used for all TX power voltage values.

`#define RAIL_TX_POWER_DBM_SCALING_FACTOR 10`

**Description**: deci-dBm are used for all TX power dBm values.

`#define RAIL_TX_POWER_LEVEL_INVALID (255U)`

**Description**: Invalid [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) value returned when an error occurs with [RAIL_GetTxPower()](pa#rail-get-tx-power).

`#define RAIL_TX_POWER_LEVEL_MAX (254U)`

**Description**: Sentinel value that can be passed to [RAIL_SetTxPower()](pa#rail-set-tx-power) to set the highest power level available on the current PA, regardless of which one is selected.

`#define RAIL_TX_PA_POWER_SETTING_UNSUPPORTED (0U)`

**Description**: Returned by [RAIL_GetPaPowerSetting()](pa#rail-get-pa-power-setting) when the device does not support the dBm to power setting mapping table.

`#define RAIL_TX_POWER_MODE_NAMES `

**Description**: The names of the TX power modes.

`#define RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_OFDM (x)`

**Description**: Convenience macro for any OFDM mapping table mode.

`#define RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_SUBGIG (x)`

**Description**: Convenience macro for any Sub-GHz mapping table mode.

`#define RAIL_POWER_MODE_IS_ANY_OFDM (x)`

**Description**: Convenience macro for any OFDM mode.

`#define SL_RAIL_UTIL_PA_NVM_MODE_TAG (0x89881UL)`

**Description**: The NVM3 PA mode tag.

`#define SL_RAIL_UTIL_PA_NVM_CONFIG_TAG (0x89882UL)`

**Description**: The NVM3 PA config tag.

`#define SL_RAIL_NVM_PA_CONFIGS_VERSION 1`

**Description**: The version number of the NVM structures defined herein.

`#define SL_RAIL_NVM_PA_COUNT RAIL_NUM_PA`

**Description**: The number of curves/tables allowed in NVM storage.

`#define SL_RAIL_NVM_PA_CURVE_SEGMENTS 9`

**Description**: The number of curve segments allowed per curve in NVM storage.

`#define SL_RAIL_NVM_PA_TABLE_ENTRIES 16`

**Description**: The number of table values allowed per mapping table in NVM storage.

`#define SL_RAIL_TX_POWER_MAX ((sl_rail_tx_power_t)0x7FFF)`

**Description**: The maximum valid value for a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).

`#define SL_RAIL_TX_POWER_MIN ((sl_rail_tx_power_t)0x8000)`

**Description**: The minimum valid value for a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).

`#define SL_RAIL_TX_POWER_CURVE_DEFAULT_MAX ((sl_rail_tx_power_t)200)`

**Description**: The maximum power in deci-dBm the curve supports.

`#define SL_RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT ((sl_rail_tx_power_t)40)`

**Description**: The increment step in deci-dBm for calculating power level.

`#define SL_RAIL_TX_POWER_VOLTAGE_SCALING_FACTOR 1000`

**Description**: mV are used for all TX power voltage values.

`#define SL_RAIL_TX_POWER_DBM_SCALING_FACTOR 10`

**Description**: deci-dBm are used for all TX power dBm values.

`#define SL_RAIL_TX_PA_POWER_SETTING_UNSUPPORTED ((sl_rail_pa_power_setting_t)(0xFFFFFFFFUL))`

**Description**: An unsupported power setting used with the [PA Power Conversions](pa-power-conversions) component.

`#define SL_RAIL_TX_POWER_MODE_NAMES `

**Description**: The names of the TX power modes.

`#define SL_RAIL_TX_PA_MODE_NAMES `

**Description**: The names of the TX PA modes.

`#define SL_RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_OFDM (x)`

**Description**: Convenience macro for any OFDM mapping table mode.

`#define SL_RAIL_POWER_MODE_IS_DBM_POWERSETTING_MAPPING_TABLE_SUB_GHZ (x)`

**Description**: Convenience macro for any Sub-GHz mapping table mode.

`#define SL_RAIL_POWER_MODE_IS_ANY_OFDM (x)`

**Description**: Convenience macro for any OFDM mode.

A structure containing power-setting information for a deci-dBm power. 

**Deprecated**This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t) with fewer fields. 

###### Public Attributes (heading level 7)

###### paPowerSetting (heading level 8)

```
RAIL_PaPowerSetting_t RAIL_TxPowerSettingEntry_t::paPowerSetting
```

**Description:** PowerSetting information corresponds to currentPaPowerDdbm.

**Details:** **Deprecated**This RAIL 2.x field is eqivalent to RAIL 3 [sl_rail_tx_power_setting_entry_t::pa_power_setting](sl-rail-tx-power-setting-entry-t#pa-power-setting).

###### minPaPowerDdbm (heading level 8)

```
RAIL_TxPower_t RAIL_TxPowerSettingEntry_t::minPaPowerDdbm
```

**Description:** Minimum power (in deci-dBm) supported by powersetting table in use.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t).

###### maxPaPowerDdbm (heading level 8)

```
RAIL_TxPower_t RAIL_TxPowerSettingEntry_t::maxPaPowerDdbm
```

**Description:** Maximum power (in deci-dBm) supported by powersetting table in use.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 [sl_rail_tx_power_setting_entry_t](sl-rail-tx-power-setting-entry-t).

###### currentPaPowerDdbm (heading level 8)

```
RAIL_TxPower_t RAIL_TxPowerSettingEntry_t::currentPaPowerDdbm
```

**Description:** Current power (in deci-dBm).

**Details:** **Deprecated**This RAIL 2.x field is equivalent to RAIL 3 [sl_rail_tx_power_setting_entry_t::curr_pa_power_ddbm](sl-rail-tx-power-setting-entry-t#curr-pa-power-ddbm).

A structure containing values used to initialize the power amplifiers. 

**Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_config_t](sl-rail-tx-power-config-t). 

###### Public Attributes (heading level 7)

###### mode (heading level 8)

```
RAIL_TxPowerMode_t RAIL_TxPowerConfig_t::mode
```

**Description:** TX power mode.

**Details:** **Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_config_t::mode](sl-rail-tx-power-config-t#mode).

###### voltage (heading level 8)

```
uint16_t RAIL_TxPowerConfig_t::voltage
```

**Description:** Power amplifier supply voltage in mV, generally: DCDC supply ~ 1800 mV (1.8 V) Battery supply ~ 3300 mV (3.3 V)

**Details:** **Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_config_t::voltage_mv](sl-rail-tx-power-config-t#voltage-mv).

###### rampTime (heading level 8)

```
uint16_t RAIL_TxPowerConfig_t::rampTime
```

**Description:** The amount of time to spend ramping for TX in microseconds.

**Details:** **Deprecated**RAIL 2.x synonym for [sl_rail_tx_power_config_t::ramp_time_us](sl-rail-tx-power-config-t#ramp-time-us).

Struct to ease specification of appropriate ranges within which a PA should be used. 

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves. 

###### Public Attributes (heading level 7)

###### min (heading level 8)

```
RAIL_TxPower_t RAIL_PaAutoModeConfigEntry_t::min
```

**Description:** The minimum (inclusive) deci-dBm power to use with this entry.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

###### max (heading level 8)

```
RAIL_TxPower_t RAIL_PaAutoModeConfigEntry_t::max
```

**Description:** The maximum (inclusive) deci-dBm power to use with this entry.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

###### mode (heading level 8)

```
RAIL_TxPowerMode_t RAIL_PaAutoModeConfigEntry_t::mode
```

**Description:** The PA that this range of powers applies to.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

###### band (heading level 8)

```
RAIL_PaBand_t RAIL_PaAutoModeConfigEntry_t::band
```

**Description:** The RF band that this PA works with.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3 where PA selection is incorporated into the PA tables themselves.

NVM-suitable PA curve structure to map to a [RAIL_TxPowerCurveAlt_t](rail-tx-power-curve-alt-t). 

The size of this structure must be a multiple of 4 bytes. 

###### Public Attributes (heading level 7)

###### curve_min_ddbm (heading level 8)

```
int16_t sl_rail_nvm_pa_curve_t::curve_min_ddbm
```

**Description:** Minimum deci-dBm value.

###### curve_max_ddbm (heading level 8)

```
int16_t sl_rail_nvm_pa_curve_t::curve_max_ddbm
```

**Description:** Maximum deci-dBm value.

###### curve_segments (heading level 8)

```
RAIL_TxPowerCurveSegment_t sl_rail_nvm_pa_curve_t::curve_segments[9]
```

**Description:** Curve segments.

NVM-suitable PA mapping table structure to map to a [RAIL_PowerConversion_t::mappingTable](rail-power-conversion-t#mapping-table). 

The size of this structure must be a multiple of 4 bytes. 

###### Public Attributes (heading level 7)

###### ddbm_values (heading level 8)

```
int16_t sl_rail_nvm_pa_table_t::ddbm_values[16]
```

**Description:** Mapping table of deci-dBm power values.

NVM-suitable PA descriptor structure to map to a [RAIL_PaDescriptor_t](rail-pa-descriptor-t). 

The size of this structure must be a multiple of 4 bytes. 

###### Public Attributes (heading level 7)

###### algorithm (heading level 8)

```
RAIL_PaConversionAlgorithm_t sl_rail_nvm_pa_descriptor_t::algorithm
```

**Description:** Algorithm used to map dBm to power levels for this PA.

###### num_segments_or_entries (heading level 8)

```
uint8_t sl_rail_nvm_pa_descriptor_t::num_segments_or_entries
```

**Description:** The number of curve piecewise segments or mapping table entries provided for the PA according to its algorithm.

**Details:** This should not exceed [SL_RAIL_NVM_PA_CURVE_SEGMENTS](pa#sl-rail-nvm-pa-curve-segments) for a PA using [RAIL_PA_ALGORITHM_PIECEWISE_LINEAR](pa-curve-conversions#rail-pa-algorithm-piecewise-linear) or [SL_RAIL_NVM_PA_TABLE_ENTRIES](pa#sl-rail-nvm-pa-table-entries) for a PA using [RAIL_PA_ALGORITHM_MAPPING_TABLE](pa-curve-conversions#rail-pa-algorithm-mapping-table).

###### min (heading level 8)

```
RAIL_TxPowerLevel_t sl_rail_nvm_pa_descriptor_t::min
```

**Description:** Minimum power level for this PA.

###### max (heading level 8)

```
RAIL_TxPowerLevel_t sl_rail_nvm_pa_descriptor_t::max
```

**Description:** Maximum power level for this PA.

NVM-suitable PA curves/tables configuration structure to map to a [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t). 

###### Public Attributes (heading level 7)

###### version (heading level 8)

```
uint8_t sl_rail_nvm_pa_config_t::version
```

**Description:** Version number of this structure.

**Details:** Should correspond to [SL_RAIL_NVM_PA_CONFIGS_VERSION](pa#sl-rail-nvm-pa-configs-version).

###### num_descriptors (heading level 8)

```
uint8_t sl_rail_nvm_pa_config_t::num_descriptors
```

**Description:** Number of descriptors described below in pa_descriptors[].

**Details:** Must equal [SL_RAIL_NVM_PA_COUNT](pa#sl-rail-nvm-pa-count).

###### pa_voltage (heading level 8)

```
uint16_t sl_rail_nvm_pa_config_t::pa_voltage
```

**Description:** PA VDD voltage, in millivolts.

###### signature (heading level 8)

```
uint32_t sl_rail_nvm_pa_config_t::signature
```

**Description:** Signature used for validation of the curves configuration.

###### pa_descriptors (heading level 8)

```
sl_rail_nvm_pa_descriptor_t sl_rail_nvm_pa_config_t::pa_descriptors[RAIL_NUM_PA]
```

**Description:** The PA data descriptor, one for each PA.

###### curve (heading level 8)

```
sl_rail_nvm_pa_curve_t sl_rail_nvm_pa_config_t::curve
```

**Description:** PA piecewise-linear curve.

###### table (heading level 8)

```
sl_rail_nvm_pa_table_t sl_rail_nvm_pa_config_t::table
```

**Description:** PA raw to dBm mapping table.

###### pa_curve_or_table (heading level 8)

```
union sl_rail_nvm_pa_config_t::@1 sl_rail_nvm_pa_config_t::pa_curve_or_table[ RAIL_NUM_PA ]
```

**Description:** Union for either a curve or table.

A structure containing power-setting information for a deci-dBm power. 

###### Public Attributes (heading level 7)

###### pa_power_setting (heading level 8)

```
sl_rail_pa_power_setting_t sl_rail_tx_power_setting_entry_t::pa_power_setting
```

**Description:** PowerSetting information corresponds to curr_pa_power_ddbm.

###### curr_pa_power_ddbm (heading level 8)

```
sl_rail_tx_power_t sl_rail_tx_power_setting_entry_t::curr_pa_power_ddbm
```

**Description:** Current power (in deci-dBm).

A structure containing values used to initialize the power amplifiers. 

###### Public Attributes (heading level 7)

###### mode (heading level 8)

```
sl_rail_tx_power_mode_t sl_rail_tx_power_config_t::mode
```

**Description:** TX power mode.

###### voltage_mv (heading level 8)

```
uint16_t sl_rail_tx_power_config_t::voltage_mv
```

**Description:** Power amplifier supply voltage in mV, generally: DCDC supply ~ 1800 mV (1.8 V) Battery supply ~ 3300 mV (3.3 V)

###### ramp_time_us (heading level 8)

```
uint16_t sl_rail_tx_power_config_t::ramp_time_us
```

**Description:** The amount of time to spend ramping for TX in microseconds.

Forward structure declaration of [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t). 

**Deprecated**This RAIL 2.x structure has been replaced in RAIL 3 by [sl_rail_tx_power_table_config](sl-rail-tx-power-table-config) with different fields.

Forward structure declaration of [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t).

###### EFR32xG2x

Types specific to the EFR32xG2x for dealing with the on-chip PAs. 

###### Macros (heading level 7)

`#define RAIL_TX_POWER_LEVEL_2P4_HP_MAX (240)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_HP](pa#rail-tx-power-mode-2-p4-gig-hp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_HP_MIN (1U)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_HP](pa#rail-tx-power-mode-2-p4-gig-hp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_MP_MAX (RAIL_TX_POWER_LEVEL_2P4_HP_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_MP](pa#rail-tx-power-mode-2-p4-gig-mp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_MP_MIN (RAIL_TX_POWER_LEVEL_2P4_HP_MIN)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_MP](pa#rail-tx-power-mode-2-p4-gig-mp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_LP_MAX (RAIL_TX_POWER_LEVEL_2P4_HP_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_LP](pa#rail-tx-power-mode-2-p4-gig-lp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_LP_MIN (RAIL_TX_POWER_LEVEL_2P4_HP_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_LP](pa#rail-tx-power-mode-2-p4-gig-lp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_LLP_MAX (RAIL_TX_POWER_LEVEL_2P4_HP_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_LLP](pa#rail-tx-power-mode-2-p4-gig-llp) mode.

`#define RAIL_TX_POWER_LEVEL_2P4_LLP_MIN (RAIL_TX_POWER_LEVEL_2P4_HP_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_2P4GIG_LLP](pa#rail-tx-power-mode-2-p4-gig-llp) mode.

`#define RAIL_SUBGIG_MAX 0U`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when using a Sub-GHz PA mode.

`#define RAIL_SUBGIG_MIN 1U`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when using a Sub-GHz PA mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_HP_MAX (RAIL_SUBGIG_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_HP](pa#rail-tx-power-mode-subgig-hp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_HP_MIN (RAIL_SUBGIG_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_HP](pa#rail-tx-power-mode-subgig-hp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_MP_MAX (RAIL_SUBGIG_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_MP](pa#rail-tx-power-mode-subgig-mp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_MP_MIN (RAIL_SUBGIG_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_MP](pa#rail-tx-power-mode-subgig-mp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_LP_MAX (RAIL_SUBGIG_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_LP](pa#rail-tx-power-mode-subgig-lp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_LP_MIN (RAIL_SUBGIG_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_LP](pa#rail-tx-power-mode-subgig-lp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_LLP_MAX (RAIL_SUBGIG_MAX)`

**Description**: The maximum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_LLP](pa#rail-tx-power-mode-subgig-llp) mode.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_LLP_MIN (RAIL_SUBGIG_MIN)`

**Description**: The minimum valid value for the [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) when in [RAIL_TX_POWER_MODE_SUBGIG_LLP](pa#rail-tx-power-mode-subgig-llp) mode.

`#define RAIL_TX_POWER_LEVEL_HP_MAX RAIL_TX_POWER_LEVEL_2P4_HP_MAX`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_HP_MIN RAIL_TX_POWER_LEVEL_2P4_HP_MIN`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_MP_MAX RAIL_TX_POWER_LEVEL_2P4_MP_MAX`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_MP_MIN RAIL_TX_POWER_LEVEL_2P4_MP_MIN`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_LP_MAX RAIL_TX_POWER_LEVEL_2P4_LP_MAX`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_LP_MIN RAIL_TX_POWER_LEVEL_2P4_LP_MIN`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_MAX RAIL_TX_POWER_LEVEL_SUBGIG_HP_MAX`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_TX_POWER_LEVEL_SUBGIG_MIN RAIL_TX_POWER_LEVEL_SUBGIG_HP_MIN`

**Description**: **Deprecated**Backwards compatibility define.

`#define RAIL_NUM_PA (3U)`

**Description**: The number of PA's on this chip (including Virtual PAs).

`#define RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE (x)`

**Description**: Convenience macro for any mapping table mode.

`#define RAIL_POWER_MODE_SUPPORTS_RAW_SETTING (x)`

**Description**: Convenience macro to check if the power mode supports raw setting.

`#define SL_RAIL_TX_PA_MODES_COUNT `

**Description**: Indicates on number of PA modes present on a chip.

`#define SL_RAIL_NUM_PA (3U)`

**Description**: The number of PA's on this chip (including Virtual PAs).

`#define SL_RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE (x)`

**Description**: Convenience macro for any mapping table mode.

`#define SL_RAIL_POWER_MODE_SUPPORTS_RAW_SETTING (x)`

**Description**: Convenience macro to check if the power mode supports raw setting.

###### SIxx3xx

Types specific to the SIxx3xx for dealing with the on-chip PAs. 

###### Macros (heading level 7)

`#define RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE (x)`

**Description**: The number of PA's on this chip (including Virtual PAs).

`#define RAIL_POWER_MODE_SUPPORTS_RAW_SETTING (x)`

**Description**: Convenience macro to check if the power mode supports raw setting.

`#define SL_RAIL_TX_PA_MODES_COUNT `

**Description**: Indicates on number of PA modes present on a chip.

`#define SL_RAIL_POWER_MODE_IS_ANY_DBM_POWERSETTING_MAPPING_TABLE (x)`

**Description**: The number of PA's on this chip (including Virtual PAs).

`#define SL_RAIL_POWER_MODE_SUPPORTS_RAW_SETTING (x)`

**Description**: Convenience macro to check if the power mode supports raw setting.

###### PA Curve Conversions

###### Modules (heading level 7)

[RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t)

[RAIL_TxPowerCurves_t](rail-tx-power-curves-t)

[RAIL_TxPowerCurvesConfig_t](rail-tx-power-curves-config-t)

[RAIL_TxPowerCurveAlt_t](rail-tx-power-curve-alt-t)

[RAIL_PowerConversion_t](rail-power-conversion-t)

[RAIL_PaDescriptor_t](rail-pa-descriptor-t)

[RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t)

###### Enumerations (heading level 7)

###### RAIL_PaConversionAlgorithm_t (heading level 8)

```
enum RAIL_PaConversionAlgorithm_t {
    RAIL_PA_ALGORITHM_PIECEWISE_LINEAR
    RAIL_PA_ALGORITHM_MAPPING_TABLE
    RAIL_PA_ALGORITHM_DBM_POWERSETTING_MAPPING_TABLE
    RAIL_PA_ALGORITHM_COUNT
}
```

**Description:**

PA conversion algorithms types for converting between dBm and power levels.

**Details:**

**Deprecated**This RAIL 2.x enum has been eliminated in RAIL 3 which uses PA power tables instead.

**Enumerator:**

|   |   |
|---|---|
|RAIL_PA_ALGORITHM_PIECEWISE_LINEAR|Piecewise linear fit.|
|RAIL_PA_ALGORITHM_MAPPING_TABLE|Mapping table between quantities.|
|RAIL_PA_ALGORITHM_DBM_POWERSETTING_MAPPING_TABLE|Mapping table between pa power settings and dBm values.|
|RAIL_PA_ALGORITHM_COUNT|Algorithm count.|

###### Variables (heading level 7)

###### RAIL_TxPowerCurvesVbat (heading level 8)

```
const RAIL_TxPowerCurvesConfigAlt_t RAIL_TxPowerCurvesVbat
```

**Description:** The curves to be used when battery voltage powers transmission.

**Details:** **Deprecated**This RAIL 2.x variable has been eliminated in RAIL 3. See RAIL 3 discussion in [RAIL 2.x PA Power Conversion Utility](rail-util-pa).

###### RAIL_TxPowerCurvesDcdc (heading level 8)

```
const RAIL_TxPowerCurvesConfigAlt_t RAIL_TxPowerCurvesDcdc
```

**Description:** The curves to be used when the DC-DC converter powers transmission.

**Details:** **Deprecated**This RAIL 2.x variable has been eliminated in RAIL 3. See RAIL 3 discussion in [RAIL 2.x PA Power Conversion Utility](rail-util-pa).

###### Functions (heading level 7)

###### RAIL_InitTxPowerCurves (heading level 8)

`RAIL_Status_t RAIL_InitTxPowerCurves(const RAIL_TxPowerCurvesConfig_t *config)`

**Description:** Initialize Transmit power curves.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [RAIL_TxPowerCurvesConfig_t](rail-tx-power-curves-config-t) *|[in]|config|A pointer to the custom TX power curves.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**This function is no longer supported in RAIL 2.x. Must use [RAIL_InitTxPowerCurvesAlt()](pa-curve-conversions#rail-init-tx-power-curves-alt) instead. 

###### RAIL_InitTxPowerCurvesAlt (heading level 8)

`RAIL_Status_t RAIL_InitTxPowerCurvesAlt(const RAIL_TxPowerCurvesConfigAlt_t *config)`

**Description:** Initialize TxPower curves.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t) *|[in]|config|A pointer to the custom TX power curves to use.|

**Returns**

- Status code indicating success of the function call.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_init_tx_power_table()](pa-power-conversions#sl-rail-util-pa-init-tx-power-table) with different parameters. 

###### RAIL_GetTxPowerCurve (heading level 8)

`RAIL_TxPowerCurves_t const  * RAIL_GetTxPowerCurve(RAIL_TxPowerMode_t mode)`

**Description:** Gets the curve that should be used for conversion functions based on the current PA configuration.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode whose curves are needed.|

**Returns**

- A pointer to the [RAIL_TxPowerCurves_t](rail-tx-power-curves-t) that are used for conversion functions.

**Note**

- : If the mode is not supported by the the chip, then NULL will be returned.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table) with different parameters. 

###### RAIL_GetTxPowerCurveLimits (heading level 8)

`RAIL_Status_t RAIL_GetTxPowerCurveLimits(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t *maxpower, RAIL_TxPower_t *increment)`

**Description:** Gets the maximum power in deci-dBm that should be used for calculating the segments and to find right curve segment to convert Dbm to raw power level for a specific PA.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|railHandle|A RAIL instance handle.|
|[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t)|[in]|mode|PA mode whose curves are needed.|
|[RAIL_TxPower_t](pa#rail-tx-power-t) *|[out]|maxpower|A non-NULL pointer to memory allocated to hold the max power in deci-dBm used in calculation of curve segments.|
|[RAIL_TxPower_t](pa#rail-tx-power-t) *|[out]|increment|A non-NULL pointer to memory allocated to hold the increment in deci-dBm used in calculation of curve segments.|

**Returns**

- Status code indicating success of the function call.

For the PAs with [RAIL_PaConversionAlgorithm_t](pa-curve-conversions#rail-pa-conversion-algorithm-t)[RAIL_PA_ALGORITHM_PIECEWISE_LINEAR](pa-curve-conversions#rail-pa-algorithm-piecewise-linear), if the curves are generated with maxPower and increment other than [RAIL_TX_POWER_CURVE_DEFAULT_MAX](pa#rail-tx-power-curve-default-max) and [RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT](pa#rail-tx-power-curve-default-increment) respectively, then the first [RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t) has its maxPowerLevel equal to [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid) and its slope and intercept stores the maxPower and increment in deci-dBm respectively.

**Deprecated**This RAIL 2.x function has been replaced in RAIL 3 by [sl_rail_util_pa_get_power_setting_table()](pa-power-conversions#sl-rail-util-pa-get-power-setting-table) with different parameters. 

###### sl_rail_util_pa_on_channel_config_change (heading level 8)

`void sl_rail_util_pa_on_channel_config_change(RAIL_Handle_t rail_handle, const RAIL_ChannelConfigEntry_t *entry)`

**Description:** Provide a channel config change callback capable of configuring the PA correctly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[RAIL_Handle_t](general#rail-handle-t)|[in]|rail_handle|The RAIL handle being passed into this callback.|
|const [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) *|[in]|entry|A pointer to the channel config entry being switched to by hardware.|

Structure containing data defining each segment of the deci-dBm to raw power level mapping curve fits. 

Note, these used in an equation of the form:

powerLevel * 1000 = slope * power + intercept

powerLevel is the 0-252/0-248/1-7 values used in the RAIL_Get/SetTxPower() functions, and power is the actual output power of the PA, specified in deci-dBm.

**Note**

- If the curves are generated with maxPower and increment other than [RAIL_TX_POWER_CURVE_DEFAULT_MAX](pa#rail-tx-power-curve-default-max) and [RAIL_TX_POWER_CURVE_DEFAULT_INCREMENT](pa#rail-tx-power-curve-default-increment) respectively, then the first [RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t) has its maxPowerLevel equal to [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid) and its slope and intercept stores the maxPower and increment in deci-dBm respectively.

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. 

###### Public Attributes (heading level 8)

###### maxPowerLevel (heading level 9)

```
uint16_t RAIL_TxPowerCurveSegment_t::maxPowerLevel
```

**Description:** The highest power level that this segment will be used to convert.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### slope (heading level 9)

```
int16_t RAIL_TxPowerCurveSegment_t::slope
```

**Description:** Slope of the line.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### intercept (heading level 9)

```
int32_t RAIL_TxPowerCurveSegment_t::intercept
```

**Description:** Y-intercept of the line.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

Structure containing the min and max values for a given PA and voltage supply combination (in deci-dBm). 

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. 

###### Public Attributes (heading level 8)

###### maxPower (heading level 9)

```
int16_t RAIL_TxPowerCurves_t::maxPower
```

**Description:** Max deci-dBm value.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### minPower (heading level 9)

```
int16_t RAIL_TxPowerCurves_t::minPower
```

**Description:** Min deci-dBm value.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### powerParams (heading level 9)

```
const RAIL_TxPowerCurveSegment_t* RAIL_TxPowerCurves_t::powerParams
```

**Description:** Pointer to an array of [RAIL_TxPowerCurvesConfig_t::piecewiseSegments](rail-tx-power-curves-config-t#piecewise-segments) elements of [RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t) for deci-dBm to raw power level conversion fits.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

Structure containing curve fit information and other metadata required to properly use the WEAK versions of RAIL_ConvertRawToDb and RAIL_ConvertDbmToRaw. 

**Deprecated**This RAIL 2.x enum has been eliminated in RAIL 3 which uses PA power tables instead. 

###### Public Attributes (heading level 8)

###### txPower24HpCurves (heading level 9)

```
const RAIL_TxPowerCurves_t* RAIL_TxPowerCurvesConfig_t::txPower24HpCurves
```

**Description:** Pointer a [RAIL_TxPowerCurves_t](rail-tx-power-curves-t) representing the piecewise linear segments of curves that map power level to power in dBm for the 2.4 GHz high power PA.

**Details:** **Note**

- By the default conversion implementation, segments must be specified in decreasing power order. That is, the 0th entry of this array should be used to convert the highest power (levels). Segment at position n is valid from maxPowerLevel+1 from the segment at n+1 (or 0 if n is array length - 1) to maxPowerLevel of segment n, inclusive.

**Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### txPowerSgCurves (heading level 9)

```
const RAIL_TxPowerCurves_t* RAIL_TxPowerCurvesConfig_t::txPowerSgCurves
```

**Description:** Pointer a [RAIL_TxPowerCurves_t](rail-tx-power-curves-t) representing the piecewise linear segments of curves that map power level to power in dBm for the subgig PA.

**Details:** **Note**

- By the default conversion implementation, segments must be specified in decreasing power order. That is, the 0th entry of this array should be used to convert the highest power (levels). Segment at position n is valid from maxPowerLevel+1 from the segment at n+1 (or 0 if n is array length - 1) to maxPowerLevel of segment n, inclusive.

**Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### txPower24LpCurves (heading level 9)

```
const int16_t* RAIL_TxPowerCurvesConfig_t::txPower24LpCurves
```

**Description:** Look up table for each of the power levels of the 2.4GHz low power amplifier and their equivalent deci-dB value.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### piecewiseSegments (heading level 9)

```
uint8_t RAIL_TxPowerCurvesConfig_t::piecewiseSegments
```

**Description:** The number of piecewise segments provided to the PA in each of the four conversion curve fits.

**Details:** The default is 8, but regardless of the number, it must be the same for all curves.

**Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

Structure containing the min and max values for a given PA and voltage supply combination (in deci-dBm). 

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. See [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t). 

###### Public Attributes (heading level 8)

###### maxPower (heading level 9)

```
int16_t RAIL_TxPowerCurveAlt_t::maxPower
```

**Description:** Max deci-dBm value.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::max_power_ddbm](sl-rail-pa-descriptor-t#max-power-ddbm).

###### minPower (heading level 9)

```
int16_t RAIL_TxPowerCurveAlt_t::minPower
```

**Description:** Min deci-dBm value.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::min_power_ddbm](sl-rail-pa-descriptor-t#min-power-ddbm).

###### powerParams (heading level 9)

```
RAIL_TxPowerCurveSegment_t RAIL_TxPowerCurveAlt_t::powerParams[]
```

**Description:** Array of [RAIL_PaDescriptor_t::segments](rail-pa-descriptor-t#segments)[RAIL_TxPowerCurveSegment_t](rail-tx-power-curve-segment-t) structures for the deci-dBm to raw power level conversion fits.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t::p_power_setting_table](sl-rail-pa-descriptor-t#p-power-setting-table).

Union containing a pointer to algorithm-specific conversion data. 

**Deprecated**This RAIL 2.x type has been eliminated in RAIL 3 by use of PA power tables. See [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t). 

###### Public Attributes (heading level 8)

###### powerCurve (heading level 9)

```
const RAIL_TxPowerCurveAlt_t* RAIL_PowerConversion_t::powerCurve
```

**Description:** Pointer to a powerCurve containing line segment data for the curves corresponding to a specific PA.

**Details:** **Note**

- By the default conversion implementation, segments must be specified in decreasing power order. That is, the 0th entry of this array should be used to convert the highest power (levels). Segment at position n is valid from maxPowerLevel+1 from the segment at n+1 (or 0 if n is array length - 1) to maxPowerLevel of segment n, inclusive.

**Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### mappingTable (heading level 9)

```
const int16_t* RAIL_PowerConversion_t::mappingTable
```

**Description:** Lookup table for PA's which use the mapping table algorithm for converting between deci-dBm and power levels.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

Struct containing specifics of PA configuration. 

PA descriptor as used in the PA conversion functions.

**Deprecated**This RAIL 2.x type has been replaced in RAIL 3 by [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t) with different fields. 

###### Public Attributes (heading level 8)

###### algorithm (heading level 9)

```
RAIL_PaConversionAlgorithm_t RAIL_PaDescriptor_t::algorithm
```

**Description:** Algorithm used to map dBm to power levels for this PA.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### segments (heading level 9)

```
uint8_t RAIL_PaDescriptor_t::segments
```

**Description:** The number of piecewise segments provided to the PA in a piecewise linear curve fit.

**Details:** The default is 8. Should be set to 0 when not using the piecewise linear algorithm.

**Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### min (heading level 9)

```
RAIL_TxPowerLevel_t RAIL_PaDescriptor_t::min
```

**Description:** Min power level for this PA.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### max (heading level 9)

```
RAIL_TxPowerLevel_t RAIL_PaDescriptor_t::max
```

**Description:** Max power level for this PA.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

###### conversion (heading level 9)

```
RAIL_PowerConversion_t RAIL_PaDescriptor_t::conversion
```

**Description:** Union containing a pointer to algorithm-specific conversion data.

**Details:** **Deprecated**This RAIL 2.x field has been eliminated in RAIL 3.

More generic structure containing information about piecewise linear curves and mapping tables, instead of specific PA's. 

**Deprecated**This RAIL 2.x type has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t) with different fields. 

###### Public Attributes (heading level 8)

###### curves (heading level 9)

```
RAIL_PaDescriptor_t RAIL_TxPowerCurvesConfigAlt_t::curves[RAIL_NUM_PA]
```

**Description:** The curves for each PA.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by other [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t) fields.

###### signature (heading level 9)

```
uint32_t RAIL_TxPowerCurvesConfigAlt_t::signature
```

**Description:** Signature used for validation of the curves configuruation.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t::signature](sl-rail-tx-power-table-config-t#signature).

###### paVoltage (heading level 9)

```
uint16_t RAIL_TxPowerCurvesConfigAlt_t::paVoltage
```

**Description:** PA VDD voltage, in millivolts.

**Details:** **Deprecated**This RAIL 2.x field has been replaced in RAIL 3 by [sl_rail_tx_power_table_config_t::pa_voltage_mv](sl-rail-tx-power-table-config-t#pa-voltage-mv) .

###### PA Power Conversions

###### Modules (heading level 7)

[sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t)

[sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t)

###### Variables (heading level 7)

###### sl_rail_util_pa_tx_power_table (heading level 8)

```
const sl_rail_tx_power_table_config_t sl_rail_util_pa_tx_power_table
```

**Description:** The PA table to be used for transmission.

###### Functions (heading level 7)

###### sl_rail_util_pa_init (heading level 8)

`void sl_rail_util_pa_init(void)`

**Description:** Initialize PA dBm conversion for transmit.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### sl_rail_util_pa_post_init (heading level 8)

`sl_rail_status_t sl_rail_util_pa_post_init(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode)`

**Description:** Establish PA mode and related parameters from the PA configuration post [sl_rail_init()](general#sl-rail-init).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|The PA mode to establish.|

**Returns**

- Status code indicating success of the function call.

This function should be called soon after [sl_rail_init()](general#sl-rail-init) when the application is not using the [Callbacks Utility](rail-util-callbacks) component. 

###### sl_rail_util_pa_get_tx_power_limits (heading level 8)

`sl_rail_status_t sl_rail_util_pa_get_tx_power_limits(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)`

**Description:** Get the TX PA power conversion limits for the indicated PA mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|The PA mode to use for the conversion. If this is [SL_RAIL_TX_PA_MODE_INVALID](pa#sl-rail-tx-pa-mode-invalid) then the PA mode associated with the current channel configuration is used.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_min_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t); may be NULL.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_max_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t); may be NULL.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_step_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t); may be NULL.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_util_pa_convert_power_to_actual (heading level 8)

`sl_rail_status_t sl_rail_util_pa_convert_power_to_actual(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_ddbm)`

**Description:** Convert requested power to actual power achievable for the indicated PA mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|The PA mode to use for the conversion. If this is [SL_RAIL_TX_PA_MODE_INVALID](pa#sl-rail-tx-pa-mode-invalid) then the PA mode associated with the current channel configuration is used.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[inout]|p_ddbm|A non-NULL pointer to the deci-dBm value to convert, which the function updates with the resulting actual power based on the power conversion algorithm for the currently selected PA when returning success.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function does not take into account any channel configuration power restrictions.

###### sl_rail_util_pa_get_tx_power_config_2p4ghz (heading level 8)

`RAIL_TxPowerConfig_t * sl_rail_util_pa_get_tx_power_config_2p4ghz(void)`

**Description:** Returns a RAIL 2.x compatible power configuration for the default 2.4 GHz PA selection on platforms that support the 2.4 GHz band, or NULL otherise.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- A pointer to the TX Power Config stucture.

**Deprecated**This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init). 

###### sl_rail_util_pa_get_tx_power_config_subghz (heading level 8)

`RAIL_TxPowerConfig_t * sl_rail_util_pa_get_tx_power_config_subghz(void)`

**Description:** Returns a RAIL 2.x compatible power configuration for the default Sub-GHz PA selection on platforms that support the Sub-GHz band, or NULL otherise.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- A pointer to the TX Power Config stucture.

**Deprecated**This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init). 

###### sl_rail_util_pa_get_tx_power_config_ofdm (heading level 8)

`RAIL_TxPowerConfig_t * sl_rail_util_pa_get_tx_power_config_ofdm(void)`

**Description:** Returns a RAIL 2.x compatible power configuration for the default OFDM PA selection on platforms that support OFDM, or NULL otherise.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- A pointer to the TX Power Config stucture.

**Deprecated**This RAIL 2.x function should be replaced in RAIL 3 by use of [sl_rail_util_pa_post_init()](pa-power-conversions#sl-rail-util-pa-post-init). 

###### sl_rail_util_pa_init_tx_power_table (heading level 8)

`sl_rail_status_t sl_rail_util_pa_init_tx_power_table(sl_rail_handle_t radio_handle, const sl_rail_tx_power_table_config_t *p_tx_power_table_config)`

**Description:** Initialize Transmit power tables.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|radio_handle|A radio-generic RAIL handle.|
|const [sl_rail_tx_power_table_config_t](sl-rail-tx-power-table-config-t) *|[in]|p_tx_power_table_config|A pointer to the TX power table to use.|

**Returns**

- Status code indicating success of the function call.

###### sl_rail_util_pa_on_channel_config_change (heading level 8)

`void sl_rail_util_pa_on_channel_config_change(sl_rail_handle_t rail_handle, const sl_rail_channel_config_entry_t *p_entry)`

**Description:** Provide a channel config change callback capable of configuring the PA correctly.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|The real RAIL handle being passed into this callback.|
|const [sl_rail_channel_config_entry_t](sl-rail-channel-config-entry-t) *|[in]|p_entry|A pointer to the channel config entry being switched to by hardware.|

###### sl_rail_util_pa_get_power_setting_table (heading level 8)

`const sl_rail_pa_power_setting_t * sl_rail_util_pa_get_power_setting_table(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)`

**Description:** Get the TX PA power setting table and related values.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|PA mode for which to get the powersetting table.|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_min_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_max_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).|
|[sl_rail_tx_power_t](pa#sl-rail-tx-power-t) *|[out]|p_step_ddbm|A pointer to a [sl_rail_tx_power_t](pa#sl-rail-tx-power-t).|

**Returns**

- Power setting table start address. When NULL is returned all out params above won't be set.

Use the new API [sl_rail_util_pa_get_power_table_info()](pa-power-conversions#sl-rail-util-pa-get-power-table-info) instead as it also provides the complete PA descriptor of the respective mode. 

###### sl_rail_util_pa_get_power_table_info (heading level 8)

`const sl_rail_pa_descriptor_t * sl_rail_util_pa_get_power_table_info(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode)`

**Description:** Get the TX PA power setting table and related values.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_handle_t](general#sl-rail-handle-t)|[in]|rail_handle|A real RAIL instance handle.|
|[sl_rail_tx_pa_mode_t](pa#sl-rail-tx-pa-mode-t)|[in]|pa_mode|PA mode for which to get the powersetting table.|

**Returns**

- Power setting table descriptor for the respective mode. When NULL is returned, it means the pa_mode parameter is invalid.

Struct containing specifics of PA configuration. 

PA descriptor as used in the PA conversion functions. 

###### Public Attributes (heading level 8)

###### p_power_setting_table (heading level 9)

```
const int32_t* sl_rail_pa_descriptor_t::p_power_setting_table
```

**Description:** Lookup table for PA's to convert between deci-dBm and power levels.

**Details:** An entry in the powersetting table has the below bitfields: |15-14 =sub-mode|13-8:unused|7-0:scalor(stripe+slice)|

###### min_power_ddbm (heading level 9)

```
sl_rail_tx_power_t sl_rail_pa_descriptor_t::min_power_ddbm
```

**Description:** Min power in deci-dBm for this PA.

###### max_power_ddbm (heading level 9)

```
sl_rail_tx_power_t sl_rail_pa_descriptor_t::max_power_ddbm
```

**Description:** Max power in deci-dBm for this PA.

###### step_power_ddbm (heading level 9)

```
sl_rail_tx_power_t sl_rail_pa_descriptor_t::step_power_ddbm
```

**Description:** Table step size in deci-dBm for this PA.

###### num_of_values (heading level 9)

```
uint16_t sl_rail_pa_descriptor_t::num_of_values
```

**Description:** The number of powersetting entries present in the table.

More generic structure containing information about mapping tables, instead of specific PA's. 

###### Public Attributes (heading level 8)

###### p_pa_table_descriptor (heading level 9)

```
sl_rail_pa_descriptor_t* sl_rail_tx_power_table_config_t::p_pa_table_descriptor
```

**Description:** Descriptor for each PA.

###### signature (heading level 9)

```
uint32_t sl_rail_tx_power_table_config_t::signature
```

**Description:** Signature used for validation of the configuruation.

###### pa_voltage_mv (heading level 9)

```
uint16_t sl_rail_tx_power_table_config_t::pa_voltage_mv
```

**Description:** PA VDD voltage, in millivolts.

###### num_of_tables (heading level 9)

```
uint8_t sl_rail_tx_power_table_config_t::num_of_tables
```

**Description:** Number of tables available.

###### padding (heading level 9)

```
uint8_t sl_rail_tx_power_table_config_t::padding
```

**Description:** Padding to align the structures to 32bits.

#### TrustZone

APIs to use RAIL with TrustZone enabled and peripherals configured as secure. 

RAIL internally accesses CMU, EMU, GPIO, LDMA, HFXO, PRS and SYSRTC. If some of them are configured as secure peripherals, some RAIL code must be executed as secure code. To do so, callbacks gathered in [RAIL_TZ_Config_t](rail-tz-config-t) must be implemented and passed to RAIL through [RAIL_TZ_InitNonSecure()](trust-zone#rail-tz-init-non-secure). Each callback must do the non-secure/secure transition, call [RAIL_TZ_CheckPeripheralsSecureStates()](trust-zone#rail-tz-check-peripherals-secure-states) and then call the corresponding RAIL API from secure world:

|Secure peripheral|Callbacks to implement|
|---|---|
|CMU|[RAIL_TZ_Config_t::changedDcdcCallback](rail-tz-config-t#changed-dcdc-callback), [RAIL_TZ_Config_t::configAntennaGpioCallback](rail-tz-config-t#config-antenna-gpio-callback), [RAIL_TZ_Config_t::radioClockEnableCallback](rail-tz-config-t#radio-clock-enable-callback), [RAIL_TZ_Config_t::getRadioClockFreqHzCallback](rail-tz-config-t#get-radio-clock-freq-hz-callback), [RAIL_TZ_Config_t::rfecaClockEnableCallback](rail-tz-config-t#rfeca-clock-enable-callback), [RAIL_TZ_Config_t::rfecaIsClockEnabledCallback](rail-tz-config-t#rfeca-is-clock-enabled-callback)|
|EMU|[RAIL_TZ_Config_t::readInternalTemperatureCallback](rail-tz-config-t#read-internal-temperature-callback), [RAIL_TZ_Config_t::enableSecureRadioIrqsCallback](rail-tz-config-t#enable-secure-radio-irqs-callback), [RAIL_TZ_Config_t::disableSecureRadioIrqsCallback](rail-tz-config-t#disable-secure-radio-irqs-callback)|
|GPIO|[RAIL_TZ_Config_t::configAntennaGpioCallback](rail-tz-config-t#config-antenna-gpio-callback)|
|LDMA|[RAIL_TZ_Config_t::radioPerformM2mLdmaCallback](rail-tz-config-t#radio-perform-m2m-ldma-callback)|
|HFXO|[RAIL_TZ_Config_t::configureHfxoCallback](rail-tz-config-t#configure-hfxo-callback)|

RAIL internally calls platform functions that access CMU, EMU, GPIO, LDMA HFXO and PRS. If some of them are configured as secure peripherals, some functions must be executed as secure code. To do so, those functions are prepended with weak symbols and must be overwritten to do the non-secure/secure transition and call the corresponding platform function from secure world:

|Secure peripheral|Platform functions to overwrite|
|---|---|
|CMU|CMU_ClockEnable, EMU_DCDCSetPFMXTimeoutMaxCtrl (DCDC access: SL_TRUSTZONE_PERIPHERAL_DCDC_S)|
|HFXO|CMU_HFXOCTuneSet, CMU_HFXOCTuneGet, CMU_HFXOCoreBiasCurrentCalibrate|
|PRS|PRS_SourceAsyncSignalSet, PRS_GetFreeChannel, PRS_ConnectConsumer, PRS_PinOutput, PRS_Combine|

When there is a combination of secure and non-secure peripherals, defines must be added in secure application slcp file so non-secure peripherals can properly accessed by secure code. Example with only CMU non-secure:

```c
define:
  - name: SL_TRUSTZONE_PERIPHERAL_CMU_S
    value: 0
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_EMU_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_GPIO_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_LDMA_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_HFXO0_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_PRS_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_SYSRTC_S
    value: 1
    condition: [trustzone_secure]

```

Some RAIL API are not suppoted with EMU, GPIO, LDMA, HFXO, PRS or SYSRTC configured secure:

|Secure peripheral|Unsupported RAIL API/features|
|---|---|
|EMU|[RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement), [RAIL_InitPowerManager()](sleep#rail-init-power-manager)|
|GPIO|[RAIL_EnableDirectMode()](diagnostic#rail-enable-direct-mode), [RAIL_EnableDirectModeAlt()](diagnostic#rail-enable-direct-mode-alt), [RAIL_EnablePti()](pti#rail-enable-pti), [RAIL_ConfigPti()](pti#rail-config-pti), [RAIL_ConfigHFXOThermistor()](external-thermistor#rail-config-hfxo-thermistor), [RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement), [RAIL_ConfigVdet()](vdet#rail-config-vdet), [RAIL_BLE_ConfigAoxAntenna()](ao-x#rail-ble-config-aox-antenna)|
|LDMA|[RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#rail-ieee802154-supports-rx-channel-switching-1) ([RAIL_IEEE802154_ConfigRxChannelSwitching()](ieee802-15-4#rail-ieee802154-config-rx-channel-switching) and [RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#rail-rx-option-channel-switching))|
|HFXO|[RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement), [RAIL_EnableVdet()](vdet#rail-enable-vdet), [RAIL_GetVdet()](vdet#rail-get-vdet)|
|PRS|[RAIL_EnablePrsLnaBypass()](receive#rail-enable-prs-lna-bypass)|
|SYSRTC|[RAIL_ConfigSleep()](sleep#rail-config-sleep) with [RAIL_SleepConfig_t::RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled), [RAIL_ConfigSleepAlt()](sleep#rail-config-sleep-alt) with [RAIL_SleepConfig_t::RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled)|

RAIL internally accesses CMU, EMU, GPIO, LDMA, HFXO, PRS and SYSRTC. If some of them are configured as secure peripherals, some RAIL code must be executed as secure code. To do so, callbacks gathered in [sl_rail_tz_config_t](sl-rail-tz-config-t) must be implemented and passed to RAIL through [sl_rail_tz_init_non_secure()](trust-zone#sl-rail-tz-init-non-secure). Each callback must do the non-secure/secure transition, call [sl_rail_tz_check_peripherals_secure_states()](trust-zone#sl-rail-tz-check-peripherals-secure-states) and then call the corresponding RAIL API from secure world:

|Secure peripheral|Callbacks to implement|
|---|---|
|CMU|[sl_rail_tz_config_t::changed_dcdc_callback](sl-rail-tz-config-t#changed-dcdc-callback), [sl_rail_tz_config_t::config_antenna_gpio_callback](sl-rail-tz-config-t#config-antenna-gpio-callback), [sl_rail_tz_config_t::radio_clock_enable_callback](sl-rail-tz-config-t#radio-clock-enable-callback), [sl_rail_tz_config_t::get_radio_clock_freq_hz_callback](sl-rail-tz-config-t#get-radio-clock-freq-hz-callback), [sl_rail_tz_config_t::rfeca_clock_enable_callback](sl-rail-tz-config-t#rfeca-clock-enable-callback), [sl_rail_tz_config_t::rfeca_is_clock_enabled_callback](sl-rail-tz-config-t#rfeca-is-clock-enabled-callback)|
|EMU|[sl_rail_tz_config_t::read_internal_temperature_callback](sl-rail-tz-config-t#read-internal-temperature-callback), [sl_rail_tz_config_t::enable_secure_radio_irqs_callback](sl-rail-tz-config-t#enable-secure-radio-irqs-callback), [sl_rail_tz_config_t::disable_secure_radio_irqs_callback](sl-rail-tz-config-t#disable-secure-radio-irqs-callback)|
|GPIO|[sl_rail_tz_config_t::config_antenna_gpio_callback](sl-rail-tz-config-t#config-antenna-gpio-callback)|
|HFXO|[sl_rail_tz_config_t::configure_hfxo_callback](sl-rail-tz-config-t#configure-hfxo-callback)|

RAIL internally calls platform functions that access CMU, EMU, GPIO, LDMA HFXO and PRS. If some of them are configured as secure peripherals, some functions must be executed as secure code. To do so, those functions are prepended with weak symbols and must be overwritten to do the non-secure/secure transition and call the corresponding platform function from secure world:

|Secure peripheral|Platform functions to overwrite|
|---|---|
|CMU|CMU_ClockEnable, EMU_DCDCSetPFMXTimeoutMaxCtrl (DCDC access: SL_TRUSTZONE_PERIPHERAL_DCDC_S)|
|HFXO|CMU_HFXOCTuneSet, CMU_HFXOCTuneGet, CMU_HFXOCoreBiasCurrentCalibrate|
|PRS|PRS_SourceAsyncSignalSet, PRS_GetFreeChannel, PRS_ConnectConsumer, PRS_PinOutput, PRS_Combine|

When there is a combination of secure and non-secure peripherals, defines must be added in secure application slcp file so non-secure peripherals can properly accessed by secure code. Example with only CMU non-secure:

```c
define:
  - name: SL_TRUSTZONE_PERIPHERAL_CMU_S
    value: 0
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_EMU_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_GPIO_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_LDMA_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_HFXO0_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_PRS_S
    value: 1
    condition: [trustzone_secure]
  - name: SL_TRUSTZONE_PERIPHERAL_SYSRTC_S
    value: 1
    condition: [trustzone_secure]

```

Some RAIL API are not suppoted with EMU, GPIO LDMA, HFXO, PRS or SYSRTC configured secure:

|Secure peripheral|Unsupported RAIL API/features|
|---|---|
|EMU|[sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement), [sl_rail_init_power_manager()](sleep#sl-rail-init-power-manager)|
|GPIO|[sl_rail_enable_direct_mode()](diagnostic#sl-rail-enable-direct-mode), [sl_rail_enable_pti()](pti#sl-rail-enable-pti), [sl_rail_config_pti()](pti#sl-rail-config-pti), [sl_rail_config_hfxo_thermistor()](external-thermistor#sl-rail-config-hfxo-thermistor), [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement), [sl_rail_config_vdet()](vdet#sl-rail-config-vdet), [sl_rail_ble_config_aox_antenna()](ao-x#sl-rail-ble-config-aox-antenna)|
|LDMA|[SL_RAIL_IEEE802154_SUPPORTS_RX_CHANNEL_SWITCHING](features#sl-rail-ieee802154-supports-rx-channel-switching-1) ([sl_rail_ieee802154_config_rx_channel_switching()](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching) and [SL_RAIL_RX_OPTION_CHANNEL_SWITCHING](receive#sl-rail-rx-option-channel-switching))|
|HFXO|[sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement), [sl_rail_enable_vdet()](vdet#sl-rail-enable-vdet), [sl_rail_get_vdet()](vdet#sl-rail-get-vdet)|
|PRS|[sl_rail_enable_prs_lna_bypass()](receive#sl-rail-enable-prs-lna-bypass)|
|SYSRTC|[sl_rail_config_sleep()](sleep#sl-rail-config-sleep) with [sl_rail_sleep_config_t::SL_RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#sl-rail-sleep-config-timersync-enabled)|

##### Modules

[RAIL_TZ_Config_t](rail-tz-config-t)

[sl_rail_tz_config_t](sl-rail-tz-config-t)

##### Typedefs

###### RAIL_TZ_ChangedDcdcCallbackPtr_t

`RAIL_TZ_ChangedDcdcCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_ChangedDcdc()](retiming#rail-changed-dcdc).

**Details:**

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_changed_dcdc_callback_t()](trust-zone#sl-rail-tz-changed-dcdc-callback-t).

###### RAIL_TZ_ConfigAntennaGpioCallbackPtr_t

`RAIL_TZ_ConfigAntennaGpioCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_ConfigAntennaGpio()](trust-zone#rail-tz-config-antenna-gpio).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Details:**

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_antenna_gpio_callback_t()](trust-zone#sl-rail-tz-config-antenna-gpio-callback-t).

###### RAIL_TZ_RadioClockEnableCallbackPtr_t

`RAIL_TZ_RadioClockEnableCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_RadioClockEnable()](trust-zone#rail-tz-radio-clock-enable).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_radio_clock_enable_callback_t()](trust-zone#sl-rail-tz-radio-clock-enable-callback-t).

###### RAIL_TZ_GetRadioClockFreqHzCallbackPtr_t

`RAIL_TZ_GetRadioClockFreqHzCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_GetRadioClockFreqHz()](diagnostic#rail-get-radio-clock-freq-hz).

**Details:**

**Returns**

- Radio subsystem clock frequency in Hz.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_get_radio_clock_freq_hz_callback_t()](trust-zone#sl-rail-tz-get-radio-clock-freq-hz-callback-t).

###### RAIL_TZ_RfecaClockEnableCallbackPtr_t

`RAIL_TZ_RfecaClockEnableCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_RfecaClockEnable()](trust-zone#rail-tz-rfeca-clock-enable).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_rfeca_clock_enable_callback_t()](trust-zone#sl-rail-tz-rfeca-clock-enable-callback-t).

###### RAIL_TZ_RfecaIsClockEnabledCallbackPtr_t

`RAIL_TZ_RfecaIsClockEnabledCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_RfecaIsClockEnabled()](trust-zone#rail-tz-rfeca-is-clock-enabled).

**Details:**

**Returns**

- true if RFECA clocks are enabled; false otherwise

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_rfeca_is_clock_enabled_callback_t()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled-callback-t).

###### RAIL_TZ_ReadInternalTemperatureCallbackPtr_t

`RAIL_TZ_ReadInternalTemperatureCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_ReadInternalTemperature()](trust-zone#rail-tz-read-internal-temperature).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[out]|internalTemperatureKelvin|A pointer to the internal temperature in Kelvin.|
||[in]|enableTemperatureInterrupts|Indicate whether temperature interrupts are enabled.|

**Details:**

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_read_internal_temperature_callback_t()](trust-zone#sl-rail-tz-read-internal-temperature-callback-t).

###### RAIL_TZ_EnableSecureRadioIrqsCallbackPtr_t

`RAIL_TZ_EnableSecureRadioIrqsCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_EnableSecureRadioIrqs()](trust-zone#rail-tz-enable-secure-radio-irqs).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_enable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-enable-secure-radio-irqs-callback-t).

###### RAIL_TZ_DisableSecureRadioIrqsCallbackPtr_t

`RAIL_TZ_DisableSecureRadioIrqsCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_DisableSecureRadioIrqs()](trust-zone#rail-tz-disable-secure-radio-irqs).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_disable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-disable-secure-radio-irqs-callback-t).

###### RAIL_TZ_RadioPerformM2mLdmaCallbackPtr_t

`RAIL_TZ_RadioPerformM2mLdmaCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_RadioPerformM2mLdma()](trust-zone#rail-tz-radio-perform-m2m-ldma).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|pDest|A pointer to the destination data.|
||[in]|pSrc|A pointer to the source data.|
||[in]|numWords|Number of words to transfer.|

**Details:**

**Returns**

- Status code indicating success of the function call.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_radio_perform_m2m_ldma_callback_t()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma-callback-t).

###### RAIL_TZ_ConfigureHfxoCallbackPtr_t

`RAIL_TZ_ConfigureHfxoCallbackPtr_t`

**Description:**

A pointer to the callback used to switch to secure world and run [RAIL_TZ_ConfigureHfxo()](trust-zone#rail-tz-configure-hfxo).

**Details:**

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_configure_hfxo_callback_t()](trust-zone#sl-rail-tz-configure-hfxo-callback-t).

###### sl_rail_tz_changed_dcdc_callback_t

`sl_rail_tz_changed_dcdc_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_changed_dcdc()](retiming#sl-rail-changed-dcdc).

**Details:**

**Returns**

- Status code indicating success of the function call.

###### sl_rail_tz_config_antenna_gpio_callback_t

`sl_rail_tz_config_antenna_gpio_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_config_antenna_gpio()](trust-zone#sl-rail-tz-config-antenna-gpio).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|p_config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Details:**

**Returns**

- Status code indicating success of the function call.

###### sl_rail_tz_radio_clock_enable_callback_t

`sl_rail_tz_radio_clock_enable_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_radio_clock_enable()](trust-zone#sl-rail-tz-radio-clock-enable).

###### sl_rail_tz_get_radio_clock_freq_hz_callback_t

`sl_rail_tz_get_radio_clock_freq_hz_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_get_radio_clock_freq_hz()](diagnostic#sl-rail-get-radio-clock-freq-hz).

**Details:**

**Returns**

- Radio subsystem clock frequency in Hz.

###### sl_rail_tz_rfeca_clock_enable_callback_t

`sl_rail_tz_rfeca_clock_enable_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_rfeca_clock_enable()](trust-zone#sl-rail-tz-rfeca-clock-enable).

###### sl_rail_tz_rfeca_is_clock_enabled_callback_t

`sl_rail_tz_rfeca_is_clock_enabled_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_rfeca_is_clock_enabled()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled).

**Details:**

**Returns**

- true if RFECA clocks are enabled; false otherwise

###### sl_rail_tz_read_internal_temperature_callback_t

`sl_rail_tz_read_internal_temperature_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_read_internal_temperature()](trust-zone#sl-rail-tz-read-internal-temperature).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[out]|p_internal_temperature_kelvin|A pointer to the internal temperature in Kelvin.|
||[in]|enable_temperature_interrupts|Indicate whether temperature interrupts are enabled.|

**Details:**

**Returns**

- Status code indicating success of the function call.

###### sl_rail_tz_enable_secure_radio_irqs_callback_t

`sl_rail_tz_enable_secure_radio_irqs_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_enable_secure_radio_irqs()](trust-zone#sl-rail-tz-enable-secure-radio-irqs).

###### sl_rail_tz_disable_secure_radio_irqs_callback_t

`sl_rail_tz_disable_secure_radio_irqs_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_disable_secure_radio_irqs()](trust-zone#sl-rail-tz-disable-secure-radio-irqs).

###### sl_rail_tz_radio_perform_m2m_ldma_callback_t

`sl_rail_tz_radio_perform_m2m_ldma_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_radio_perform_m2m_ldma()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma).

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
||[in]|p_dest|A pointer to the destination data.|
||[in]|p_src|A pointer to the source data.|
||[in]|num_words|Number of words to transfer.|

**Details:**

**Returns**

- Status code indicating success of the function call.

###### sl_rail_tz_configure_hfxo_callback_t

`sl_rail_tz_configure_hfxo_callback_t`

**Description:**

A pointer to the callback used to switch to secure world and run [sl_rail_tz_configure_hfxo()](trust-zone#sl-rail-tz-configure-hfxo).

##### Functions

###### RAIL_TZ_InitNonSecure

`RAIL_Status_t RAIL_TZ_InitNonSecure(const RAIL_TZ_Config_t *pTzConfig)`

**Description:** Init RAIL TrustZone feature for non-secure world.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [RAIL_TZ_Config_t](rail-tz-config-t) *|[in]|pTzConfig|A non-NULL pointer to a [RAIL_TZ_Config_t](rail-tz-config-t) structure.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from non-secure world (only if TrustZone is activated) on platforms having [RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#rail-supports-trustzone-secure-peripherals). It must be called before [RAIL_Init()](general#rail-init) and it must be called again with updated [RAIL_TZ_Config_t](rail-tz-config-t) if peripherals secure configuration has changed.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_init_non_secure()](trust-zone#sl-rail-tz-init-non-secure). 

###### RAIL_TZ_InitSecure

`RAIL_Status_t RAIL_TZ_InitSecure(void)`

**Description:** Init RAIL TrustZone feature for secure world.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world (only if TrustZone is activated) on platforms having [RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#rail-supports-trustzone-secure-peripherals). It must be called before starting the non-secure application.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_init_secure()](trust-zone#sl-rail-tz-init-secure). 

###### RAIL_TZ_CheckPeripheralsSecureStates

`RAIL_Status_t RAIL_TZ_CheckPeripheralsSecureStates(void)`

**Description:** Check the secure state of peripherals used by RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world and it must be called at the beginning of each RAIL TrustZone callbacks ([RAIL_TZ_Config_t](rail-tz-config-t)) secure code to avoid secure fault.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_check_peripherals_secure_states()](trust-zone#sl-rail-tz-check-peripherals-secure-states). 

###### RAIL_TZ_RadioClockEnable

`RAIL_Status_t RAIL_TZ_RadioClockEnable(void)`

**Description:** Enable radio clocks.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_radio_clock_enable()](trust-zone#sl-rail-tz-radio-clock-enable). 

###### RAIL_TZ_RfecaClockEnable

`RAIL_Status_t RAIL_TZ_RfecaClockEnable(void)`

**Description:** Enable RFECA clocks.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_rfeca_clock_enable()](trust-zone#sl-rail-tz-rfeca-clock-enable). 

###### RAIL_TZ_RfecaIsClockEnabled

`bool RAIL_TZ_RfecaIsClockEnabled(void)`

**Description:** Indicate whether RFECA clocks are enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- true if RFECA clocks are enabled; false otherwise

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_rfeca_is_clock_enabled()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled). 

###### RAIL_TZ_ReadInternalTemperature

`RAIL_Status_t RAIL_TZ_ReadInternalTemperature(uint16_t *internalTemperatureKelvin, bool enableTemperatureInterrupts)`

**Description:** Read the internal temperature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t *|[out]|internalTemperatureKelvin|A pointer to the internal temperature in Kelvin.|
|bool|[in]|enableTemperatureInterrupts|Indicate whether temperature interrupts are enabled.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_read_internal_temperature()](trust-zone#sl-rail-tz-read-internal-temperature). 

###### RAIL_TZ_EnableSecureRadioIrqs

`RAIL_Status_t RAIL_TZ_EnableSecureRadioIrqs(void)`

**Description:** Enable secure peripheral interrupts needed by the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_enable_secure_radio_irqs()](trust-zone#sl-rail-tz-enable-secure-radio-irqs). 

###### RAIL_TZ_DisableSecureRadioIrqs

`RAIL_Status_t RAIL_TZ_DisableSecureRadioIrqs(void)`

**Description:** Disable secure peripheral interrupts needed by the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_disable_secure_radio_irqs()](trust-zone#sl-rail-tz-disable-secure-radio-irqs). 

###### RAIL_TZ_RadioPerformM2mLdma

`RAIL_Status_t RAIL_TZ_RadioPerformM2mLdma(uint32_t *pDest, const uint32_t *pSrc, uint32_t numWords)`

**Description:** Perform ldma transfer for the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint32_t *|[in]|pDest|A pointer to the destination data.|
|const uint32_t *|[in]|pSrc|A pointer to the source data.|
|uint32_t|[in]|numWords|Number of words to transfer.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when LDMA is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_radio_perform_m2m_ldma()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma). 

###### RAIL_TZ_ConfigureHfxo

`RAIL_Status_t RAIL_TZ_ConfigureHfxo(void)`

**Description:** Configure HFXO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when HFXO is configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_configure_hfxo()](trust-zone#sl-rail-tz-configure-hfxo). 

###### RAIL_TZ_ConfigAntennaGpio

`RAIL_Status_t RAIL_TZ_ConfigAntennaGpio(const RAIL_AntennaConfig_t *config)`

**Description:** Set GPIO for antenna config.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [RAIL_AntennaConfig_t](rail-antenna-config-t) *|[in]|config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU or GPIO are configured as secure TrustZone peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_antenna_gpio()](trust-zone#sl-rail-tz-config-antenna-gpio). 

###### sl_rail_tz_init_non_secure

`sl_rail_status_t sl_rail_tz_init_non_secure(const sl_rail_tz_config_t *p_tz_config)`

**Description:** Init RAIL TrustZone feature for non-secure world.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [sl_rail_tz_config_t](sl-rail-tz-config-t) *|[in]|p_tz_config|A non-NULL pointer to a [sl_rail_tz_config_t](sl-rail-tz-config-t) structure.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from non-secure world (only if TrustZone is activated) on platforms having [SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#sl-rail-supports-trustzone-secure-peripherals-1). It must be called before [sl_rail_init()](general#sl-rail-init) and it must be called again with updated [sl_rail_tz_config_t](sl-rail-tz-config-t) if peripherals secure configuration has changed.

###### sl_rail_tz_init_secure

`sl_rail_status_t sl_rail_tz_init_secure(void)`

**Description:** Init RAIL TrustZone feature for secure world.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world (only if TrustZone is activated) on platforms having [SL_RAIL_SUPPORTS_TRUSTZONE_SECURE_PERIPHERALS](features#sl-rail-supports-trustzone-secure-peripherals-1). It must be called before starting the non-secure application.

###### sl_rail_tz_check_peripherals_secure_states

`sl_rail_status_t sl_rail_tz_check_peripherals_secure_states(void)`

**Description:** Check the secure state of peripherals used by RAIL.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world and it must be called at the beginning of each RAIL TrustZone callbacks ([sl_rail_tz_config_t](sl-rail-tz-config-t)) secure code to avoid secure fault.

###### sl_rail_tz_radio_clock_enable

`sl_rail_status_t sl_rail_tz_radio_clock_enable(void)`

**Description:** Enable radio clocks.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_rfeca_clock_enable

`sl_rail_status_t sl_rail_tz_rfeca_clock_enable(void)`

**Description:** Enable RFECA clocks.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_rfeca_is_clock_enabled

`bool sl_rail_tz_rfeca_is_clock_enabled(void)`

**Description:** Indicate whether RFECA clocks are enabled.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- true if RFECA clocks are enabled; false otherwise

**Note**

- This function must only be called from secure world when CMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_read_internal_temperature

`sl_rail_status_t sl_rail_tz_read_internal_temperature(uint16_t *p_internal_temperature_kelvin, bool enable_temperature_interrupts)`

**Description:** Read the internal temperature.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t *|[out]|p_internal_temperature_kelvin|A pointer to the internal temperature in Kelvin.|
|bool|[in]|enable_temperature_interrupts|Indicate whether temperature interrupts are enabled.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_enable_secure_radio_irqs

`sl_rail_status_t sl_rail_tz_enable_secure_radio_irqs(void)`

**Description:** Enable secure peripheral interrupts needed by the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_disable_secure_radio_irqs

`sl_rail_status_t sl_rail_tz_disable_secure_radio_irqs(void)`

**Description:** Disable secure peripheral interrupts needed by the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when EMU is configured as secure TrustZone peripheral.

###### sl_rail_tz_radio_perform_m2m_ldma

`sl_rail_status_t sl_rail_tz_radio_perform_m2m_ldma(uint32_t *p_dest, const uint32_t *p_src, uint32_t num_words)`

**Description:** Perform ldma transfer for the radio.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint32_t *|[in]|p_dest|A pointer to the destination data.|
|const uint32_t *|[in]|p_src|A pointer to the source data.|
|uint32_t|[in]|num_words|Number of words to transfer.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when LDMA is configured as secure TrustZone peripheral.

###### sl_rail_tz_configure_hfxo

`sl_rail_status_t sl_rail_tz_configure_hfxo(void)`

**Description:** Configure HFXO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when HFXO is configured as secure TrustZone peripheral.

###### sl_rail_tz_config_antenna_gpio

`sl_rail_status_t sl_rail_tz_config_antenna_gpio(const sl_rail_antenna_config_t *p_config)`

**Description:** Set GPIO for antenna config.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const [sl_rail_antenna_config_t](sl-rail-antenna-config-t) *|[in]|p_config|A pointer to a configuration structure applied to the relevant Antenna Configuration registers. A NULL configuration will produce undefined behavior.|

**Returns**

- Status code indicating success of the function call.

**Note**

- This function must only be called from secure world when CMU or GPIO are configured as secure TrustZone peripherals.

Gather RAIL TrustZone callbacks pointers and booleans indicating peripheral secure configuration. 

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t](sl-rail-tz-config-t). 

###### Public Attributes

###### changedDcdcCallback (heading level 7)

```
RAIL_TZ_ChangedDcdcCallbackPtr_t RAIL_TZ_Config_t::changedDcdcCallback
```

**Description:** See [RAIL_TZ_ChangedDcdcCallbackPtr_t()](trust-zone#rail-tz-changed-dcdc-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::changed_dcdc_callback](sl-rail-tz-config-t#changed-dcdc-callback).

###### configAntennaGpioCallback (heading level 7)

```
RAIL_TZ_ConfigAntennaGpioCallbackPtr_t RAIL_TZ_Config_t::configAntennaGpioCallback
```

**Description:** See [RAIL_TZ_ConfigAntennaGpioCallbackPtr_t()](trust-zone#rail-tz-config-antenna-gpio-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU and GPIO are non-secure peripherals.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::config_antenna_gpio_callback](sl-rail-tz-config-t#config-antenna-gpio-callback).

###### radioClockEnableCallback (heading level 7)

```
RAIL_TZ_RadioClockEnableCallbackPtr_t RAIL_TZ_Config_t::radioClockEnableCallback
```

**Description:** See [RAIL_TZ_RadioClockEnableCallbackPtr_t()](trust-zone#rail-tz-radio-clock-enable-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::radio_clock_enable_callback](sl-rail-tz-config-t#radio-clock-enable-callback).

###### getRadioClockFreqHzCallback (heading level 7)

```
RAIL_TZ_GetRadioClockFreqHzCallbackPtr_t RAIL_TZ_Config_t::getRadioClockFreqHzCallback
```

**Description:** See [RAIL_TZ_GetRadioClockFreqHzCallbackPtr_t()](trust-zone#rail-tz-get-radio-clock-freq-hz-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::get_radio_clock_freq_hz_callback](sl-rail-tz-config-t#get-radio-clock-freq-hz-callback).

###### rfecaClockEnableCallback (heading level 7)

```
RAIL_TZ_RfecaClockEnableCallbackPtr_t RAIL_TZ_Config_t::rfecaClockEnableCallback
```

**Description:** See [RAIL_TZ_RfecaClockEnableCallbackPtr_t()](trust-zone#rail-tz-rfeca-clock-enable-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::rfeca_clock_enable_callback](sl-rail-tz-config-t#rfeca-clock-enable-callback).

###### rfecaIsClockEnabledCallback (heading level 7)

```
RAIL_TZ_RfecaIsClockEnabledCallbackPtr_t RAIL_TZ_Config_t::rfecaIsClockEnabledCallback
```

**Description:** See [RAIL_TZ_RfecaIsClockEnabledCallbackPtr_t()](trust-zone#rail-tz-rfeca-is-clock-enabled-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::rfeca_is_clock_enabled_callback](sl-rail-tz-config-t#rfeca-is-clock-enabled-callback).

###### readInternalTemperatureCallback (heading level 7)

```
RAIL_TZ_ReadInternalTemperatureCallbackPtr_t RAIL_TZ_Config_t::readInternalTemperatureCallback
```

**Description:** See [RAIL_TZ_ReadInternalTemperatureCallbackPtr_t()](trust-zone#rail-tz-read-internal-temperature-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::read_internal_temperature_callback](sl-rail-tz-config-t#read-internal-temperature-callback).

###### enableSecureRadioIrqsCallback (heading level 7)

```
RAIL_TZ_EnableSecureRadioIrqsCallbackPtr_t RAIL_TZ_Config_t::enableSecureRadioIrqsCallback
```

**Description:** See [RAIL_TZ_EnableSecureRadioIrqsCallbackPtr_t()](trust-zone#rail-tz-enable-secure-radio-irqs-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::enable_secure_radio_irqs_callback](sl-rail-tz-config-t#enable-secure-radio-irqs-callback).

###### disableSecureRadioIrqsCallback (heading level 7)

```
RAIL_TZ_DisableSecureRadioIrqsCallbackPtr_t RAIL_TZ_Config_t::disableSecureRadioIrqsCallback
```

**Description:** See [RAIL_TZ_DisableSecureRadioIrqsCallbackPtr_t()](trust-zone#rail-tz-disable-secure-radio-irqs-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::disable_secure_radio_irqs_callback](sl-rail-tz-config-t#disable-secure-radio-irqs-callback).

###### radioPerformM2mLdmaCallback (heading level 7)

```
RAIL_TZ_RadioPerformM2mLdmaCallbackPtr_t RAIL_TZ_Config_t::radioPerformM2mLdmaCallback
```

**Description:** See [RAIL_TZ_RadioPerformM2mLdmaCallbackPtr_t()](trust-zone#rail-tz-radio-perform-m2m-ldma-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if LDMA is a non-secure peripheral or if RAIL must not use LDMA.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::radio_perform_m2m_ldma_callback](sl-rail-tz-config-t#radio-perform-m2m-ldma-callback).

###### configureHfxoCallback (heading level 7)

```
RAIL_TZ_ConfigureHfxoCallbackPtr_t RAIL_TZ_Config_t::configureHfxoCallback
```

**Description:** See [RAIL_TZ_ConfigureHfxoCallbackPtr_t()](trust-zone#rail-tz-configure-hfxo-callback-ptr-t).

**Details:** In non-secure world, it must be NULL if HFXO is a non-secure peripheral.

**Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::configure_hfxo_callback](sl-rail-tz-config-t#configure-hfxo-callback).

###### isCmuSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isCmuSecure
```

**Description:** Indicate whether CMU is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_cmu_secure](sl-rail-tz-config-t#is-cmu-secure).

###### isEmuSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isEmuSecure
```

**Description:** Indicate whether EMU is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_emu_secure](sl-rail-tz-config-t#is-emu-secure).

###### isGpioSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isGpioSecure
```

**Description:** Indicate whether GPIO is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_gpio_secure](sl-rail-tz-config-t#is-gpio-secure).

###### isLdmaSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isLdmaSecure
```

**Description:** Indicate whether LDMA is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_ldma_secure](sl-rail-tz-config-t#is-ldma-secure).

###### isHfxoSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isHfxoSecure
```

**Description:** Indicate whether HFXO is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_hfxo_secure](sl-rail-tz-config-t#is-hfxo-secure).

###### isPrsSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isPrsSecure
```

**Description:** Indicate whether PRS is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_prs_secure](sl-rail-tz-config-t#is-prs-secure).

###### isSysrtcSecure (heading level 7)

```
bool RAIL_TZ_Config_t::isSysrtcSecure
```

**Description:** Indicate whether SYSRTC is configured as secure peripheral.

**Details:** **Deprecated**RAIL 2.x synonym of [sl_rail_tz_config_t::is_sysrtc_secure](sl-rail-tz-config-t#is-sysrtc-secure).

Gather RAIL TrustZone callbacks pointers and booleans indicating peripheral secure configuration. 

###### Public Attributes

###### changed_dcdc_callback (heading level 7)

```
sl_rail_tz_changed_dcdc_callback_t sl_rail_tz_config_t::changed_dcdc_callback
```

**Description:** See [sl_rail_tz_changed_dcdc_callback_t()](trust-zone#sl-rail-tz-changed-dcdc-callback-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

###### config_antenna_gpio_callback (heading level 7)

```
sl_rail_tz_config_antenna_gpio_callback_t sl_rail_tz_config_t::config_antenna_gpio_callback
```

**Description:** See [sl_rail_tz_config_antenna_gpio_callback_t()](trust-zone#sl-rail-tz-config-antenna-gpio-callback-t).

**Details:** In non-secure world, it must be NULL if CMU and GPIO are non-secure peripherals.

###### radio_clock_enable_callback (heading level 7)

```
sl_rail_tz_radio_clock_enable_callback_t sl_rail_tz_config_t::radio_clock_enable_callback
```

**Description:** See [sl_rail_tz_radio_clock_enable_callback_t()](trust-zone#sl-rail-tz-radio-clock-enable-callback-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

###### get_radio_clock_freq_hz_callback (heading level 7)

```
sl_rail_tz_get_radio_clock_freq_hz_callback_t sl_rail_tz_config_t::get_radio_clock_freq_hz_callback
```

**Description:** See [sl_rail_tz_get_radio_clock_freq_hz_callback_t()](trust-zone#sl-rail-tz-get-radio-clock-freq-hz-callback-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

###### rfeca_clock_enable_callback (heading level 7)

```
sl_rail_tz_rfeca_clock_enable_callback_t sl_rail_tz_config_t::rfeca_clock_enable_callback
```

**Description:** See [sl_rail_tz_rfeca_clock_enable_callback_t()](trust-zone#sl-rail-tz-rfeca-clock-enable-callback-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

###### rfeca_is_clock_enabled_callback (heading level 7)

```
sl_rail_tz_rfeca_is_clock_enabled_callback_t sl_rail_tz_config_t::rfeca_is_clock_enabled_callback
```

**Description:** See [sl_rail_tz_rfeca_is_clock_enabled_callback_t()](trust-zone#sl-rail-tz-rfeca-is-clock-enabled-callback-t).

**Details:** In non-secure world, it must be NULL if CMU is a non-secure peripheral.

###### read_internal_temperature_callback (heading level 7)

```
sl_rail_tz_read_internal_temperature_callback_t sl_rail_tz_config_t::read_internal_temperature_callback
```

**Description:** See [sl_rail_tz_read_internal_temperature_callback_t()](trust-zone#sl-rail-tz-read-internal-temperature-callback-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

###### enable_secure_radio_irqs_callback (heading level 7)

```
sl_rail_tz_enable_secure_radio_irqs_callback_t sl_rail_tz_config_t::enable_secure_radio_irqs_callback
```

**Description:** See [sl_rail_tz_enable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-enable-secure-radio-irqs-callback-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

###### disable_secure_radio_irqs_callback (heading level 7)

```
sl_rail_tz_disable_secure_radio_irqs_callback_t sl_rail_tz_config_t::disable_secure_radio_irqs_callback
```

**Description:** See [sl_rail_tz_disable_secure_radio_irqs_callback_t()](trust-zone#sl-rail-tz-disable-secure-radio-irqs-callback-t).

**Details:** In non-secure world, it must be NULL if EMU is a non-secure peripheral.

###### radio_perform_m2m_ldma_callback (heading level 7)

```
sl_rail_tz_radio_perform_m2m_ldma_callback_t sl_rail_tz_config_t::radio_perform_m2m_ldma_callback
```

**Description:** See [sl_rail_tz_radio_perform_m2m_ldma_callback_t()](trust-zone#sl-rail-tz-radio-perform-m2m-ldma-callback-t).

**Details:** In non-secure world, it must be NULL if LDMA is a non-secure peripheral or if RAIL must not use LDMA.

###### configure_hfxo_callback (heading level 7)

```
sl_rail_tz_configure_hfxo_callback_t sl_rail_tz_config_t::configure_hfxo_callback
```

**Description:** See [sl_rail_tz_configure_hfxo_callback_t()](trust-zone#sl-rail-tz-configure-hfxo-callback-t).

**Details:** In non-secure world, it must be NULL if HFXO is a non-secure peripheral.

###### is_cmu_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_cmu_secure
```

**Description:** Indicate whether CMU is configured as secure peripheral.

###### is_emu_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_emu_secure
```

**Description:** Indicate whether EMU is configured as secure peripheral.

###### is_gpio_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_gpio_secure
```

**Description:** Indicate whether GPIO is configured as secure peripheral.

###### is_ldma_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_ldma_secure
```

**Description:** Indicate whether LDMA is configured as secure peripheral.

###### is_hfxo_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_hfxo_secure
```

**Description:** Indicate whether HFXO is configured as secure peripheral.

###### is_prs_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_prs_secure
```

**Description:** Indicate whether PRS is configured as secure peripheral.

###### is_sysrtc_secure (heading level 7)

```
bool sl_rail_tz_config_t::is_sysrtc_secure
```

**Description:** Indicate whether SYSRTC is configured as secure peripheral.

### Components

#### Software Components

These are some of the RAIL software components available for application use.

##### Libraries

RAIL library software components provide the ability to choose support for single or multiple protocols. Current components include:

- [RAIL Library, Single Protocol](rail-lib)
- [RAIL Library, Multiprotocol](rail-lib)

##### Utilities

Radio utility software components provide optional source code that aid with radio setup and functionality. Current components include:

- [Angle of Arrival/Angle of Departure (AoX)](rail-util-aox)
- [Antenna Diversity](rail-util-ant-div)
- [BLE Channel Sounding (CS)](rail-util-ble-cs)
- [BLE Channel Sounding (CS) Antenna Offset](rail-util-ble-cs-antenna-offset)
- [Built-in PHYs across HFXO frequencies](rail-util-built-in-phys)
- [Callbacks](rail-util-callbacks)
- [Coexistence](rail-util-coex)
- [Direct Memory Access (DMA)](rail-util-dma)
- [Front End Module (FEM)](fem-util)
- [Front End Module Voltage Detector (VDET)](rail-util-vdet)
- [IEEE 802.15.4 Duty Cycling PHY](rail-util-ieee802154-duty-cycling)
- [IEEE 802.15.4 Fast Channel Switching](rail-util-ieee802154-fast-channel-switching)
- [IEEE 802.15.4 High Speed PHY](rail-util-ieee802154-high-speed)
- [Device Information](rail-util-load-devinfo)
- [Initialization](rail-util-init)
- [Multiprotocol Transition Time](sl-rail-util-mp-transition-time)
- [Packet Trace Interface (PTI)](rail-util-pti)
- [PA Power Conversion RAIL 3](sl-rail-util-pa) or [RAIL 2.x PA](rail-util-pa)
- [PA Power Conversion Tables RAIL 3](sl-rail-util-pa-tables)
- [PA Power Persistent Configs](rail-util-pa-nvm-configs)
- [Protocol](rail-util-protocol)
- [Recommended](rail-util-recommended)
- [RF Path](rail-util-rf-path)
- [RF Path Switch](rail-util-rf-path-switch)
- [Received Signal Strength Indicator (RSSI)](rail-util-rssi)
- [Radio Sequencer Image Selection](rail-util-sequencer)
- [Software Modem Image Selection](rail-util-sfm-sequencer)
- [Thermistor](rail-util-thermistor)

##### RAILtest Application

RAILtest application software components are specific to the RAILtest application. Current components include:

- [sl_rail_test / RAILtest Application Core](rail-test-core)
- [RAILtest Application Graphics](rail-test-graphics)

#### Modules

[RAIL Library](rail-lib)

[sl_rail_test / RAILtest Application Core](rail-test-core)

[RAILtest Application Graphics](rail-test-graphics)

[Antenna Diversity Utility](rail-util-ant-div)

[Angle of Arrival/Departure (AoX) Utility](rail-util-aox)

[BLE Channel Sounding (CS) Utility](rail-util-ble-cs)

[BLE Channel Sounding (CS) Antenna Offset Utility](rail-util-ble-cs-antenna-offset)

[Built-in PHYs for alternate HFXO frequencies](rail-util-built-in-phys)

[Callbacks Utility](rail-util-callbacks)

[Coexistence Utility](rail-util-coex)

[Direct Memory Access (DMA) Utility](rail-util-dma)

[Front End Module (FEM) Utility](fem-util)

[Front End Module Voltage Detection (VDET) Utility](rail-util-vdet)

[Initialization Utility](rail-util-init)

[IEEE 802.15.4 Duty Cycling Utility](rail-util-ieee802154-duty-cycling)

[IEEE 802.15.4 Fast Channel Switching Utility](rail-util-ieee802154-fast-channel-switching)

[IEEE 802.15.4 High Speed Utility](rail-util-ieee802154-high-speed)

[Device Information Utility](rail-util-load-devinfo)

[Multi-Protocol Transition Time Utility](sl-rail-util-mp-transition-time)

[RAIL 3 PA Power Conversion Utility](sl-rail-util-pa)

[RAIL 3 PA Power Conversion Tables Utility](sl-rail-util-pa-tables)

[RAIL 2.x PA Power Conversion Utility](rail-util-pa)

[PA Power Persistent Configs Utility](rail-util-pa-nvm-configs)

[Protocol Utility](rail-util-protocol)

[Packet Trace Interface (PTI) Utility](rail-util-pti)

[Recommended Utility](rail-util-recommended)

[RF Path Utility](rail-util-rf-path)

[RF Path Switch Utility](rail-util-rf-path-switch)

[Received Signal Strength Indicator (RSSI) Utility](rail-util-rssi)

[Radio Sequencer Image Selection Utility](rail-util-sequencer)

[Software Modem (SFM) sequencer image selection Utility](rail-util-sfm-sequencer)

[Thermistor Utility](rail-util-thermistor)

#### RAIL Library

##### RAIL Multiprotocol Library

The RAIL multiprotocol library allows multiple protocols to be initialized, set up, and managed at the library level. Dynamic Multiprotocol (DMP) requires the use of the RAIL multiprotocol library. Additional information can be found here: [RAIL Multiprotocol](rail-multiprotocol).

##### RAIL Single Protocol Library

The RAIL single protocol library reduces flash and memory footprints compared to the RAIL multiprotocol library. The [sl_rail_scheduler_info_t](sl-rail-scheduler-info-t) input parameter, used by select RAIL library API functions, is always ignored in the RAIL single protocol library. The single protocol library can be used for Switched Multiprotocol (SMP) because the RAIL library is initialized and used for one wireless protocol at a time.

#### sl_rail_test / RAILtest Application Core

##### sl_rail_test / RAILtest Core

The sl_rail_test_core software component contains the core functionality of the sl_rail_test application. This application uses RAIL 3 APIs and replaces the older RAIL 2.x RAILtest application, which is deprecated.

###### Configuration Options

The following configuration options can be changed:

- Enable/disable external radio configuration file support (e.g., rail_config.c/h).
- Configure default radio configuration for use.
- Alter application name output over CLI on boot. Default is `sl_rail_test`.
- Alter transfer period between consecutively transmitted packets.
- Alter maximum packet length. This is the size of the TX buffer in the sl_rail_test application, which contains the packet eventually to be loaded into the RAIL library's TX FIFO for transmission.
- Alter the duration that distinguishes between short and long button presses.

The following hardware options can be changed:

- Configure the Packet Error Rate (PER) GPIO pin. By default, this sl_rail_test output GPIO pin is not configured for use. For additional information regarding its use in sl_rail_test, see the section **Packet Error Rate Testing** in the document **UG409: RAILtest User’s Guide**.

The older RAIL 2.x RAILtest application allowed configuration of the tranmsit and receive buffer sizes; in RAIL 3 sl_rail_test those are configurable in the [Initialization Utility](rail-util-init) component. To transmit and receive a 4096 byte packet (i.e., the largest packet size supported in TX and RX packet modes), the FIFOs must be appropriately sized. In addition:

- TX device  
  - SL_RAIL_TEST_MAX_PACKET_LENGTH = 4096    
    - This is the size of the TX buffer used by the sl_rail_test application to contain the packet that will eventually be loaded into the library's TX FIFO.    
    - Up to 4096 bytes may be transmitted if the receiving device is not collecting the RX packet's appended info (e.g., no CRC status, no RSSI value, no timestamp).    
    - Up to 4080 bytes may be transmitted if the receiving device is collecting the RX packet's appended info (e.g., CRC status, RSSI value, timestamp).
- RX device  
  - The old notion of BUFFER_POOL_ALLOCATOR_BUFFER_SIZE_MAX is gone; sl_rail_test and RAILtest now use malloc() instead of a buffer pool for dynamic memory needs, so there must be enough heap (generally allocated in unused RAM) to support copying large packets from the RX FIFO into memory for subsequent display in the CLI.

#### RAILtest Application Graphics

##### RAILtest Graphics

This software component can optionally be enabled for RAIL 2.x RAILtest. It is not supported in RAIL 3 sl_rail_test. If enabled, the following information is displayed on the LCD:

- Number of transmitted packets
- Number of received packets
- Channel number
- Application name

When using a Silicon Labs-developed board, the hardware GPIO configuration is set up automatically for this software component based on the selected board. When using a custom board, manually configure the hardware pins. This can be done from within the `Memory LCD` software component. The `Memory LCD` component determines which LCD displays are compatible with the `RAILtest, Graphics` component. (The `Memory LCD` component is a dependency of the `RAILtest, Graphics` component and is included automatically in a project when the `RAILtest, Graphics` component is enabled.)

###### Configuration Options

The following configuration options can be changed:

- Alter application name displayed on boot. Default is `RAILtest`.

#### Antenna Diversity Utility

##### RAIL Antenna Diversity Utility

This optional software component can be enabled to include default functionality related to antenna diversity configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

###### Configuration Options

The following configuration options can be changed:

- Antenna Diversity:  
  - RX Antenna Diversity Mode: Choose the mode to use for receive antenna diversity. The possible modes are disabled, enabled, Antenna 0 only, or Antenna 1 only.  
  - TX Antenna Diversity Mode: Choose the mode to use for transmit antenna diversity. The possible modes are disabled, enabled, Antenna 0 only, or Antenna 1 only.  
  - Enable/disable Runtime PHY Selection: This option only works when using the Silicon Labs Zigbee or Open Thread stacks. If enabled it will allow turning on and off the antenna diversity version of the IEEE 802.15.4 PHY at runtime by these stacks.

The following hardware options can be changed:

- Configure the antenna diversity transmit select GPIO (antenna 0 signal).
- Configure the antenna diversity inverse transmit select GPIO (antenna 1 signal).

#### Angle of Arrival/Departure (AoX) Utility

##### RAIL Angle of Arrival/Departure (AoX) Utility

This optional software component can be enabled to include default functionality related to AoX configuration. AoX allows the Bluetooth stack to estimate the relative angle of another radio based on samples from multiple antennas.

The RAIL AoX Utility is only necessary if 2 or more antennas are configured. If fewer than 2 antennas are configured, CTE(constant tone extension) data can be transmitted or received on the default antenna.

###### Configuration Options

The following configuration options can be changed:

- Number of AoX antenna pins(0-6)

The following hardware options can be changed:

- GPIO pin for each antenna

#### BLE Channel Sounding (CS) Utility

##### RAIL BLE Channel Sounding Utility

This optional software component can be enabled to include default functionality related to CS configurations performed by the Bluetooth stack. For a detailed overview of CS and relevant BLE documentation, see the following:

[Channel Sounding](https://www.silabs.com/wireless/bluetooth/channel-sounding)

[Bluetooth Documentation](https://docs.silabs.com/bluetooth/latest/)

#### BLE Channel Sounding (CS) Antenna Offset Utility

##### RAIL BLE Channel Sounding Antenna Offset Utility

This optional software component can be enabled to include board-specific antenna offset values which are accounted for during CS distance measurements. The maximum number of antennas supported for CS is 4, with each antenna carrying a distance offset value in units of centimeters for both a wireless and wired antenna configuration.

###### Configuration Options

The following configuration macros are available for modification:

- CS Antenna Offset:  
  - SL_RAIL_UTIL_CS_ANTENNA_COUNT: Number of antennas used during CS.  
  - SL_RAIL_UTIL_CS_ANTENNA_CONFIG_TYPE: Indicates the antenna configuration type being used, either wireless or wired. By default, a wireless configuration will be selected, with the macro set to SL_RAIL_UTIL_CS_ANTENNA_OFFSET_CONFIG_TYPE_WIRELESS, or 0. To select a wired antenna configuration type, set the macro field to SL_RAIL_UTIL_CS_ANTENNA_OFFSET_CONFIG_TYPE_WIRED, or 1.  
  - SL_RAIL_UTIL_CS_ANTENNA_OFFSET_WIRELESS_CM: Wireless antenna offset values for each antenna, in cm.  
  - SL_RAIL_UTIL_CS_ANTENNA_OFFSET_WIRED_CM: Wired antenna offset values for each antenna, in cm.

**Note:** The antenna offset values for each antenna are calculated offsets for each antenna and should be used. Additonally, the number of antenna offsets set for a wireless or wired antenna configuration must be proportional or greater than the number of antennas configured for CS. Offset values for unused antennas will be ignored.

#### Built-in PHYs for alternate HFXO frequencies

##### RAIL Utility for built-in PHYs

This optional software component can be enabled to override the built-in PHYs used to support standards-based protocols based on the HFXO frequency configured as part of the device_init_hfxo component.

Currently the following combinations of chips and frequencies are supported:

- EFR32XG24: 38.4 MHz, 39 MHz and 40 MHz
- EFR32XG26: 38.4 MHz, 39 MHz and 40 MHz

On unsupported chips, this component is safe to include, and will have no effect.

#### Callbacks Utility

##### RAIL Callbacks Utility

This optional software component can be enabled to include default functionality related to RAIL callback configuration.

This utility provides basic callbacks that can be made available to RAIL. If a callback is not registered for use, it will be compiled out. The provided callbacks include:

- [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed)  
  - This callback is called when a RAIL library-level assertion occurs. This callback occurs regardless of the other configuration options enabled in this software component.  
  - This callback overrides a weak function in the RAIL library and as such cannot be compiled out. Any assert within the RAIL library will cause this callback to run and provide information as to the cause.  
  - The weak function `sl_rail_util_on_assert_failed()` is provided for application use and will be called when [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed) is called.  
  - This callback override can be configured to be excluded, in which case the application is responsible for creating its own [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed) override if so desired.
- `sli_rail_util_on_rf_ready()`  
  - This callback is called when the call to [sl_rail_init()](general#sl-rail-init) completes.  
  - The `Initialize RAIL` configuration option must be enabled, and this callback must be passed as a parameter to [sl_rail_init()](general#sl-rail-init) to enable its use.  
  - The weak function `sl_rail_util_on_rf_ready()` is provided for application use and will be called when `sli_rail_util_on_rf_ready()` is called.
- `sli_rail_util_on_channel_config_change()`  
  - This callback is called when an automatic switch from one channel configuration entry to another is performed internal to the RAIL library.  
  - The `Initialize RAIL` and `Protocol Configuration` configuration options must be enabled, and this callback must be passed as a parameter to [sl_rail_config_channels()](radio-configuration#sl-rail-config-channels) to enable its use.  
  - The weak function `sl_rail_util_on_channel_config_change()` is provided for application use and will be called when `sli_rail_util_on_channel_config_change()` is called.
- `sli_rail_util_on_event()`  
  - This callback is called when a configured radio event occurs. The radio events capable of causing this callback are identified in [sl_rail_events_t](events#sl-rail-events-t).  
  - The `Initialize RAIL` and `Radio Event Configuration` configuration options must be enabled, and this callback must be passed as a parameter to [sl_rail_init()](general#sl-rail-init) to enable its use.  
  - The weak function `sl_rail_util_on_event()` is provided for application use and will be called when `sli_rail_util_on_event()` is called.

###### Configuration Options

The following configuration options can be changed:

- Include/exclude [sl_railcb_assert_failed()](assertions#sl-railcb-assert-failed) callback override.

#### Coexistence Utility

##### RAIL Coexistence Utility

This optional software component can be enabled to include default functionality related to the coexistence configuration.

See the following documents for in-depth explanations about how to configure and use the available coexistence features:

- **AN1128: Bluetooth® Coexistence with Wi-Fi®**
- **AN1017: Zigbee® and Silicon Labs® Thread Coexistence with Wi-Fi®**
- **UG350: Silicon Labs Coexistence Development Kit (SLWSTK-COEXBP)**

#### Direct Memory Access (DMA) Utility

##### RAIL DMA Utility

This optional software component can be enabled to include default functionality related to DMA configuration.

###### Configuration Options

The following configuration options can be changed:

- Enable/disable a DMA channel for use by RAIL. Allocating a DMA channel to the RAIL library allows for faster radio initialization.  
  - Allow for a DMA channel to be selected automatically.  
  - If not automatically allocating a DMA channel, identify a specific channel to allocate.

#### Front End Module (FEM) Utility

##### Radio FEM Utility

Enabling this optional software component includes default functionality related to FEM configuration. It also configures the GPIOs together with the Peripheral Reflex System (PRS) signals to control the FEM.

###### Configuration Options

The following options can be configured:

- Enable RX Mode: Enables the output of RX based on the selected port and pin.
- Enable TX Mode: Enables the output of TX based on the selected port and pin.
- Enable Bypass Mode: Enables communication that bypasses the PA (Power Amplifier) and the LNA (Low Noise Amplifier) on the FEM.
- Enable TX High Power Mode: Enables high power transmit mode on the FEM, if disabled low power transmit will be used.
- Enable automatic PRS LNA Bypass Mode: Enables dynamic LNA bypass when receiving frames with high power. This is available on platforms having [RAIL_SUPPORTS_PRS_LNA_BYPASS](features#rail-supports-prs-lna-bypass-1).  
  - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_THRESHOLD: see [RAIL_PrsLnaBypassConfig_t::threshold](rail-prs-lna-bypass-config-t#threshold)  
  - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_DELTA_RSSI_DMB: see [RAIL_PrsLnaBypassConfig_t::deltaRssiDbm](rail-prs-lna-bypass-config-t#delta-rssi-dbm)  
  - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_POLARITY: see [RAIL_PrsLnaBypassConfig_t::polarity](rail-prs-lna-bypass-config-t#polarity)  
  - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_TIMEOUT_US: see [RAIL_PrsLnaBypassConfig_t::timeoutUs](rail-prs-lna-bypass-config-t#timeout-us)  
  - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_COMBINE: Demonstrate how to perform logical combination between dynamic LNA bypass PRS signal and another PRS signal.    
    - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_NO_COMBINE: Dynamic LNA bypass PRS signal directly routed to SL_FEM_UTIL_BYPASS_PORT/PIN.    
    - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_OR_PAEN_COMBINE: Dynamic LNA bypass PRS signal ored with PA enable on SL_FEM_UTIL_BYPASS_PRS_COMBINE channel and routed to SL_FEM_UTIL_BYPASS_PORT/PIN.    
    - SL_FEM_UTIL_AUTO_PRS_LNA_BYPASS_XOR_LNAEN_COMBINE: Dynamic LNA bypass PRS signal xored with LNA enable on SL_FEM_UTIL_BYPASS_PRS_COMBINE channel and routed to SL_FEM_UTIL_BYPASS_PORT/PIN.

Typically, the signal routing is as follows:

- SL_FEM_UTIL_BYPASS: Bypass control (FEM pin **CPS**).
- SL_FEM_UTIL_RX: RX control (FEM pin **CRX**). Active based on the radio activity (whenever the LNA is enabled).
- SL_FEM_UTIL_SLEEP: Sleep control (FEM pin **CSD**). Active based on the radio activity (whenever the PA or LNA are enabled).
- SL_FEM_UTIL_TX: TX control (FEM pin **CTX**). Active based on the radio activity (whenever the PA is enabled).
- SL_FEM_UTIL_TX_HIGH_POWER: Tx power mode control (FEM pin **CHL**).

Refer to the FEM datasheet for the required settings as not all configuration options are applicable to every module.

#### Front End Module Voltage Detection (VDET) Utility

##### RAIL VDET Utility

This optional software component can be enabled to include default functionality related to VDET configuration. VDET allows customers to measure a voltage during specific timestamps of a transmit packet. This information is used to tune FEM output power measurements during manufacturing and allows compensation for variability in the output path.

###### Configuration Options

- VDET mode
- VDET resolution
- VDET sample delay

The following hardware pin must be enabled to use VDET and is fixed to specific GPIO pins on supported EFR32 devices that cannot be changed.

- The RAC.AUXADC_IN8_SHIM_EN GPIO pin.

#### Initialization Utility

##### RAIL Initialization Utility

This optional software component can be enabled to include default functionality related to RAIL initialization configuration. There are two mutually-exclusive variants:

- sl_rail_util_init - for use with applications using RAIL 3 APIs (like sl_rail_test) or desire RAIL 3 functionality available in [sl_rail_init()](general#sl-rail-init) that isn't supported in RAIL 2.x [RAIL_Init()](general#rail-init).
- rail_util_init (deprecated) - for use with legacy RAIL 2.x applications like the older RAILtest application.

Note: Multiple instances of this component can be enabled in application code. This is particularly useful for multiprotocol scenarios.

###### Configuration Options

The following configuration options can be changed:

- Enable/disable RAIL initialization.  
  - Enable/disable initialization complete callback.  
  - (sl_rail_util_init only) Configure RX FIFO and/or RX Packet Queue, or use the RAIL library built-in defaults (which are shared with other instances using built-ins).  
  - (sl_rail_util_init only) Configure TX FIFO.
- Enable/disable channel configuration.  
  - Configure a proprietary channel configuration on boot. This specifically involves the use of the `channelConfigs[]` array in rail_config.c/h.  
  - If using a proprietary channel configuration, specify the channel index for use (i.e., index `x` of array `channelConfigs[x]`).
- Enable/disable calibration configuration.  
  - Enable/disable temperature-dependent calibrations (e.g., voltage controlled oscillator calibration).  
  - Enable/disable one-time calibrations (e.g., image rejection calibration).
- Enable/disable auto transition configuration.  
  - Configure TX transitions on Success and Failure.  
  - Configure RX transitions on Success and Failure.
- Enable/disable RX and TX data formats (in sl_rail_util_init these can be independently enabled/configured, unlike in rail_util_init where they're combined).  
  - Configure RX source and mode.  
  - Configure TX source and mode.
- Enable/disable radio callback event configuration.  
  - Configure RX events.  
  - Configure TX events.  
  - Configure protocol-specific events.  
  - Configure dynamic multiprotocol-specific events.  
  - Configure maintenance events. Note: Some protocol-specific events share the same event flag with other protocols; enabling one will enable them all. See [sl_rail_events_t](events#sl-rail-events-t) in [sl_rail_types.h](sl-rail-types-h).

#### IEEE 802.15.4 Duty Cycling Utility

##### RAIL IEEE 802.15.4 Duty Cycling Utility

This optional software component can be enabled to include default functionality related to IEEE 802.15.4 RX duty cycling configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

###### Configuration Options

The following configuration options can be changed:

- Duty Cycling:  
  - **Default Enabled** (`SL_RAIL_UTIL_IEEE802154_DUTY_CYCLING_DEFAULT_ENABLED`) Controls whether RX duty cycling is enabled by default. **Enable**: RX duty cycling is enabled at startup. **Disable**: RX duty cycling is disabled at startup. **Default**: Enabled.  
  - **Runtime Select** (`SL_RAIL_UTIL_IEEE802154_DUTY_CYCLING_RUNTIME_PHY_SELECT`) Controls whether the RX duty cycling feature can be modified at runtime. **Enable**: RX duty cycling can be enabled or disabled dynamically. **Disable**: RX duty cycling cannot be modified at runtime. **Default**: Disabled.

###### Notes

- RX duty cycling reduces power consumption by periodically turning the radio receiver on and off, at the cost of increased latency and potential packet loss if wakeup intervals are too long.
- Runtime selection allows supported stacks to adjust RX duty cycling behavior based on application needs.
- This feature is only relevant for IEEE 802.15.4-based protocols such as Zigbee or OpenThread.

###### Component API

See [IEEE 802.15.4 Duty Cycling](ieee802154-rx-duty-cycling-api).

#### IEEE 802.15.4 Fast Channel Switching Utility

##### RAIL IEEE 802.15.4 Fast Channel Switching Utility

This optional software component can be enabled to include default functionality related to IEEE 802.15.4 fast channel switching configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

###### Configuration Options

The following configuration options can be changed:

- Fast Channel Switching:  
  - **Enable Fast Channel Switching** (`SL_RAIL_UTIL_IEEE802154_FAST_CHANNEL_SWITCHING_ENABLED`) Controls whether the RX fast channel switching feature is enabled by default. **Enable**: Fast channel switching is enabled at startup. **Disable**: Fast channel switching is disabled at startup. **Default**: Enabled.  
  - **Runtime Select** (`SL_RAIL_UTIL_IEEE802154_FAST_CHANNEL_SWITCHING_RUNTIME_PHY_SELECT`) Controls whether the RX fast channel switching feature can be modified at runtime. **Enable**: The feature can be enabled or disabled dynamically. **Disable**: The feature cannot be modified at runtime. **Default**: Disabled.

###### Notes

- Fast channel switching reduces the latency of moving between channels in IEEE 802.15.4 networks, improving responsiveness in environments with frequent channel changes.
- Runtime selection allows supported stacks to dynamically adjust fast channel switching behavior depending on application requirements.
- This feature is only relevant for IEEE 802.15.4-based protocols such as Zigbee or OpenThread.

###### Component API

See [IEEE 802.15.4 Fast Channel Switching](ieee802154-fast-channel-switching-api).

#### IEEE 802.15.4 High Speed Utility

##### RAIL IEEE 802.15.4 High Speed Utility

This optional software component can be enabled to include default functionality related to IEEE 802.15.4 high speed PHY configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

###### Configuration Options

The following configuration options can be changed:

- High Speed PHYs:  
  - **Enable 1 Mbps FEC PHY** (`SL_RAIL_UTIL_IEEE802154_RADIO_CONFIG_2P4_1MBPS_FEC_SUPPORTED`) When enabled, the 1 Mbps high speed PHY with forward error correction (FEC) is supported. **Enable**: 1 Mbps PHY with FEC available for use. **Disable**: 1 Mbps PHY with FEC not supported. **Default**: Disabled.  
  - **Enable 2 Mbps PHY** (`SL_RAIL_UTIL_IEEE802154_RADIO_CONFIG_2P4_2MBPS_SUPPORTED`) When enabled, the 2 Mbps high speed PHY without forward error correction is supported. **Enable**: 2 Mbps PHY available for use. **Disable**: 2 Mbps PHY not supported. **Default**: Enabled.

###### Notes

- The 1 Mbps FEC PHY trades throughput for improved robustness by applying forward error correction.
- The 2 Mbps PHY maximizes throughput and reduces latency, but may reduce range and sensitivity compared to lower-rate PHYs.
- These PHY options are only available when using IEEE 802.15.4-based protocols such as Zigbee or OpenThread.
- Runtime PHY selection can be used by supported stacks to switch between standard and high speed PHYs depending on application requirements.

###### Component API

See [IEEE 802.15.4 High Speed](ieee802154-high-speed-api).

#### Device Information Utility

##### RAIL Utility for Reading Device Information

This software component allows reading and storing device specific information from the device to be used later for optimal radio performance.

This component must be included only for Silicon Labs Series 3 devices and must be initialized before calling [sl_rail_init()](general#sl-rail-init) outside a critical section.

#### Multi-Protocol Transition Time Utility

 The **Multi-Protocol Transition Time Utility** is a software component designed to dynamically determine and configure the appropriate transition time for switching between protocols in a multi-protocol environment. This ensures proper operation of the radio for a given system clock frequency, and maximizes protocol access to the shared radio.

---

##### Overview

The **Multi-Protocol Transition Time Utility** is designed to determine and configure the worst-case transition times required for switching between protocols in a dynamic multiprotocol (DMP) application. These transition times represent how early the radio scheduler must begin a protocol switch before a scheduled event in order to not miss it.

The default configuration is tuned specifically for BLE and Zigbee use cases, ensuring reliable operation across Silicon Labs RAIL stacks. Customers can further customize these transition times to optimize performance for their specific applications.

This utility uses a configurable table of frequency thresholds and corresponding transition times to dynamically select the optimal transition time based on the current system clock frequency. By doing so, it ensures efficient protocol switching while maintaining reliable radio performance.

As the system clock frequency increases, the performance of the protocol switch process improves. For example, at 150 MHz, the radio can switch from one protocol to another more quickly than at 38.4 MHz, enabling faster transitions and better overall access to the shared radio in high-frequency systems.

---

##### Key Features

- **Dynamic Transition Time Selection**: Automatically selects the appropriate transition time based on the current system clock frequency.
- **Configurable Table**: Users can define custom frequency-to-transition-time mappings using the override functionality.
- **Default Compatibility**: Pre-configured to work with all Silicon Labs stacks on supported part families.
- **Override Support**: Customers can override the default configuration to optimize for their specific device family or application requirements.

---

##### Configuration Options

###### Default Configuration

The default configuration is defined in the `sl_rail_util_mp_transition_time` component. It includes a table of frequency thresholds and corresponding transition times, which are used to determine the appropriate transition time for the current system clock frequency.

Example default configuration for device family sixx301 in `.slcc`: 

```c
template_contribution:
  - name: sl_rail_util_mp_transition_time_table
    value:
      minimum_frequency_hz: "150000000, 38400000, 20000000, 10000000"
      transition_time_us: "350, 450, 1000, 2000"
    condition: [device_generic_family_sixx301]
    unless: [sl_rail_util_mp_transition_time_override]

```

###### Override Functionality

Customers can override the default values by requiring the `sl_rail_util_mp_transition_time_override` component in their SLCP file. This allows them to define their own `sl_rail_util_mp_transition_time_table` using the same format as the default configuration.

Example override configuration in `.slcp`: 

```c
requires:
  - name: sl_rail_util_mp_transition_time_override
template_contribution:
  - name: sl_rail_util_mp_transition_time_table
    value:
      minimum_frequency_hz: "100000000, 50000000"
      transition_time_us: "400, 800"

```

By using the override functionality, customers can fine-tune the transition times to better suit their specific device family or application requirements.

---

##### How It Works

1. **Initialization**: The utility initializes by determining the current system clock frequency and selecting the appropriate transition time from the table.
2. **Dynamic Selection**: During runtime, the utility dynamically selects the transition time based on the system clock frequency, ensuring proper protocol transitions for the radio. It is only run once during startup, however the APIs are available for subsequent usage or testing.
3. **RAIL Configuration**: The selected transition time is passed to the RAIL library sl_rail_set_transition_time API.

---

##### Component API

See [Multiprotocol Transition Time](multiprotocol-transition-time)

#### RAIL 3 PA Power Conversion Utility

##### RAIL 3 PA Power Conversion Utility

This optional software component can be enabled to include default functionality related to RAIL 3 PA configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

##### Configuration Options

The following configuration options can be changed:

- PA Configuration  
  - Initial PA power  
  - PA ramp time    
    - PA ramp time is a hardware approximation aimed at being as close to the desired ramp time as possible without going over the specified time.  
  - Milli-volts provided to the PA supply pin (PA_VDD)
- PA Calibration Configuration  
  - Apply PA Calibration Factory Offset    
    - PA calibration offset ensures that PA power remains consistent chip-to-chip. These adjustments occur automatically when the PA is in use, and the application is not notified when these adjustments occur.

This component uses [RAIL 3 PA Power Conversion Tables Utility](sl-rail-util-pa-tables) for Power Amplifier (PA) powersetting mapping table data.

##### Integration with RAIL APIs

###### Typical Usage Flow

```c
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h"
#include "sl_rail_util_pa_config.h"
// 1. Component initializes automatically during stack_init
//    (sl_rail_util_pa_init() called with priority -9010)

// 2. After RAIL initialization (optional if not using sl_rail_util_callbacks)
sl_rail_status_t status = sl_rail_util_pa_post_init(
    rail_handle,
    SL_RAIL_TX_PA_MODE_2P4_GHZ);

// 3. Get PA capabilities
sl_rail_tx_power_t min, max, step;
sl_rail_util_pa_get_tx_power_limits(rail_handle,
                                    SL_RAIL_TX_PA_MODE_2P4_GHZ,
                                    &min, &max, &step);

// 4. Set transmit power (uses PA tables internally)
sl_rail_set_tx_power_dbm(rail_handle, 100);  // 10.0 dBm

// 5. Channel changes handled automatically via callback
//    (sl_rail_util_pa_on_channel_config_change() called by sl_rail_util_callbacks)

```

###### Integration with Power Control

```c
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h"
#include "sl_rail_util_pa_config.h"

// One can check what actual achievable power is before setting
sl_rail_tx_power_t desired_power = 155;  // 15.5 dBm
sl_rail_status_t status = sl_rail_util_pa_convert_power_to_actual(
    rail_handle,
    SL_RAIL_TX_PA_MODE_INVALID,
    &desired_power); // actual power is written in this

if (status == SL_RAIL_STATUS_NO_ERROR && desired_power <= 155) {
    // Set the actual achievable power
    sl_rail_set_tx_power_dbm(rail_handle, desired_power);
}

```

##### Troubleshooting

###### Common Issues

**Issue**: PA settings like ramp time are not configured after RAIL init

- **Solution**: Call `sl_rail_util_pa_post_init()` after `sl_rail_init` if not using `sl_rail_util_callbacks`
- **Check**: Verify component dependencies are met

**Issue**: Incorrect power output

- **Solution**: Verify `SL_RAIL_UTIL_PA_VOLTAGE_MV` matches actual PA supply and if `sl_rail_util_pa_post_init()` is called
- **Check**: Enable PA calibration (`SL_RAIL_UTIL_PA_CALIBRATION_ENABLE`)

**Issue**: Power table not found

- **Solution**: Ensure `sl_rail_util_pa_tables` component is included
- **Check**: Verify device-specific configuration is selected

**Issue**: Problems related to transmission power in modules

- **Solution**: Ensure RAIL 2.x PA plugin is being used for modules. `sl_rail_util_pa` is not compatible with modules.
- **Check**: Check if `rail_util_pa` is called implcitly or through `sl_rail_util_compatible_pa`

**Issue**: Power limits incorrect

- **Solution**: Check channel configuration max power settings
- **Verify**: PA mode matches channel requirements

###### Debug Commands (railtest/sl_rail_test)

```c
#### Get current PA configuration
getPowerConfig

#### Get power setting for current power level
getPowerSetting

#### Get TX power limits
getPaTableLimits

```

##### Migration from RAIL 2.x

###### Component Replacement

**RAIL 2.x**: 

```c
components:
  - rail_util_pa

```

**RAIL 3.0**: 

```c
components:
  - sl_rail_util_pa # This requires sl_rail_util_pa_tables

```

 And to be agnostic to whether the application uses RAIL 2.x [RAIL 2.x PA Power Conversion Utility](rail-util-pa) or RAIL 3.0 [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) component, use the compatibility component 

```c
components:
  - sl_rail_util_compatible_pa

```

###### API Migration

|RAIL 2.x|RAIL 3.0|
|---|---|
|`RAIL_ConfigTxPower()`|`sl_rail_util_pa_post_init()`|
|`RAIL_SetTxPowerDbm()`|`sl_rail_set_tx_power_dbm()`|
|`RAIL_GetTxPowerDbm()`|`sl_rail_get_tx_power_dbm()`|

###### Configuration Migration

**RAIL 2.x**: 

```c
#include "rail.h"
#include "pa_conversions_efr32.h"

RAIL_TxPowerConfig_t txPowerConfig = {
  .mode = RAIL_TX_POWER_MODE_2P4_HP,
  .voltage = 3300,
  .rampTime = 10,
};
RAIL_ConfigTxPower(railHandle, &txPowerConfig);
RAIL_Status_t status = RAIL_SetTxPowerDbm(railHandle, SL_RAIL_UTIL_PA_POWER_DECI_DBM);

```

**RAIL 3.0**: 

```c
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h"
#include "sl_rail_util_pa_config.h"
// sl_rail_util_pa_config.h uses the below defines in sl_rail_util_pa_post_init()
// #define SL_RAIL_UTIL_PA_VOLTAGE_MV      3300
// #define SL_RAIL_UTIL_PA_RAMP_TIME_US    10

// Initialization (automatic via stack_init)
// Or manual if not using sl_rail_util_callbacks one can call
// sl_rail_util_pa_post_init() to set up PA and the power.
sl_rail_status_t status = sl_rail_util_pa_post_init(rail_handle, SL_RAIL_TX_PA_MODE_2P4_GHZ);
status = sl_rail_set_tx_power_dbm(rail_handle, SL_RAIL_UTIL_PA_POWER_DECI_DBM);

```

 or call specific functions to set voltage and ramp time like below: 

```c
#include "sl_rail.h"
#include "sl_rail_util_pa_conversions.h"
#include "sl_rail_util_pa_config.h"

// Initialization (automatic via stack_init)
// Or manual if not using sl_rail_util_callbacks one can call
// the below functions to set up PA and the power.
sl_rail_status_t status = sl_rail_set_tx_pa_ramp_time(rail_handle, SL_RAIL_UTIL_PA_RAMP_TIME_US);
status = sl_rail_set_tx_pa_voltage(rail_handle, SL_RAIL_UTIL_PA_VOLTAGE_MV);
status = sl_rail_set_tx_power_dbm(rail_handle, SL_RAIL_UTIL_PA_POWER_DECI_DBM);

```

#### RAIL 3 PA Power Conversion Tables Utility

##### Overview

The `sl_rail_util_pa_tables` component provides PA Power conversion mapping tables for RAIL (Radio Abstraction Interface Layer). This utility enables accurate conversion between dBm powers and hardware-specific PA power settings which is performed by [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) component.

##### Purpose

This component provides:

- **Pre-characterized PA Tables**: Device-specific powersetting tables mapping dBm values to PA power settings
- **Multi-Mode PA Support**: Tables are available for multiple PA modes when supported.(2.4GHz, subGHz, Linear OFDM etc)
- **Multiple Powersetting table options**: Different options of tables are provided to choose from when supported on a board (High Power(HP), Medium Power(MP), Low Power(LP), Low Low Power(LLP), automode)
- **Automatic PA Selection**: Configuration support for automatic PA sub-mode selection based on power requirements
- **Hardware Abstraction**: Unified interface across EFR32 Series 2 and Series 3 SoCs.

##### Supported Devices

The component provides PA tables for the following device families:

|Device|PA Variants|PA Sub-Modes|
|---|---|---|
|**EFR32xG21**|10 dBm, 20 dBm|LP, MP, HP|
|**EFR32xG22**|6 dBm|LP, HP|
|**EFR32xG23**|10 dBm, 14 dBm, 20 dBm|LLP, LP, MP, HP|
|**EFR32xG24**|10 dBm, 20 dBm|LP, HP|
|**EFR32xG25**|14 dBm|FSK or OFDM|
|**EFR32xG26**|10 dBm, 20 dBm|LP, HP|
|**EFR32xG27**|4 dBm*, 8 dBm|LP, HP|
|**EFR32xG28**|14 dBm, 20 dBm|LLP, LP, MP, HP|
|**EFR32xG29**|4 dBm*, 8 dBm|LP, HP|
|**SIXG301**|0 dBm, 10 dBm|HP, LP|

- means 4dBm variant is a power restricted 8dBm variant.

##### Configuration

###### Universal Configurator (UC) Integration

The component automatically selects the appropriate PA table based on:

1. Device Series
2. Device SDID
3. PA Capability
4. Package Type
5. Frequency Band

###### Configuration File

Each device variant includes a configuration file: 

```c
plugin/sl_rail_util_pa_tables/{device}/config/{variant}/sl_rail_util_pa_tables_config.h

```

Example configuration (EFR32xG24 20dBm): 

```c
#define SL_RAIL_UTIL_PA_TABLE_HEADER    "sl_rail_util_pa_dbm_powersetting_mapping_table_20dbm.h"

```

This header is included in the build via the `SL_RAIL_UTIL_PA_TABLES_CONFIG_HEADER` define.

##### PA Power Sub-Modes

The component supports multiple PA sub-modes for power-optimized operation:

###### Sub-Mode Types

|Sub-Mode|Enum Value|Use Case|
|---|---|---|
|**HP** (High Power)|`SL_RAIL_PA_POWER_SETTING_SUBMODE_HP`|Maximum output power, higher current consumption|
|**MP** (Medium Power)|`SL_RAIL_PA_POWER_SETTING_SUBMODE_MP`|Balanced power and efficiency|
|**LP** (Low Power)|`SL_RAIL_PA_POWER_SETTING_SUBMODE_LP`|Lower power output, better efficiency|
|**LLP** (Low-Low Power)|`SL_RAIL_PA_POWER_SETTING_SUBMODE_LLP`|Minimal power output, maximum efficiency|

###### Sub-Mode Availability

Refer to the Supported Devices section above for sub-mode availability by device.

##### PA Table Format

###### Table Structure

PA tables map dBm power levels to hardware power settings. Here is an example of EFR32xG28 20dBm power setting table:

```c
#define SL_RAIL_PA_TABLE_0_NUM_VALUES  (55U)
#define SL_RAIL_PA_TABLE_0_STEP_DDBM   (10U)         // Step size in deci-dBm (1.0 dBm)
#define SL_RAIL_PA_TABLE_0_MAX_POWER_DDBM     (200U) // Max: 20.0 dBm
#define SL_RAIL_PA_TABLE_0_MIN_POWER_DDBM     (-338) // Min: -33.8 dBm

#define SL_RAIL_PA_TABLE_0                        \
  {                                               \
    0x0 /* est_deci-dBm:-338 act_deci-dBm:-338*/, \
    0x0 /* est_deci-dBm:-328 act_deci-dBm:-338*/, \
    0x0 /* est_deci-dBm:-318 act_deci-dBm:-338*/, \
    ...                                           \
    0x1 /* est_deci-dBm:-188 act_deci-dBm:-192*/, \
    ...                                           \
    0x6d /* est_deci-dBm:182 act_deci-dBm:182*/,  \
    0x86 /* est_deci-dBm:192 act_deci-dBm:192*/,  \
    0xa5 /* est_deci-dBm:200 act_deci-dBm:200*/,  \
  }

```

 For custom table, make sure these parameters exist.

###### Power Units

- **deci-dBm**: Power values in tenths of dBm (e.g., 200 deci-dBm = 20.0 dBm)
- **Step Size**: Typically 1.0 dBm (10 deci-dBm) between entries
- **Power Setting**: Hardware-specific raw value for PA registers

##### Usage

###### Including the Component

In your Universal Configurator project:

1. Add the `sl_rail_util_pa_tables` component
2. The appropriate PA table is automatically selected based on device configuration
3. The component provides the `sl_rail_util_pa_tables.h` header

###### API Usage

The component provides enumeration types used by RAIL power conversion APIs:

```c
#include "sl_rail_util_pa_tables.h"

// PA sub-modes are defined for use with power APIs
sl_rail_pa_power_setting_submode_t submode = SL_RAIL_PA_POWER_SETTING_SUBMODE_HP;

```

###### Integration with PA Conversion Plugin

This component works in conjunction with `sl_rail_util_pa_conversions`:

```c
// PA conversions plugin uses these tables internally
sl_rail_status_t status = sl_rail_set_tx_power_ddbm(rail_handle, 
                                                     power_ddbm);

// The conversion is handled automatically:
// 1. Current PA mode is determined
// 2. Appropriate PA table is selected
// 3. dBm value is converted to PA power setting
// 4. PA hardware is configured

```

##### Automode PA Tables

Some devices support automatic PA mode switching:

###### Automode Configurations

- **EFR32xG21**: Automode tables for 0/10 dBm, 0/10/20 dBm, 10/20 dBm
- **EFR32xG22**: Automode tables for 0/6 dBm
- **EFR32xG24**: Automode tables for 0/10 dBm
- **EFR32xG26**: Automode tables for 0/10 dBm (QFN and BGA)
- **EFR32xG27**: Automode tables for 0/4 dBm (CSP), 0/8 dBm (QFN)
- **EFR32xG29**: Automode tables for 0/8 dBm (CSP and QFN)
- **SixG301**: Automode tables for 0/10 dBm

###### Benefits of Automode

- Automatic switching between low-power and high-power PAs
- Optimized current consumption at lower power levels
- Seamless power ramping across PA mode boundaries

##### Device-Specific Notes

###### EFR32xG23/xG28 Sub-Modes

These devices support four PA sub-modes (HP, MP, LP, LLP) for fine-grained power/efficiency tuning:

- **HP (High Power)**: Best linearity, highest current
- **MP (Medium Power)**: Balanced performance
- **LP (Low Power)**: Good efficiency, lower harmonic distortion
- **LLP (Low-Low Power)**: Maximum efficiency for low-power applications

###### EFR32xG25 Board-Specific Tables

The xG25 includes a board-specific table for BRD4276A: 

```c
// Board-specific PA table selection
condition:
  - device_series_2
  - device_sdid_220
  - brd4276a

```

###### EFR32xG28 Frequency Bands

The xG28 provides separate PA tables for different frequency bands:

- **868 MHz**: European ISM band optimization
- **915 MHz**: North American ISM band optimization

The correct table is selected based on `hardware_board_supports_rf_band_868`.

###### EFR32xG26 Package Variants

The xG26 supports different PA tables for package types in addition to PA sub-modes:

- **QFN Package**: Standard power tables
- **BGA Package** (EFR32MG26B510F3200IL136): Optimized for BGA thermal characteristics

###### Series 3 (SIXG301)

Series 3 devices use simplified PA table structure:

- **0 dBm Table**: Low-power mode
- **10 dBm Table**: High-power mode
- **Automode Table**: Automatic switching between 0/10 dBm

##### Requirements

###### Component Dependencies

- **rail_lib**: Core RAIL library (required)
- **sl_rail_util_pa**: PA plugin(required)

##### Build System Integration

The build system automatically:

1. Detects device family and capabilities
2. Selects appropriate config file based on conditions
3. Includes device-specific PA table headers
4. Defines `SL_RAIL_UTIL_PA_TABLES_CONFIG_HEADER` macro

##### Troubleshooting

###### Common Issues

**Issue**: PA table not found at build time

- **Solution**: Verify device conditions match (SDID, PA capability, package type)
- **Check**: Component configuration in .slcp file

**Issue**: Incorrect power output

- **Solution**: Ensure correct PA mode is selected for channel configuration
- **Check**: Board files and hardware_board_supports_* conditions

#### RAIL 2.x PA Power Conversion Utility

##### RAIL 2.x PA Power Conversion Utility

This optional software component can be enabled to include default functionality related to RAIL 2.x PA configuration. Refer to [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) for RAIL 3 PA configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

###### Configuration Options

The following configuration options can be changed:

- PA Configuration  
  - Initial PA power  
  - PA ramp time    
    - PA ramp time is a hardware approximation aimed at being as close to the desired ramp time as possible without going over the specified time.  
  - Milli-volts provided to the PA supply pin (PA_VDD)  
  - 2.4 GHz PA selection (for applicable devices)  
  - Sub-1 GHz PA selection (for applicable devices)
- PA Curve Configuration  
  - Header file containing custom PA curves  
  - Header file containing PA curve type types
- PA Calibration Configuration  
  - Apply PA Calibration Factory Offset    
    - PA calibration offset ensures that PA power remains consistent chip-to-chip. These adjustments occur automatically when the PA is in use, and the application is not notified when these adjustments occur.

See these documents for in-depth explanations of how to configure and use the available PA features:

- **AN1127: Power Amplifier Power Conversion Functions in RAIL 2.x**

#### PA Power Persistent Configs Utility

##### RAIL PA NVM Configs Utility

This optional software component can be enabled to allow overriding an application's compile-time default configurations for PA mode and PA power curve/table settings for the supported modes. This might be used to calibrate a particular device or set of devices. These overriding settings must still conform to the platform's possible PA modes and curve/table sizes. This component currently supports only EFR32xG24 and xG26.

Note that it is currently compatible only with the RAIL 2.x [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component and not the RAIL 3 [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) component due to the former's use of curves vs. the latter's use of conversion tables. This should be rectified in a future release.

By enabling this component, at application startup time the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component will check for the existence of these NVM3 tokens:

- [SL_RAIL_UTIL_PA_NVM_MODE_TAG](pa#sl-rail-util-pa-nvm-mode-tag) containing a [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t). <br />  
   If this token exists and is a valid PA mode supported by the platform, it will override the compile-time [RAIL_TxPowerConfig_t::mode](rail-tx-power-config-t#mode) returned by [sl_rail_util_pa_get_tx_power_config_2p4ghz()](pa-power-conversions#sl-rail-util-pa-get-tx-power-config-2p4ghz) which is used by stacks and applications to get the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component's power configuration.
- [SL_RAIL_UTIL_PA_NVM_CONFIG_TAG](pa#sl-rail-util-pa-nvm-config-tag) containing a [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t). <br />  
   If this token exists and is valid, it will override the compile-time [RAIL_TxPowerCurvesConfigAlt_t](rail-tx-power-curves-config-alt-t) configuration which is applied in [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component's initialization call to [RAIL_InitTxPowerCurvesAlt()](pa-curve-conversions#rail-init-tx-power-curves-alt).

The component provides APIs for writing and reading these NVM3 tokens, please refer to the [sl_rail_util_pa_nvm_configs.h](sl-rail-util-pa-nvm-configs-h) file for details.

See these documents for in-depth explanations of how to configure and use the available PA features:

- **AN1127: Power Amplifier Power Conversion Functions in RAIL 2.x**

###### Configuration Options

This component has no configuration options.

###### EFR32xG24 Example

The default PA curves/tables configuration that RAIL provides for the VBAT powered 20 dBm EFR32xG24 (in plugin/pa-conversions/efr32xg24/sl_rail_util_pa_curves_20dbm.h) would have the following [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) layout when stored in the NVM3 [SL_RAIL_UTIL_PA_NVM_CONFIG_TAG](pa#sl-rail-util-pa-nvm-config-tag). Multi-byte fields must be stored in little-endian format. The byte offet of each field/value is shown in comments below: 

```c
static sl_rail_nvm_pa_config_t serialized_pa_config = {
/*byte*/
/*   0*/  .version           = 1,
/*   1*/  .num_descriptors   = 2,
/*   2*/  .pa_voltage        = 0,
/*   4*/  .signature         = 0,
/*   8*/  .pa_descriptors    = {
/*   8*/    { .algorithm               = 0,
/*   9*/      .num_segments_or_entries = 8,
/*  10*/      .min                     = 0,
/*  11*/      .max                     = 180,
/*  12*/    },
/*  12*/    { .algorithm               = 1,
/*  13*/      .num_segments_or_entries = 16,
/*  14*/      .min                     = 0,
/*  15*/      .max                     = 15,
/*  16*/    },
/*  16*/  },
/*  16*/  .pa_curve_or_table = {
/*  16*/    { .curve = {
/*  16*/        .curve_min_ddbm = -338,
/*  18*/        .curve_max_ddbm = 200,
/*  20*/        .curve_segments = {
/*  20*/          { .maxPowerLevel = 180,
/*  22*/            .slope         = 2280,
/*  24*/            .intercept     = -291457,
/*  28*/          },
/*  28*/          { .maxPowerLevel = 78,
/*  30*/            .slope         = 770,
/*  32*/            .intercept     = -46749,
/*  36*/          },
/*  36*/          { .maxPowerLevel = 44,
/*  38*/            .slope         = 431,
/*  40*/            .intercept     = -6673,
/*  44*/          },
/*  44*/          { .maxPowerLevel = 27,
/*  46*/            .slope         = 255,
/*  48*/            .intercept     = 6886,
/*  52*/          },
/*  52*/          { .maxPowerLevel = 17,
/*  54*/            .slope         = 167,
/*  56*/            .intercept     = 10458,
/*  60*/          },
/*  60*/          { .maxPowerLevel = 10,
/*  62*/            .slope         = 98,
/*  64*/            .intercept     = 10261,
/*  68*/          },
/*  68*/          { .maxPowerLevel = 6,
/*  70*/            .slope         = 59,
/*  72*/            .intercept     = 8616,
/*  76*/          },
/*  76*/          { .maxPowerLevel = 3,
/*  78*/            .slope         = 11,
/*  80*/            .intercept     = 3745,
/*  84*/          },
//  :   a 9th curve segment is allowed but not used so this is pad
/*  92*/        },
/*  92*/      },
/*  92*/    },
/*  92*/    { .table = {
/*  92*/        { -250,
/*  94*/          -148,
/*  96*/          -95,
/*  98*/          -68,
/* 100*/          -51,
/* 102*/          -40,
/* 104*/          -32,
/* 106*/          -26,
/* 108*/          -22,
/* 110*/          -18,
/* 112*/          -16,
/* 114*/          -13,
/* 116*/          -12,
/* 118*/          -10,
/* 120*/          -9,
/* 122*/          -9,
/* 124*/        },
/* 124*/      },
//  :   a 1-9-segment curve can be substituted for a table so this is pad
/* 168*/    },
/* 168*/  },
};

```

#### Protocol Utility

##### RAIL Protocol Utility

This optional software component can be enabled to include default functionality related to protocol configuration.

This RAIL utility permits the configuration of protocol-specific settings. Each of these protocols can be configured:

- Bluetooth LE
- IEEE 802.15.4, 2.4 GHz
- IEEE 802.16.5, GB868 (sub 1-GHz)
- Sidewalk
- Z-Wave

###### Configuration Options

The following configuration options can be changed:

- Timing configurations common to every protocol  
  - Transition Times    
    - Transition time (microseconds) from idle to RX    
    - Transition time (microseconds) from TX to RX    
    - Transition time (microseconds) from idle to TX    
    - Transition time (microseconds) from RX to TX  
  - RX Search Timeouts    
    - Enable RX Search timeout after idle    
    - Enable RX Search timeout after TX
- IEEE 802.15.4, 2.4 GHz-specific configurations  
  - Node Configurations    
    - Enable PAN Coordinator    
    - Enable Promiscuous Mode    
    - Enable default Frame Pending bit value for outgoing ACKs in response to Data Request Command  
  - Receivable Frame Types    
    - Beacon Frames    
    - Data Frames    
    - ACK Frames    
    - Command Frames  
  - Auto ACKs    
    - RX ACK timeout duration (microseconds)    
    - Radio state transition after attempting to receive ACK    
    - Radio state transition after transmitting ACK
- IEEE 802.16.5, GB868 (sub 1-GHz)-specific configurations  
  - The same protocol-specific configurations exist for this protocol as exist for IEEE 802.15.4, 2.4 GHz, above.
- Sidewalk-specific configurations  
  - (None)
- Z-Wave-specific configurations  
  - Node Configurations    
    - Enable Promiscuous Mode    
    - Accept Beam Frames    
    - Filter Packets Based on Node ID

#### Packet Trace Interface (PTI) Utility

##### RAIL PTI Utility

This optional software component can be enabled to configure the PTI interface. The PTI interface allows the user to collect receive and transmit packet data in real time over a dedicated serial interface for debugging network activity.

When using a Silicon Labs radio board, the configuration options for this software component are set up automatically to match the pin mapping on that board. When using a custom board these options can be set any way that makes sense to the user. Keep in mind that the Silicon Labs WSTK is able to capture and parse this data but currently requires UART mode and defaults to a 1.6Mbps data rate.

###### Configuration Options

The following configuration options can be changed:

- PTI mode  
  - [RAIL_PTI_MODE_UART](pti#rail-pti-mode-uart) : In this mode two pins will be used. One for normal 8 bit UART data (no parity, 1.5 stop bits, LSB first) and one for a framing signal to indicate when a packet begins and ends.  
  - [RAIL_PTI_MODE_SPI](pti#rail-pti-mode-spi) : In SPI mode three pins will be used. One for data, one for the clock, and one for the framing signal.  
  - [RAIL_PTI_MODE_UART_ONEWIRE](pti#rail-pti-mode-uart-onewire) : In this mode one pin will be used for 9 bit UART data (no parity, 1.5 stop bits, LSB first) where the 9th bit is 1 for control bytes and 0 for normal data. This along with knowledge of the control bytes can be used to parse the data stream.  
  - [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled) : Turn off the peripheral.
- PTI baudrate  
  - The PTI buadrate is created using an 8 bit integer divisor on the radio clock (HFXO) frequency. This limits the selectable range of baud rate values but also means that as the frequency increases the achievable baud rates will be spaced further apart. For this reason SPI mode is preferred at high data rates. Valid ranges for different crystal frequencies are shown below:    
    - 38.4 MHz HFXO: Baud rates in the range [149.4kbps, 19.2Mbps]    
    - 39.0 MHz HFXO: Baud rates in the range [151.8kbps, 19.5Mbps]

The following hardware options can be changed:

- Configure the DOUT GPIO pin. DOUT is needed for all PTI modes (UART, UART Onewire, SPI) and contains the actual serial data.
- Configure the DFRAME GPIO pin. DFRAME is needed for UART and SPI modes only and is used to frame the start and end of packets. This is not used for UART Onewire mode.
- Configure the DCLK GPIO pin. DCLK is needed for SPI mode only.

#### Recommended Utility

##### RAIL Recommended Utility

This optional software component can be enabled to include a recommended collection of other optional RAIL utilities. There are two mutually-exclusive variants:

- sl_rail_util_recommended - for use with applications using RAIL 3 APIs. It recommends other RAIL 3 components.
- rail_util_init (deprecated) - for use with legacy RAIL 2.x applications. It recommends older RAIL 2.x components for backwards compatibility.

This RAIL utility attempts to identify those RAIL utilities most commonly used by applications. If a list of utilities different from what is auto-selected here is sought, this component must be removed from the project with the custom list manually being added to the project.

Common RAIL utilities recommended for general use include:

- [Initialization](rail-util-init)
- [Callbacks](rail-util-callbacks)
- [Protocol](rail-util-protocol)
- [RAIL 3 PA Power Conversion Utility](sl-rail-util-pa) or [Power Amplifier (PA)](rail-util-pa)
- [Packet Trace Interface (PTI)](rail-util-pti)
- [Received Signal Strength Indicator (RSSI)](rail-util-rssi)
- [Direct Memory Access (DMA)](rail-util-dma)  
  - This primarily accelerates radio initialization, so it is currently included only for dynamic multiprotocol (DMP) scenarios.

#### RF Path Utility

##### RAIL RF Path Utility

This optional software component can be enabled to include default functionality related to device-internal and device-external RF path configuration.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

**Note**

- This plugin is unnecessary if the project already contains [Antenna Diversity Utility](rail-util-ant-div).

###### Configuration Options

The following configuration options can be changed:

- Device-internal (EFR32XG21, EFR32XG23, and EFR32XG28 only)  
  - Switch between 2 RF paths (i.e., device pins).

#### RF Path Switch Utility

##### RAIL RF Path Switch Utility

This optional software component can be enabled to control a GPIO toggled switch based on RFPATH selection and radio state. An example usage of this component is toggling a switch on RFPATH0 to ground when RFPATH1 is in use to avoid spurious harmonics.

When using a Silicon Labs-developed board, the configuration options for this software component are set up automatically based on the selected board. When using a custom board, manually configure the configuration options.

**Note**

- Usage of this component is only relevant on the dual-band EFR32XG28 where externally grounding the unused RF path prevents spurious harmonics.

###### Configuration Options

The following configuration macros are available for modification:

- RF Path Switch:  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_CONTROL_PORT: GPIO port for rfpath selection signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_CONTROL_PIN: GPIO pin for rfpath selection signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_INVERTED_CONTROL_PORT: GPIO port for logical NOT rfpath selection signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_INVERTED_CONTROL_PIN: GPIO pin for logical NOT rfpath selection signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_RADIO_ACTIVE_PORT: GPIO port for radio active signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_RADIO_ACTIVE_PIN: GPIO pin for radio active signal output.  
  - SL_RAIL_UTIL_RF_PATH_SWITCH_RADIO_ACTIVE_MODE: Logical AND radio active signal output with CONTROL or INVERTED_CONTROL signal outputs if set to SL_RAIL_UTIL_RF_PATH_SWITCH_RADIO_ACTIVE_COMBINE.

#### Received Signal Strength Indicator (RSSI) Utility

##### RAIL RSSI Utility

This optional software component can be enabled to include default functionality related to RSSI configuration.

To make RSSI values more consistent among families of chips, this software offset can be automatically applied.

###### Configuration Options

The following configuration options can be changed:

- Software RSSI offset value

#### Radio Sequencer Image Selection Utility

##### RAIL Utility for Selecting a Radio Sequencer Image

This optional software component allows for the selection of a specific radio sequencer image on platforms that support multiple images. The selection can be done automatically based on properties of the OPN, or manually based on the application needs of the user.

Currently, only EFR32XG24 supports multiple sequencer images. The two images available for that platform are for the 10 dBm PA and 20 dBm PA variants. This component will select the correct image automatically based on the OPN. In the future, other sequencer images may be introduced on other platforms that allow the user to choose an application specific custom sequencer image.

On platforms that support only one default sequencer image, this component is safe to include, and will have no effect.

###### Configuration Options

The following configuration options can be changed:

- Enable/disable run-time selection of the sequencer image.

#### Software Modem (SFM) sequencer image selection Utility

##### RAIL Utility for selecting SFM sequencer image

This optional software component allows for the selection of a specific SFM sequencer image on EFR32XG25 platform. Currently, available images are intended for the support of following sets of modulations:

- SUN OFDM + SUN OQPSK
- SUN OFDM
- NONE

#### Thermistor Utility

##### RAIL Thermistor Utility

This optional software component can be enabled to include advanced functionalities related to temperature on target where [SL_RAIL_SUPPORTS_EXTERNAL_THERMISTOR](features#sl-rail-supports-external-thermistor-1) is true.

The thermistor component allows the user to enabled multiple features related to temperature such as:

- High Frequency Crystal Oscillator (HFXO) compensation
- Thermal protection

Note that thermistor can be used independently of this component using already exisiting API such as:

- [sl_rail_start_thermistor_measurement()](external-thermistor#sl-rail-start-thermistor-measurement).
- [sl_rail_get_thermistor_impedance()](external-thermistor#sl-rail-get-thermistor-impedance).

This component offers a default configuration and conversion functions.

When using a Silicon Labs-developed board with a thermistor, the configuration options for this software component are set up automatically and the conversion functions are based on the selected board. When using a custom board, user must manually configure the configuration options. If the thermistor is custom as well, user must manually override the conversion functions.

###### Configuration Options

The following hardware options can be changed:

- Configure the THERMISTOR GPIO pin.
- Configure the THERMISTOR GPIO port.

The following conversion callback functions can be changed:

- Impedance to temperature conversion ([sl_railcb_convert_thermistor_impedance()](external-thermistor#sl-railcb-convert-thermistor-impedance)).
- Temperature to PPM deviation conversion ([sl_railcb_compute_hfxo_error_ppm()](external-thermistor#sl-railcb-compute-hfxo-error-ppm)).

### Release Notes

#### RAIL Library 3.1.0 GA

##### Release Highlights

- Bugfixes and minor improvements.

##### Release Details

- [API Changes](api-changes#api-changes-1api-changes-3-1-0)
- [RAIL Changelist](changelist#changelist-1changelist-3-1-0)
- [RAILtest Changelist](rail-test-changelist)
- [Deprecated List](deprecated)

#### Modules

[RAIL Changelist](changelist)

[RAILtest Changelist](rail-test-changelist)

[API Changes](api-changes)

#### RAIL Changelist

###### 3.1.0

- **469945:** Added RX computation of [sl_rail_packet_time_stamp_t::packet_duration_us](sl-rail-packet-time-stamp-t#packet-duration-us) for non-BLE PHYs on all supported platforms except EFR32xG21. This duration can be used for timestamp adjustment by setting [sl_rail_packet_time_stamp_t::total_packet_bytes](sl-rail-packet-time-stamp-t#total-packet-bytes) to [SL_RAIL_RX_STARTED_BYTES](system-timing#sl-rail-rx-started-bytes).
- **1435640:** Fixed an issue were changing radio configurations while frame detection is disabled due to RX overflow or [SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#sl-rail-rx-option-disable-frame-detection) would silently re-enable frame detection.
- **1506276:** Reduced host flash/RAM alignment requirements for RAIL RISC-V sequencer and Soft Modem image data on EFR32xG25 and Series 3 devices.
- **1529962:** Fixed an issue where enabling Coex PHY Select on non-Series 1 devices could build without reporting the unsupported configuration. The build now fails with an error because Coex PHY Select is supported only on Series 1 devices.
- **1569271:** Fixed an issue on the SixG301 part where [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) was not generated for the IEEE 802.15.4 stack when Fast Channel Switching is enabled.
- **1570638:** Fixed an issue on the EFR32xG25 where writing to an empty TX FIFO during a transmit could cause data corruption, with the first added byte sent twice. This was more likely to occur with OFDM or SUN OQPSK PHYs.
- **1577029:** Fixed [sl_rail_idle()](state-transitions#sl-rail-idle-1)[SL_RAIL_IDLE_ABORT](state-transitions#sl-rail-idle-abort) behavior when [SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#sl-rail-rx-option-track-aborted-frames) is enabled so an active receive is aborted immediately instead of being allowed to complete and potentially transmit an Auto-ACK.
- **1579758:** Fixed an issue where a short-backoff CSMA/LBT transmit could incorrectly report channel busy when started while the radio was still transitioning back to receive after a prior transmit.
- **1604104:** Fixed an issue with [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx) / [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx) where the CSMA/LBT operation would commence approximately 100us before the scheduled time.
- **1613379:** Changed IR calibration behavior for 2.4 GHz PHY configurations: RAIL now applies the quick IR calibration automatically when these PHYs are configured, so [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) is no longer raised for BLE and IEEE 802.15.4 2.4 GHz PHYs. Stacks such as Zigbee, Thread, and BLE no longer need to call [sl_rail_calibrate_ir()](calibration#sl-rail-calibrate-ir), [sl_rail_ieee802154_calibrate_ir_2p4_ghz()](calibration#sl-rail-ieee802154-calibrate-ir-2p4-ghz), or [sl_rail_ble_calibrate_ir()](calibration#sl-rail-ble-calibrate-ir) for these PHYs. Sub-GHz PHYs are unchanged and still raise [SL_RAIL_EVENT_CAL_NEEDED](events#sl-rail-event-cal-needed) when IR calibration is needed.
- **1614412:** Updated data management documentation for chunked transmit on EFR32xG25 platforms, clarifying TX FIFO fill requirements before transmit start. For OFDM and SUN OQPSK, the FIFO must contain the PHR and first two payload bytes before transmit starts; during transmit, data must be written in chunks of at least two bytes except for the final chunk.
- **1616076:** Fixed a timing issue with delayed or missing first [SL_RAIL_EVENT_TX_CCA_ACTIVATED](events#sl-rail-event-tx-cca-activated) when using [sl_rail_start_scheduled_cca_csma_tx()](packet-tx#sl-rail-start-scheduled-cca-csma-tx) or [sl_rail_start_scheduled_cca_lbt_tx()](packet-tx#sl-rail-start-scheduled-cca-lbt-tx).
- **1622188:** Added [sl_rail_get_events_config()](events#sl-rail-get-events-config) to return the currently enabled RAIL events.
- **1625060:** Fixed a race condition that could cause a channel-hopping packet received soon after a transmit to report an incorrect [sl_rail_rx_packet_details_t::channel_hopping_channel_index](sl-rail-rx-packet-details-t#channel-hopping-channel-index) (while [sl_rail_rx_packet_details_t::channel](sl-rail-rx-packet-details-t#channel) is correct).
- **1626321:** Fixed an issue with timestamp adjustment where SUN OQPSK RX frame duration computation on the EFR32xG25 could be incorrect, and TX timestamps could use the wrong delay value for TX start or end timestamps.
- **1629183:** Fixed a Z-Wave TX power adjustment compliance issue by providing Sub-GHz PA auto-mode curves in rail_util_pa and PA auto-mode power mapping tables in sl_rail_util_pa_tables for EFR32xG23, EFR32xG28, and EFR32xG2D devices.

###### 3.0.3

- **1627182:** Fixed a race condition that could cause a channel-hopping packet received soon after a transmit to report an incorrect [sl_rail_rx_packet_details_t::channel_hopping_channel_index](sl-rail-rx-packet-details-t#channel-hopping-channel-index) (while [sl_rail_rx_packet_details_t::channel](sl-rail-rx-packet-details-t#channel) is correct).
- **1629254:** Fixed an issue on the EFR32xG25 part, where writing to an empty TX FIFO during a transmit could cause data corruption (first added byte sent twice), with a greater chance of occurring with OFDM or SUN OQPSK PHYs.

###### 3.0.2

- **1563479:** Optimized some recent changes that regressed RX-to-RX-with- channel-change timing vs. sisdk-2025.6 release.
- **1565641:** Eliminated a race condition on the SixG301 part where Fast Channel Switching could impact CSMA transmits.
- **1572298:** Fixed an issue where calling [sl_rail_ieee802154_config_gb863_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb863-mhz-radio) or [sl_rail_ieee802154_config_gb915_mhz_radio()](ieee802-15-4#sl-rail-ieee802154-config-gb915-mhz-radio) no longer implicitly enabled [SL_RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#sl-rail-ieee802154-g-option-gb868). It had to be enabled by calling [sl_rail_ieee802154_config_g_options()](ieee802-15-4#sl-rail-ieee802154-config-g-options) later.
- **1576544:** Fixed an issue on the SixG301 part where [SL_RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#sl-rail-event-ieee802154-data-request-command) was not generated for the IEEE 802.15.4 stack when Fast Channel Switching is enabled.
- **1579915:** Fixed an issue on the SIxG301 part, where the radio would not receive packets when switching protocols in a Dynamic Multiprotocol applications.
- **1581066:** Fixed an issue where changing radio configurations while frame detection is disabled due to RX overflow or [SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION](receive#sl-rail-rx-option-disable-frame-detection) would silently re-enable frame detection.

###### 3.0.1

- **1586903:** Fixed an issue where the power-restriction limits were incorrect for the MGM270SC22SNA and BGM270SC22SNA modules.

###### 3.0.0

- **233012:** Fixed an issue with coexistence and CSMA transmits where Request could be improperly deasserted on a CCAs (clear channel assessments) with zero backoff preventing that CCA from seeing a clear channel to permit transmit.
- **339626:** The [RAIL_ConfigData()](data-management#rail-config-data) API has been split into two RAIL 3 functions [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data) and [sl_rail_config_tx_data()](data-management#sl-rail-config-tx-data) to allow independent control of Rx and Tx data configuration respectively.
- **635398:** Renamed ver.h to rail_version.h and ver_def.h to rail_version_def.h.
- **1309208:** Fixed a minor issue on the EFR32xG21 where the TX-to-RX turnaround timing could be a bit longer than specified.
- **1338958:** Fixed documentation of [sl_rail_packet_time_stamp_t::packet_duration_us](sl-rail-packet-time-stamp-t#packet-duration-us) which is supported on all platforms for normal transmits but no platforms for Auto-Ack transmits.
- **1341766:** Updated the entries in the power setting table to include PA submode for the SixG301 part.
- **1356085:** The RAIL Utility, RSSI Internal component can now store and retrieve the chip RSSI offset from NVM3 persistent storage.
- **1413026:** In RAIL 3.0, [sl_rail_set_tx_fifo()](data-management#sl-rail-set-tx-fifo) now supports configuring a transmit FIFO whose size is not a power-of-2. Such a FIFO is usable only in TX [SL_RAIL_DATA_METHOD_PACKET_MODE](data-management#sl-rail-data-method-packet-mode) and not TX [SL_RAIL_DATA_METHOD_FIFO_MODE](data-management#sl-rail-data-method-fifo-mode). In RAIL 2.x, [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) does not support this; its functionality remains unchanged.
- **1434510:** Fixed an issue on the SixG301 where a ramp time of more than 1000us would trigger an assert; the maximum ramp time is now limited to 1000us.
- **1434640:** Added a callback [sl_railcb_convert_ddbm_to_power_setting_entry](pa#sl-railcb-convert-ddbm-to-power-setting-entry) which provides register settings for requested deci-dBm power. This replaces the now-deprecated RAIL 2.x [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw) API.
- **1439738:** Updated the documentation to clarify that [sl_rail_get_channel_hopping_rssi()](rx-channel-hopping#sl-rail-get-channel-hopping-rssi) returns the RSSI in units of quarter-dBm and not deci-dBm.
- **1464190:** Added RAIL support for MGM270SC22SNA4 and BGM270SC22SNA4 modules.
- **1464642:** The functionality of [RAIL_TX_OPTION_CCA_PEAK_RSSI](transmit#rail-tx-option-cca-peak-rssi) has been eliminated because it allows for false clear channel assessments. This option is now ignored.
- **1466517:** Updated the railtest and new sl_rail_test apps to use memory_manager (sl_malloc/free()) component rather than silabs_core_memory_manager. Due to this change, code size increases and interrupt latency may also increase a bit.
- **1470529:** Fixed an issue with coexistence where some CSMA transmit CCAs (clear channel assessments) provided no advance warning to assert Request and be Granted in time for the CCA to see a clear channel and permit transmit.
- **1470813:** Added [sl_rail_ieee802154_config_signal_identifier()](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier) and [sl_rail_ble_config_signal_identifier()](ble#sl-rail-ble-config-signal-identifier) APIs to the configure signal identifier for IEEE 802.15.4 and BLE protocols respectively.
- **1470820:** Provided ability to adjust the RAIL default high and low RF Sense sensitivity thresholds.
- **1474636:** Fixed an issue where a very small packet (1-2 bytes) with a very fast PHY (>= 2mbps) can be improperly dropped or trigger [SL_RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO](assertions#sl-rail-assert-failed-unexpected-state-rx-fifo). On EFR32xG2x platforms it is still possible such packets will not properly respect an RX transition to TX, e.g., for autoAck.
- **1478786:** Fixed an issue where the BGM260PB32VNA module failed to build due to incorrect signatures.
- **1481910:** Added RAIL Utility, IEEE802.15.4 Fast Channel Switching and RAIL Utility, IEEE802.15.4 Duty Cycling components to be used with RAIL Utility, IEEE802.15.4 PHY Configuration on the SixG301 part.
- **1490308:** Fixed an issue where [RAIL_ConfigData()](data-management#rail-config-data) or [sl_rail_config_rx_data()](data-management#sl-rail-config-rx-data) would mistakenly return success if the RX buffer write offset is not properly aligned for the requested RX source to function properly. Also clarified documentation around these function's alignment requirements.
- **1496415:** Expanded the fix for issue 1470529 to cover fixed and 0-backoff CSMA/LBT operations and issue [SL_RAIL_EVENT_TX_CCA_ACTIVATED](events#sl-rail-event-tx-cca-activated) when LBT is actually started and not sooner.
- **1498230:** Added [sl_rail_abort_rx_incoming_packet()](packet-information#sl-rail-abort-rx-incoming-packet) allowing an application to abort an incoming packet during its reception.
- **1499282:** Fixed an issue where RAIL could hang in its idle code path when switching from the IEEE 802.15.4 High Data Rate (HDR) PHY to the normal 802.15.4 PHY.
- **1503687:** Fixed [sl_rail_get_rx_time_preamble_start()](packet-information#sl-rail-get-rx-time-preamble-start) and [sl_rail_get_rx_time_sync_word_end()](packet-information#sl-rail-get-rx-time-sync-word-end) on the EFR32xG25 part for OFDM and OQPSK modulations.
- **1514841:** RAIL libraries are now built to avoid instructions or optimizations that might cause an unaligned access trap, should such be enabled on Cortex M platforms.
- **1518333:** Fixed an issue on the EFR32xG25 where the radio could not receive any frame after the radio is idled while OFDM frame detection is ongoing.
- **1521306:** Added a new API [sl_rail_ble_config_channels()](ble#sl-rail-ble-config-channels) to load any BLE channel configuration.
- **1523880:** Fixed an issue on the EFE32xG25, where the radio could get a sync detect event without a completion event when [sl_rail_idle()](state-transitions#sl-rail-idle-1) was called just before the frame detection.
- **1524707:** Added a new RAIL library variation that uses secure peripheral addresses.
- **1524998:** Fixed an issue with Concurrent RX Channel Switching on EFR32xG2x platforms which could cause transmit to lock up and never complete.
- **1530983:** Fixed an issue with BLE on EFR32xG27 and EFR32xG29 where RX overflow could render the protocol deaf.
- **1531433:** In RAIL 3.0, Modules are not yet supported by the new sl_rail_util_pa plugin. This is fixed by adding a sl_rail_util_compatible_pa component that will pull in the correct PA plugin depending on whether building for modules or SoC's.
- **1542463:** Fixed a race condition on the EFR32xG25 with OFDM-FSK concurrent PHYs where idling the radio during a [SL_RAIL_EVENT_RX_PREAMBLE_LOST](events#sl-rail-event-rx-preamble-lost) event would not idle the software modem.
- **1557444:** Fixed a Channel Sounding issue on the EFR32xG24 platform where the device would transmit a tone longer than expected on Phase-Based Ranging steps.

###### 2.19.2

- **1465709:** Improved automatic LNA bypass on the EFR32xG25 part by keeping the bypass on after timeout if power is still above threshold.
- **1473541:** Fixed an issue with [RAIL_BLE_PhySimulscan](ble-phy#rail-ble-phy-simulscan) that could break BLE 1 Mbps transmit on EFR32xG24 and EFR32xG26 parts.
- **1503811:** Fixed an issue introduced in 2.19.1 which caused applications using the Coexistence directional priority feature to fail to compile on EFR32xGxx parts. This feature is not yet supported on the SIGx301 part.
- **1509674:** Fixed an assert issue on the MGM260PB22VNA module when running BLE applications.

###### 2.19.1

- **1455258:** Fixed a BLE scan response timing issue that could affect BLE- related applications on the 20dBm EFR32xG21 devices interacting with non Silabs devices.
- **1473957:** Updated the quality of the Fast Channel Switching Configuration component to Production.
- **1476867:** Fixed an issue where BGM260PB32VNA module failed to build due to incorrect signatures.

###### 2.19.0

- **1274214:** Fixed an issue on EFR32xG23, EFR32xG25, EFR32xG26 and EFR32xG28 where radio was blocked in [RAIL_RF_STATE_RX_ACTIVE](state-transitions#rail-rf-state-rx-active).
- **1355305:** Fixed an issue where the events [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect), [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost) and [RAIL_EVENT_RX_SYNC1_DETECT](events#rail-event-rx-sync1-detect) were not generated for WiSUN OQPSK PHYs on the EFR32xG25 part.
- **1356085:** The rail_util_rssi component can now store and retrieve the chip RSSI offset from NVM3 persistent storage.
- **1357024:** Fixed a false CCA busy issue on the EFR32xG28 part.
- **1357942:** Added new component [PA Power Persistent Configs Utility](rail-util-pa-nvm-configs) providing ability to store PA mode and/or PA curves/tables configs in persistent NVM3 on EFR32xG24 and EFR32xG26, overriding their compile-time configurations.
- **1414408:** Added RAIL support for the MGM270SC32SNA2 module.
- **1425355:** Updated documentation to clarify the usage of [RAIL_TX_OPTION_CCA_PEAK_RSSI](transmit#rail-tx-option-cca-peak-rssi) which can result in false channel clear determinations.
- **1426472:** Fixed an issue were PTI was only partially disabled when configured with [RAIL_PTI_MODE_DISABLED](pti#rail-pti-mode-disabled) (which is RAIL's default), and accordingly clarified [RAIL_ConfigPti()](pti#rail-config-pti) and [RAIL_EnablePti()](pti#rail-enable-pti) documentation.
- **1435514:** Fixed an issue on the EFR32xG24, where enabling channel sounding under certain conditions can potentially result in hanging the system in the default handler.
- **1436580:** Clarified [RAIL_SetRssiOffset()](receive#rail-set-rssi-offset) documentation, describing the range of valid values for radio and protocol offsets.
- **1437972:** Fixed an issue on the EFR32xG24, where the RSSI reported on certain channel sounding SYNC packets could be lower than expected.
- **1439738:** Updated the documentation to clarify that [RAIL_GetChannelHoppingRssi()](rx-channel-hopping#rail-get-channel-hopping-rssi) returns the RSSI in units of quarter-dBm and not deci-dBm.
- **1439816:** Fixed an issue with Wi-SUN mode switch where idling the radio after [RAIL_EVENT_IEEE802154_MODESWITCH_START](events#rail-event-ieee802154-modeswitch-start) can prevent reception of future mode switch headers.
- **1445964:** Fixed an issue in [RAIL_GetRxPacketDetails()](packet-information#rail-get-rx-packet-details) where the duration of the packet would be incorrect when packet size is larger than 534 bytes on the EFR32xG25 part.
- **1450906:** Fixed an issue on the EFR32xG24, where CS antenna switching would not work when configured for GPIOs on PortC or PortD.

###### 2.18.2

- **1375717:** Updated component documentation for [RF Path Switch Utility](rail-util-rf-path-switch) and [RF Path Utility](rail-util-rf-path) to clarify appropriate usage.
- **1389592:** Fixed an issue in [Coexistence Utility](rail-util-coex) where enabling Grant, Priority and Request signals would cause hard fault in Matter + BLE multiprotocol application.
- **1412900:** Fixed an issue in the [BLE Channel Sounding (CS) Antenna Offset Utility](rail-util-ble-cs-antenna-offset) where array lengths of wired and wireless antenna offset values were fixed to a default size regardless of the antenna count of a selected board.
- **1419786:** Updated Wi-SUN mode switch channel mask for BZ band in RAILTEST on the EFR32xG25 part.
- **1426191:** Fixed an issue in dynamic multiprotocol applications where a radio does not enter into EM2 sleep mode when no active tasks are being performed.

###### 2.18.1

- **1172597:** Fixed an issue with [RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#rail-rx-channel-hopping-mode-manual) where [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete) wouldn't be signaled. Added new [RAIL_TriggerRxChannelHop()](rx-channel-hopping#rail-trigger-rx-channel-hop) API for manually triggering an RX channel hop, a refinement of [RAIL_CalibrateTemp()](calibration#rail-calibrate-temp). Also noted [RAIL_RX_CHANNEL_HOPPING_OPTION_STOP](rx-channel-hopping#rail-rx-channel-hopping-option-stop) was only intended for testing purposes and is not supported on the EFR32xG21 part.
- **1349369:** Fixed an issue where power restrictions were incorrectly applied through channel configs on the platforms that support [RAIL_SUPPORTS_DBM_POWERSETTING_MAPPING_TABLE](features#rail-supports-dbm-powersetting-mapping-table).
- **1365389:** Added RAIL support for the MGM260PD32VNA2, MGM260PD32VNN2, MGM260PD22VNA2, MGM260PB32VNA5, MGM260PB32VNN5, MGM260PB22VNA5, BGM260PB22VNA2 and BGM260PB32VNA2 modules.
- **1380153:** Fixed an issue where calling [RAIL_Idle()](state-transitions#rail-idle-1) can prevent any future reception on the EFR32xG25 for OFDM-FSK concurrent PHYs.
- **1389189:** Fixed a false channel busy issue when automatic LNA bypass is enabled on the EFR32xG25 part.

###### 2.18.0

- **748807:** Added [RAIL_GetRxIncomingPacketRssi](receive#rail-get-rx-incoming-packet-rssi) to get the RSSI associated with the incoming packet.
- **1120643:** Fixed an issue where the phy was not re-configured correctly when using the [RAIL_ConfigSyncWords](radio-configuration#rail-config-sync-words) API with certain custom modem configurations.
- **1269262:** Added support for [BLE Channel Sounding (CS) Antenna Offset Utility](rail-util-ble-cs-antenna-offset) for BLE Channel Sounding feature on the EFR32xG24 that allows customer to configure offsets for a wired or wireless antenna configuration.
- **1273595:** To better reflect Z-Wave spec naming conventions, renamed [RAIL_ZWAVE_REGION_US_LR_END_DEVICE](z-wave#rail-zwave-region-us-lr-end-device) to [RAIL_ZWAVE_REGION_US_LR3](z-wave#rail-zwave-region-us-lr3), [RAIL_ZWAVE_REGION_EU_LR_END_DEVICE](z-wave#rail-zwave-region-eu-lr-end-device) to [RAIL_ZWAVE_REGION_EU_LR3](z-wave#rail-zwave-region-eu-lr3), [RAIL_ZWAVE_REGIONID_US_LR_END_DEVICE](z-wave#rail-zwave-regionid-us-lr-end-device) to [RAIL_ZWAVE_REGIONID_US_LR3](z-wave#rail-zwave-regionid-us-lr3), and [RAIL_ZWAVE_REGIONID_EU_LR_END_DEVICE](z-wave#rail-zwave-regionid-eu-lr-end-device) to [RAIL_ZWAVE_REGIONID_EU_LR3](z-wave#rail-zwave-regionid-eu-lr3).
- **1290406:** To prepare for RAIL 3.0 specifications, [RAIL_Status_t](general#rail-status-t) is now sl_status_t and RAIL_STATUS_ values are mapped to similar SL_STATUS_ values.
- **1290731:** Fixed a multiprotocol issue where [RAIL_BLE_SetNextTxRepeat()](bletx2-tx#rail-ble-set-next-tx-repeat) or [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) information mistakenly survived across [RAIL_Idle()](state-transitions#rail-idle-1) to the surprise of a subsequent non-repeated transmit.
- **1300509:** Fixed an issue with IEEE 802.15.4 High Data Rate (HDR) packets such that PTI now properly indicates they have a 2-byte 802.15.4 PHY header on the EFR32xG26 part.
- **1306804:** Fixed an issue where glitches could occur when using [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) values other than RX_PACKET_DATA on the EFR32xG23 and newer chips.
- **1309139:** Fixed an issue on the EFR32xG22 and later where [RAIL_StopTx()](transmit#rail-stop-tx) being called before the transmit has started could cause the radio to return to receive with the radio partially misconfigured for transmit.
- **1309208:** Fixed a minor issue on the EFR32xG21 where the TX-to-RX turnaround timing could be a bit longer than specified.
- **1324392:** Added support for TrustZone APIs (see [api_changes_2_18_0](api-changes#api-changes-1api-changes-2-18-0) for more details) on the EFR32xG23 and EFR32xG28 parts to allow RAIL to access the CMU, EMU, GPIO, LDMA, HFXO, PRS and SYSRTC peripherals when they are running in the secure state despite the RAIL library being non-secure.
- **1338958:** Fixed documentation of [RAIL_PacketTimeStamp_t::packetDurationUs](rail-packet-time-stamp-t#packet-duration-us) which is supported on all platforms for normal transmits but no platforms for Auto-Ack transmits.
- **1352393:** Fixed an issue on ZGM230S modules where PHY signatures were computed incorrectly and the device would assert on startup.
- **1356059:** Updated the EFR32xx documentation to better clarify the RAIL dependencies on HFXO and TrustZone peripheral configuration.
- **1357948:** Fixed a DMP issue where the device would incorrectly switch to a background receive task with insufficient time to switch back to an upcoming high priority scheduled task.
- **1369901:** Fixed an issue where the device would become stuck when running image rejection calibration on an OFDM PHY from the event callback on the EFR32xG25 part.

###### 2.17.2

- **1276280:** Fixed a DMP scheduling issue where tasks were scheduled to run with inadequate time to complete before another pending task.
- **1306597:** Fixed a CCA issue on EFR32xG28 where, in some cases, the channel could be reported as busy even though it was free.
- **1329239:** Reduced the delay between TX completion and the start of PA ramp down on the EFR32xG24.

###### 2.17.1

- **1271542:** Fixed an issue on EFR32xG21 where an innopportunely-timed [RAIL_StopTx()](transmit#rail-stop-tx) using [RAIL_STOP_MODE_ACTIVE](transmit#rail-stop-mode-active) can hang a subsequent CSMA/LBT transmit during its clear-channel assessment (CCA).
- **1276280:** Fixed a scheduling issue where tasks were scheduled to run with inadequate time to complete before another pending task.
- **1325463:** Added support of automatic LNA bypass on the EFR32xG25 parts.

###### 2.17.0

- **758067:** Added support of collision detection for concurrent PHYs on the EFR32xG25 parts.
- **1227935:** Added support for additional Coex TX and RX metrics events to the [Coexistence Utility](rail-util-coex) component.
- **1242662:** Fixed incorrect default values for SL_RAIL_UTIL_PA_CALIBRATION_ENABLE on the EFR32xG24 and EFR32xG25 parts, along with an issue where Power Amplifier calibrations were not properly disabled when SL_RAIL_UTIL_PA_CALIBRATION_ENABLE was disabled.
- **1247525:** Updated few APIs to return [RAIL_Status_t](general#rail-status-t) which were returning void previously.
- **1247525:** Updated [RAIL_IEEE802154_WriteEnhAck](ieee802-15-4#rail-ieee802154-write-enh-ack) and [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo) which formerly took uint8_t ackDataLen parameter now take uint16_t ackDataLen parameter.
- **1247525:** Added missing runtime equivalent API [RAIL_SupportsPathDiversity()](features#rail-supports-path-diversity) of [RAIL_SUPPORTS_PATH_DIVERSITY](features#rail-supports-path-diversity-1).
- **1251783:** Removed documentation pertaining to EFR32 Series-1 platforms and updated chip-specific documentation for Series-2 platforms.
- **1255524:** Fixed a dynamic multiprotocol issue where [RAIL_BLE_Init()](ble#rail-ble-init) was called (which implicitly establishes the BLE 1Mbps PHY), but after a protocol switch returns to BLE, its [RAIL_BLE_ConfigChannelRadioParams()](ble#rail-ble-config-channel-radio-params) settings were not being properly reapplied.
- **1256045:** Fixed an issue where Signal Identifier options were being errantly displayed in Simplicity Studio for the [Coexistence Utility](rail-util-coex) component on platforms that don't support the Signal Identifier feature.
- **1265376:** Fixed an issue in the UC components where the RAIL power manager support could be initialized after the radio was started in certain example applications. This would lead to radio state and power mode requirements being improperly tracked as you must initialize power manager support before any radio operations.
- **1266003:** Fixed an issue where [RAIL_BLE_ConfigChannelRadioParams()](ble#rail-ble-config-channel-radio-params) was improperly overriding the BLE Quuppa PHY whitening configuration.

###### 2.16.2

- **1248013:** Fixed an issue with IEEE 802.15.4 High Data Rate (HDR) packets such that PTI now properly indicates they have a 2-byte 802.15.4 PHY header.
- **1255347:** Fixed an issue with [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) setup that could trip [RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO](assertions#rail-assert-failed-unexpected-state-tx-fifo) when the prior TX FIFO was larger and contained more data than the new smaller TX FIFO can hold. Any data in the old TX FIFO is now properly ignored.
- **1271435:** Fixed an issue where [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) could write outside the TX FIFO when called without resetting the FIFO in dynamic multiprotocol applications.

###### 2.16.1

- **1161746:** Updated [Wireless M-Bus](wmbus) protocol documentation and grouped it under [Protocol-specific](protocol-specific) hardware acceleration section of RAIL API document.
- **1168174:** Added support for setting the Whitening and CRC initial values at runtime that are defined by the existing PHY's radio configuration.
- **1241800:** AFixed an issue where we were missing the pa_dbm_mapping_table.py script in the GSDK. This script is used to help create power tables on the EFR32xG25 part.
- **1242723:** Fixed a situation where interrupts could be left off and the system would hang when using dynamic multiprotocol on the EFR32xG25.
- **1243727:** Improved the CCA reliability on the EFR32xG23, EFR32xG25 and EFR32xG28 chips.

###### 2.16.0

- **663884:** Added better information for [Front End Module (FEM) Utility](fem-util) component and its usage.
- **689770:** Added support for a new assert, which will be thrown if the loaded PHY is not supported by the software defined modem on the EFR32xG25.
- **748817:** Added new [RAIL_GetAutoAckFifo()](auto-ack#rail-get-auto-ack-fifo) API and allow NULL for [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo) or [RAIL_IEEE802154_WriteEnhAck()](ieee802-15-4#rail-ieee802154-write-enh-ack) ackData parameter, which gives applications direct access to the AutoAck FIFO to construct Ack packets in pieces.
- **751902:** Updated the default PTI rate to 3200000 bps on the EFR32XG25.
- **858169:** Updated documentation on the usage of [RAIL_EVENT_RX_TIMING_DETECT](events#rail-event-rx-timing-detect), [RAIL_EVENT_RX_TIMING_LOST](events#rail-event-rx-timing-lost), [RAIL_EVENT_RX_PREAMBLE_DETECT](events#rail-event-rx-preamble-detect) and [RAIL_EVENT_RX_PREAMBLE_LOST](events#rail-event-rx-preamble-lost) events and the possible issues that may be encountered when using these with certain demodulators on EFR32xG2x chips.
- **1079816:** Fixed a race condition on the EFR32xG22 and later during RX channel hopping or duty-cycling where frame detection occurring close to when a hop should happen could leave the radio stuck in reception but not receiving anything, with the only remedy being to idle the radio.
- **1088439:** Fixed an issue which would cause the incorrect antenna to be reported for a received packet on the EFR32xG25 when using OFDM and antenna diversity.
- **1104367:** Added support for antenna selection through the applicable [RAIL_RxOptions_t](receive#rail-rx-options-t) and [RAIL_TxOptions_t](transmit#rail-tx-options-t) values when using OFDM on the EFR32xG25.
- **1112324:** Added a new [Software Modem (SFM) sequencer image selection Utility](rail-util-sfm-sequencer) component to allow selection of modulations supported by EFR32xG25 software modem (SFM). These changes can save considerable flash space by reducing the set of modulations to just those that are needed.
- **1117349:** No longer include rail_chip_specific.h and [rail_features.h](rail-features-h) (anything dependent on em_device.h) when SLI_LIBRARY_BUILD is defined. This will allow the user to build their radio code in a way that depends on RAIL generically but is not chip-specific. When doing this the code cannot depend on things that are inherently chip-specific and are still in those files like RAIL_RF_PATHS, RAIL_NUM_PA, or any of the compile-time RAIL_SUPPORTS_xxx defines. Code will need to call appropriate runtime APIs or split itself between the generic and chip specific portions and build them separately.
- **1117349:** To better support chip-agnostic builds [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) is now a superset representing all possible PAs across all chips. Any code depending on the number of or consecutive ordering of chip-supported PAs will likely need to be updated.
- **1117349:** To better support chip-agnostic builds [RAIL_CalValues_t](calibration#rail-cal-values-t) and subordinate [RAIL_IrCalValues_t](rail-ir-cal-values-t) have grown to encompass the superset of fields needed on all chips, affecting all chips except EFR32xG25.
- **1117349:** To better support chip-agnostic builds [RAIL_TransitionTime_t](state-transitions#rail-transition-time-t) and therefore [RAIL_StateTiming_t](rail-state-timing-t) have grown to a superset type, affecting EFR32xG1.
- **1117349:** To better support chip-agnostic builds [RAIL_FIFO_ALIGNMENT](data-management#rail-fifo-alignment) is now universally 32-bit, affecting EFR32xG1x and EFR32xG21, but is still only enforced on chips actually requiring that alignment.
- **1129262:** Added support for Sidewalk PHYs on the EFR32xG23 and EFR32xG28 chips.
- **1129280:** Added an assert [RAIL_ASSERT_INVALID_XTAL_FREQUENCY](assertions#rail-assert-invalid-xtal-frequency) on the EFR32xG1x and EFR32xG2x chips, to fire when a radio config that is loaded is incompatible with a device due to the defined crystal frequency of the config not matching with the device's crystal frequency.
- **1131398:** Added the [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start) option to measure the delay between repeated transmits from the start of TX to start of TX instead of the default from end of TX to start of TX.
- **1153679:** Fixed an issue in [Coexistence Utility](rail-util-coex) on the EFR32xG24 where a GRANT signal pulse less than 100us might result in the radio not being properly placed in hold off after GRANT is deasserted.
- **1156980:** Fixed an issue with channel hopping on the EFR32xG22 and later where use of [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) can prevent the timed RX channel hopping modes including RX duty-cycling from timing out properly.
- **1157301:** Added support for GCC 12.2.1 and IAR 9.40.1 compilers.
- **1159773:** Added support for Fast Channel Switching PHYs on the EFR32xG24.
- **1161043:** Added support for [RAIL_IEEE802154_SUPPORTS_G_MODESWITCH](features#rail-ieee802154-supports-g-modeswitch) on the EFR32xG28.
- **1163285:** Added support for the IEE802154 2.4 GHz coherent PHYs via [RAIL_SUPPORTS_IEEE802154_BAND_2P4](features#rail-supports-ieee802154-band-2-p4) on the EFR32xG28.
- **1171683:** Added a new [RAIL_RxOptions_t](receive#rail-rx-options-t) option to enable collision detection on the EFR32xG25. Once enabled, when a collision with a strong enough packet is detected, the demod will stop the current packet decoding and try to detect the preamble of the incoming packet.
- **1174185:** Updated the documentation of [RAIL_RxChannelHoppingMode_t::RAIL_RX_CHANNEL_HOPPING_MODE_MANUAL](rx-channel-hopping#rail-rx-channel-hopping-mode-manual) and its current limitation of not issuing [RAIL_EVENT_RX_CHANNEL_HOPPING_COMPLETE](events#rail-event-rx-channel-hopping-complete).
- **1175032:** Updated the documentation mentioning that while configuring DPLL on all Series 2 chips, Phase Lock mode should typically be used instead of Frequency Lock mode.
- **1175684:** Fixed an issue with the [RAIL_IDLE](state-transitions#rail-idle) form of [RAIL_Idle()](state-transitions#rail-idle-1) and [RAIL_STOP_MODE_PENDING](transmit#rail-stop-mode-pending) form [RAIL_StopTx()](transmit#rail-stop-tx) during the LBT/CSMA phase of a transmit which could previously hang. Pending LBT/CSMA and scheduled transmits are now stopped or idled with [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) triggered, except for idle mode [RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](state-transitions#rail-idle-force-shutdown-clear-flags).
- **1183040:** Updated all PHYs built into RAIL on Series 2 platforms using the latest radio calculator to reduce observed high reference spurs.
- **1184982:** Fixed an issue with [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) that could cause execution to hang in interrupt context just before raising [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done). This was primarily an issue on the EFR32xG21 platform. Note that it is possible, though unlikely, that [RAIL_GetAverageRssi()](receive#rail-get-average-rssi) might still return [RAIL_RSSI_INVALID](receive#rail-rssi-invalid) after the average RSSI period has finished.
- **1184982:** Fixed an issue with [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) that caused it to mistakenly idle the radio in the newly-activated protocol if a dynamic protocol switch occurred during the averaging operation of the suspended protocol.
- **1187168:** Updated the default power curves for the 10dBm High Power PA on EFR32xG24.
- **1188083:** Fixed an issue where [RAIL_Idle()](state-transitions#rail-idle-1) could hang waiting for the radio to idle when using IEEE 802.15.4 fast RX channel switching.
- **1190187:** Fixed an issue where idling the radio before a Scheduled Receive window ends could cause a subsequent packet that should be silently filtered and rolled back to instead be received with [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error).
- **1196683:** Added support of 802.15.4 IMM-ACK with OFDM and OQPSK modulations (FCS 4 bytes only) on the EFR32xG25.
- **1201506:** Fixed an issue in multiprotocol applications where the wrong sync word would be used if two protocols used the same radio configuration and only one of those protocols set a custom sync word with [RAIL_ConfigSyncWords()](radio-configuration#rail-config-sync-words) API.
- **1211224:** Updated the RAIL Library component to include the [Built-in PHYs for alternate HFXO frequencies](rail-util-built-in-phys) component automatically to better support different HFXO frequencies on supported parts.

###### 2.15.2

- **634068:** Reduced the delay between TX completion and the start of PA ramp down on the EFR32xG24.
- **663884:** Added better information for [Front End Module (FEM) Utility](fem-util) component and its usage.
- **689770:** Added support for a new assert, which will be thrown if the loaded PHY is not supported by the software defined modem on EFR32xG25.
- **1131398:** Added the [RAIL_TX_REPEAT_OPTION_START_TO_START](transmit#rail-tx-repeat-option-start-to-start) option to measure the delay between repeated transmits from the start of TX to start of TX instead of the default from end of TX to start of TX.
- **1191666:** Fixed an issue where high reference spurs may appear during radio communication on EFR32xG22 and newer platforms.

###### 2.15.1

- **707731:** Fixed an issue when using [RAIL_BLE_SetNextTxRepeat()](bletx2-tx#rail-ble-set-next-tx-repeat) that would cause an incorrect Protocol Config ID to appear in the packet trace for repeated transmits.
- **748817:** Added new [RAIL_GetAutoAckFifo()](auto-ack#rail-get-auto-ack-fifo) API and allow NULL for [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo) or [RAIL_IEEE802154_WriteEnhAck()](ieee802-15-4#rail-ieee802154-write-enh-ack) ackData parameter, which gives applications direct access to the AutoAck FIFO to construct Ack packets in pieces.
- **1079816:** Fixed a race condition on EFR32xG22 and later during RX channel hopping or duty-cycling where frame detection occurring close to when a hop should happen could leave the radio stuck in reception but not receiving anything, with the only remedy being to idle the radio.
- **1088439:** Fixed an issue which would cause the incorrect antenna to be reported for a received packet on the EFR32xG25 when using OFDM and antenna diversity.
- **1097499:** Updated the [RAIL_PacketTimeStamp_t::packetDurationUs](rail-packet-time-stamp-t#packet-duration-us) field on the EFR32xG25 to be populated for non-OFDM packets.
- **1104367:** Added support for antenna selection through the applicable [RAIL_RxOptions_t](receive#rail-rx-options-t) and [RAIL_TxOptions_t](transmit#rail-tx-options-t) values when using OFDM on the EFR32xG25.
- **1112324:** Added a new [Software Modem (SFM) sequencer image selection Utility](rail-util-sfm-sequencer) component to allow selection of modulations supported by EFR32XG25 software modem (SFM). These changes can save considerable flash space by reducing the set of modulations to just those that are needed.
- **1129262:** Added support for Sidewalk PHYs for EFR32xG23 and EFR32xG28 chips.
- **1141539:** Fixed an issue to improve CCA behavior for regional certification test suites for EFR32xG25 chips.
- **1153679:** Fixed an issue in [Coexistence Utility](rail-util-coex) where a GRANT signal pulse less than 100us might result in the radio not being properly placed in hold off after GRANT is deasserted.
- **1153921:** Added a new component to switch between Coexistence, Antenna Diversity and FEM Utilities for EFR32xG21 and EFR32xG24 chips supporting 15.4 Fast Channel Switching feature.
- **1156980:** Fixed an issue with channel hopping on EFR32xG22 and later where use of [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) can prevent the timed RX channel hopping modes including RX duty-cycling from timing out properly.
- **1167235:** Fixed an issue with [RAIL_SupportsFastRx2Rx()](features#rail-supports-fast-rx2-rx) where it used to return an incorrect value on supported platforms.

###### 2.15.0

- **757123:** Added support for PHY-specific RSSI offsets on the EFR32xG27 and EFR32xG28 platforms.
- **774988:** Added support for a new [RX_DIRECT_SYNCHRONOUS_MODE_DATA](data-management#rx-direct-synchronous-mode-data) RAIL RX data source to capture direct mode data in sync with the configured bit rate for the PHY. This requires a PHY that supports this mode of capture from the Radio Calculator and is only currently supported on the EFR32xG23.
- **824355:** Fixed an issue in IEEE802.15.4 MAC address filtering when receiving small OFDM packets.
- **832743:** Clarified use of [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) must be prior to initiating a transmit operation via API call and fixed an issue where it did not properly return an error when called while a transmit operation was in progress.
- **1032820:** Updated Packet Trace on the EFR32xG25 and EFR32xG28 when using the WiSUN protocol to have a more informative PHY identifier and to support the whole channel number range.
- **1055824:** Fixed an issue with low-side synth injection (negative IF) on proprietary 2.4GHz PHYs when using EFR32xG22 and newer chips. This fix requires regenerating the PHY with the latest version of the Radio Configurator to work.
- **1058480:** Fixed an RX FIFO corruption on EFR32xG25 that occurred when receiving/sending certain OFDM packets using FIFO mode.
- **1060146:** Fixed the RAIL_PA_CURVES_2P4_LP power curves on the EFR32xG24 to better match characterization data.
- **1061665:** Added new [RAIL_EnableCacheSynthCal](state-transitions#rail-enable-cache-synth-cal) function to enable the radio sequencer to cache calibration values instead of recalculating them on every RX and TX event. This allows you to lower the minimum transition time for most [RAIL_StateTiming_t](rail-state-timing-t) transitions in typical cases.
- **1068856:** Corrected the sign of the frequency error reported by [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset) when using OFDM on the EFR32xG25 to match how this was handled for other modulations (e.g., Freq_error=current_freq- expected_freq).
- **1077623:** Added new [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode) to trigger [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) on all beam frames.
- **1077623:** Added [RAIL_ZWAVE_GetBeamHomeIdHash()](z-wave#rail-zwave-get-beam-home-id-hash) to retrieve the beam frame's HomeIdHash when handling that event and made sure that the HomeIdHash byte is now present on PTI for Z-Wave beam frames even when NodeId does not match.
- **1077623:** Fixed an issue on EFR32ZG23 where multiple beam frames were lumped together on PTI as one large beam chain.
- **1081396:** Adjusted channel power restrictions for the 802.15.4 PHYs on new xGM210 modules.
- **1082274:** Fixed an issue on the EFR32xG22, EFR32xG23, EFR32xG24, and EFR32xG25 chips that could cause the chip to lock up if the application attempts to re-enter EM2 within ~10 us after wake-up and hits a <0.5 us timing window. If hit, this lockup requires a power-on reset to restore normal operation to the chip.
- **1083615:** Fixed an issue for certain ramp time and power level combinations on the EFR32xG21 where the PA ramp would stop one power level short of the desired output level.
- **1086162:** Added a new [RAIL_RX_OPTION_FAST_RX2RX](receive#rail-rx-option-fast-rx2-rx) which will force the radio sequencer to immediately transition to RXSEARCH to get ready to receive the next packet while still processing the previous one. This will minimize the RX to RX state transition time. This is only supported on chips that have [RAIL_SUPPORTS_FAST_RX2RX](features#rail-supports-fast-rx2-rx-1) set to true.
- **1090336:** Fixed an issue in the [Protocol Utility](rail-util-protocol) component where BLE would be required to select a Zigbee PHY.
- **1090512:** Fixed an issue in the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component where certain functions would attempt to use the RAIL_TX_POWER_MODE_2P4GIG_HIGHEST macro even though they didn't support it. This would result in undefined behavior previously, but will now correctly error.
- **1090728:** Fixed a possible RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO issue on EFR32xG12 with [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868) enabled for a FEC-capable PHY which can happen when aborting a packet at frame detection, for instance by idling the radio.
- **1092769:** Fixed an issue when using Dynamic Multiprotocol and BLE Coded PHYs where a transmit could underflow depending on what protocol was active when the PHY and syncword were loaded.
- **1096663:** Fixed a compilation error in [Coexistence Utility](rail-util-coex) when the Coexistence WiFi TX GPIO is enabled.
- **1096665:** Fixed a compilation issue in [Coexistence Utility](rail-util-coex) when the SL_RAIL_UTIL_COEX_WIFI_TX_PORT is defined.
- **1097152:** Added [RAIL_PacketTimeStamp_t::packetDurationUs](rail-packet-time-stamp-t#packet-duration-us) field which is currently set only on EFR32xG25 for received OFDM packets.
- **1097696:** Added RAIL support for the MGM240L lighting modules.
- **1099794:** Added separate curves when the 20 dBm PA is used at 3.3V and 1.8V for EFR32xG24.
- **1099829:** Added the new [RAIL_WMBUS_Config](wmbus#rail-wmbus-config) API to allow configuring WMBUS and simultaneous M2O RX of T and C mode packets.
- **1103587:** Added a new API [RAIL_SetTxFifoAlt()](data-management#rail-set-tx-fifo-alt) which provides a new start offset parameter to specify where the data begins in the TX FIFO.
- **1103966:** Fixed an unexpected Rx packet abort on the EFR32xG25 when using the Wi-SUN OFDM option4 MCS0 PHY.
- **1104033:** Fixed an issue in the [RAIL_ZWAVE_ReceiveBeam](z-wave#rail-zwave-receive-beam) function so that it idles the radio regardless of whether a beam is detected on the EFR32ZG23.
- **1104441:** Fixed an issue with the [Coexistence Utility](rail-util-coex) counters for Zigbee that could prevent them from ticking as expected depending on how things are linked.
- **1105134:** Fixed an issue when switching between certain PHYs that could cause the first received packet to be reported as [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error) instead of [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success). This issue could potentially impact EFR32xG22 and newer chips.
- **1105529:** Fixed an issue on EFR32xG22 and later platforms when using a FrameType decoding PHY where a bad frame type packet was mis-reported as [RAIL_RX_PACKET_ABORT_ABORTED](receive#rail-rx-packet-abort-aborted) instead of the proper [RAIL_RX_PACKET_ABORT_FORMAT](receive#rail-rx-packet-abort-format).
- **1107288:** Added support for [RAIL_IEEE802154_SupportsRxChannelSwitching](features#rail-ieee802154-supports-rx-channel-switching) on the EFR32xG21. This is also still supported at an alpha quality level on the EFR32xG24.
- **1109574:** Fixed an issue on EFR32xG22 and newer chips where a radio sequencer assert could cause the application to hang in an ISR rather than report the assert via [RAILCb_AssertFailed()](assertions#rail-cb-assert-failed).
- **1117127:** Added [RAIL_IEEE802154_SetRxToEnhAckTx()](ieee802-15-4#rail-ieee802154-set-rx-to-enh-ack-tx) to allow IEEE 802.15.4 stacks to specify a different rxToTx state transition turnaround time for Enhanced ACKs, which generally need more time to construct and secure. Immediate ACKs will continue to use the rxToTx time specified in [RAIL_IEEE802154_Config_t::timings](rail-ieee802154-config-t#timings).
- **1117595:** Added Tx packet duration information for EFR32xG22 and newer chips.
- **1118063:** Fixed issue with recent [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode) on EFR32xG13 and EFR32xG14 where the NodeId of the promiscuous beam was not properly recorded for [RAIL_ZWAVE_GetBeamNodeId()](z-wave#rail-zwave-get-beam-node-id), causing it to report 0xFF.
- **1121630:** Increased EFR32ZG13 and EFR32ZG14 Z-Wave long-range beam detect time to improve FLiRS performance.
- **1126343:** Fixed an issue on EFR32xG24 when using the IEEE 802.15.4 PHY where the radio could become stuck when doing an LBT transmit if a frame is received during the CCA check window.
- **1134223:** Fixed an issue when using [Coexistence Utility](rail-util-coex) where the request line is left asserted after TX is aborted following a sync detect.
- **1135418:** Fixed incorrect [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) on received 802.15.4 Beacon frames, which now reflects which PanId and address the Beacon's Source PanId and Source Address match, if any. Note that RAIL generally accepts all Beacons so the filterMask can be 0x00.
- **1138522:** Fixed an issue on the EFR32xG25 for SUN FSK PHYs where receiving a packet after calling [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init) but before configuring [RAIL_IEEE802154_ConfigGOptions](ieee802-15-4#rail-ieee802154-config-g-options) could break reception.
- **1140569:** Fixed a rare timing issue on EFR32xG24 where an ACK timeout might cause the next packet to be received as [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error) instead of [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success).
- **1150779:** Fixed the 15.4 channel configurations on the MGM240PA32 and MGM240PB32 modules to use the correct frequency for channel 26.

###### 2.14.3

- **1058480:** Fixed an RX FIFO corruption on EFR32xG25 that occurred when receiving/sending certain OFDM packets using FIFO mode.
- **1109993:** Fix an issue in the [Coexistence Utility](rail-util-coex) component so that it simultaneously asserts request and priority if request and priority share the same GPIO port and polarity.
- **1118063:** Fixed issue with recent [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode) on EFR32xG13 and xG14 where the NodeId of the promiscous beam was not properly recorded for [RAIL_ZWAVE_GetBeamNodeId()](z-wave#rail-zwave-get-beam-node-id), causing it to report 0xFF.
- **1126343:** Fixed an issue on EFR32xG24 when using the IEEE 802.15.4 PHY where the radio could become stuck when doing an LBT transmit if a frame is received during the CCA check window.

###### 2.14.2

- **747041:** Fixed an issue on the EFR32xG23 and EFR32xG25 that could cause certain radio actions to delay for extended periods of time when the main core enters EM2 while the radio is still running.
- **1077623:** Added new [RAIL_ZWAVE_OPTION_PROMISCUOUS_BEAM_MODE](z-wave#rail-zwave-option-promiscuous-beam-mode) to trigger [RAIL_EVENT_ZWAVE_BEAM](events#rail-event-zwave-beam) on all beam frames.
- **1077623:** Added [RAIL_ZWAVE_GetBeamHomeIdHash()](z-wave#rail-zwave-get-beam-home-id-hash) to retrieve the beam frame's HomeIdHash when handling that event and made sure that the HomeIdHash byte is now present on PTI for Z-Wave beam frames even when NodeId does not match.
- **1077623:** Fixed an issue on EFR32ZG23 where multiple beam frames were lumped together on PTI as one large beam chain.
- **1090512:** Fixed an issue in the [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component where certain functions would attempt to use the RAIL_TX_POWER_MODE_2P4GIG_HIGHEST macro even though they didn't support it. This would result in undefined behavior previously, but will now correctly error.
- **1090728:** Fixed a possible RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO issue on EFR32xG12 with RAIL_IEEE802154_G_OPTION_GB868 enabled for a FEC- capable PHY which can happen when aborting a packet at frame detection, for instance by idling the radio.
- **1092769:** Fixed an issue when using Dynamic Multiprotocol and BLE Coded PHYs where a transmit could underflow depending on what protocol was active when the PHY and syncword were loaded.
- **1097152:** Added [RAIL_PacketTimeStamp_t::packetDurationUs](rail-packet-time-stamp-t#packet-duration-us) field which is currently set only on EFR32xG25 for received OFDM packets.
- **1103966:** Fixed an unexpected Rx packet abort on the EFR32xG25 when using the Wi-SUN OFDM option4 MCS0 PHY.
- **1105134:** Fixed an issue when switching certain PHYs that could cause the first received packet to be reported as [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error) instead of [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success). This issue could potentially impact EFR32xG22 and newer chips.
- **1109574:** Fixed an issue on EFR32xG22 and newer chips where a radio sequencer assert could cause the application to hang in an ISR rather than report the assert via [RAILCb_AssertFailed()](assertions#rail-cb-assert-failed).

###### 2.14.1

- **1068856:** Corrected the sign of the frequency error reported by [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset) when using OFDM on the EFR32xG25 to match how this was handled for other modulations (e.g. Freq_error=current_freq- expected_freq).
- **1074384:** The [RAIL_SetTune()](diagnostic#rail-set-tune) and [RAIL_GetTune()](diagnostic#rail-get-tune) functions now use the CMU_HFXOCTuneSet() and CMU_HFXOCTuneGet() functions respectively on EFR32xG2x and newer devices.
- **1077611:** Fixed an issue on the EFR32xG25 that would cause a 40us porch before an OFDM TX.
- **1082274:** Fixed an issue on the EFR32xG22, EFR32xG23, EFR32xG24, and EFR32xG25 chips that could cause the chip to lock up if the application attempts to re-enter EM2 within ~10 us after wake-up and hits a <0.5 us timing window. If hit, this lockup requires a power on reset to restore normal operation to the chip.

###### 2.14.0

- **670716:** The [RAIL_ConfigRfSenseSelectiveOokWakeupPhy()](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy) will now return an error when run on the EFR32xG21 platform because this device cannot support the wakeup PHY.
- **751910:** Added HFXO temperature compensation in RAIL on platforms that support [RAIL_SUPPORTS_HFXO_COMPENSATION](features#rail-supports-hfxo-compensation-1). This feature can be configured with the new [RAIL_ConfigHFXOCompensation()](external-thermistor#rail-config-hfxo-compensation) API. The user will also need to be sure to handle the new [RAIL_EVENT_THERMISTOR_DONE](events#rail-event-thermistor-done) event to trigger a call to [RAIL_CalibrateHFXO](calibration#rail-calibrate-hfxo) to perform the compensation.
- **765112:** Added options in [Protocol Utility](rail-util-protocol) to control whether Z-Wave, 802.15.4 2.4 GHz and Sub-GHz, and BLE are enabled so that the user can save space in their application by disabling unused protocols.
- **843708:** Moved function declarations from [rail_features.h](rail-features-h) to [rail.h](rail-h) to avoid a convoluted include dependency order.
- **844325:** Fixed [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) to properly return 0 (error) rather than 4096 for an undersized FIFO.
- **845608:** Fixed an issue with the [RAIL_ConfigSyncWords](radio-configuration#rail-config-sync-words) API when using certain underlying demodulator hardware on EFR32xG2x parts.
- **846240:** Added a new API [RAIL_ZWAVE_PerformIrcal](z-wave#rail-zwave-perform-ircal) to help perform an IR calibration across all the different PHYs used by a Z-Wave device.
- **851150:** Fixed an issue on EFR32xG2 series devices where the radio would trigger [RAIL_ASSERT_SEQUENCER_FAULT](assertions#rail-assert-sequencer-fault) when PTI is used and GPIO configuration is locked. GPIO configuration can only be locked when PTI is disabled. See [RAIL_EnablePti()](pti#rail-enable-pti) for further information.
- **853682:** Added 40MHz crystal support on EFR32xG24 devices to the [Built-in PHYs for alternate HFXO frequencies](rail-util-built-in-phys) component.
- **855048:** Updated the pa_customer_curve_fits.py helper script to accept floating point value for the maximum power argument, similar to the increment argument.
- **857210:** Added support in [Coexistence Utility](rail-util-coex) for configuring priority options when directional priority is enabled but no static priority GPIO is defined.
- **857267:** Fixed an issue when using the [Coexistence Utility](rail-util-coex) component with TX abort, the signal identifier feature and DMP.
- **858567:** Added support for IEEE 802.15.4 fast RX channel switching with the new [RAIL_IEEE802154_ConfigRxChannelSwitching](ieee802-15-4#rail-ieee802154-config-rx-channel-switching) API on supported platforms ([RAIL_IEEE802154_SupportsRxChannelSwitching](features#rail-ieee802154-supports-rx-channel-switching)). This feature allows us to simultaneously detect packets on any two 2.4GHz 802.15.4 channels with a slight reduction in overall sensitivity of the PHY.
- **988492:** Added support for the BGM220SC23HNA2 module.
- **1015152:** Fixed an issue on EFR32xG2x devices where [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) or [RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](events#rail-event-tx-fifo-almost-empty) could trigger improperly when the event is enabled or the FIFO is reset.
- **1017609:** Fixed an issue where PTI appended information could be corrupted when [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#rail-rx-option-track-aborted-frames) is in effect when [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown) or [RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](state-transitions#rail-idle-force-shutdown-clear-flags) is used. Also clarified that [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#rail-rx-option-track-aborted-frames) is not useful with coded PHYs.
- **1019590:** Fixed an issue when using the [Coexistence Utility](rail-util-coex) component with BLE where the sl_bt_system_get_counters() function would always return 0 for GRANT denied counts.
- **1019794:** Eliminated compiler warning in [Initialization Utility](rail-util-init) component when few of its features are enabled.
- **1022182:** Added a new [Thermal Protection](thermal-protection) feature, on platforms that support [RAIL_SUPPORTS_THERMAL_PROTECTION](features#rail-supports-thermal-protection-1), to track temperature and prevent transmits when the chip is too hot.
- **1022692:** Added new table based OFDM and FSK PAs for EFR32xG25 based devices. The output power of these can be modified through a new customer provided look-up table. Ask support or look for an updated app note on how to configure the values in this table for your board.
- **1023016:** Fixed an issue on EFR32xG22 and newer chips where waits in between radio activity would consume slightly more power than necessary after the first 13ms. This was especially noticeable when using [RAIL_ConfigRxDutyCycle](rx-channel-hopping#rail-config-rx-duty-cycle) with large off time values.
- **1024294:** Removed support for the deprecated BGX220P22HNA and BGX220S22HNA modules.
- **1024457:** Added support for the MGM240SA22VNA, BGM240SA22VNA, and BGM241SD22VNA modules and updated the configurations for the BGM240SB22VNA, MGM240SB22VNA, and the MGM240SD22VNA.
- **1029740:** Fixed issue where [RAIL_GetRssi()](receive#rail-get-rssi)/RAIL_GetRssiAlt() could return a "stale" RSSI value (the value was from previous RX state instead of the current one) if called quickly upon entering receive.
- **1040814:** Added support to the [Coexistence Utility](rail-util-coex) component for configuring the coexistence request priority on sync detect when using BLE.
- **1041734:** Broke up some EFR32xG12 802.15.4 dynamic FEC code to save code size for Zigbee and BLE which never need this functionality.
- **1056207:** Fixed an issue with IQ sampling when using the [Angle of Arrival/Departure (AoX) Utility](rail-util-aox) component with only 0 or 1 antennas selected.
- **1057830:** Remove [Coexistence Utility](rail-util-coex) dependency from the RAIL Utility, Coulomb Counter component.
- **1062712:** Fixed an issue where the [Coexistence Utility](rail-util-coex) component wouldn't always update request states correctly which could lead to missed events triggered by new requests.
- **1062940:** Prevent the [Coexistence Utility](rail-util-coex) component from aborting BLE transmits when SL_RAIL_UTIL_COEX_BLE_TX_ABORT is disabled.
- **1063152:** Fixed an issue where radio reception would not be fully cleaned up when a receive error occurs with receive state transitions set to idle on error but transmit on success, a configuration mostly associated with BLE. On the EFR32xG24 this could cause a SYNTH calibration to not be properly restored and eventually cause the radio to stop working.
- **1063502:** The [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel) function has been made dynamic multi-protocol safe and will no longer return an error if called when your protocol is inactive.

###### 2.13.3

- **1041997:** Fixed the librail_config libraries for the following xGM240 modules: BGM240PA22VNA, BGM240PA32VNA, BGM240PA32VNN, BGM240PB22VNA, BGM240PB32VNA, BGM240PB32VNN, MGM240PA22VNA, MGM240PA32VNA, MGM240PA32VNN. Without this update these modules will assert when trying to load the supported BLE and IEEE 802.15.4 PHYs.

###### 2.13.2

- **813171:** Added early support for IEEE802.15.4G dynamic forward error correction PHYs on the EFR32xG12 platform. Using this at this time will require help from support.
- **844377:** Fixed a BLE 2Mbps AoX issue on EFR32xG24 when using a 38.4MHz crystal.
- **1026914:** Improved PA configurations for the xGM240 modules based on additional test data.
- **1029710:** Fixed an issue with RAIL's PA auto mode that would cause us to select an unsupported [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) on chip OPNs that are missing the higher power PAs.

###### 2.13.1

- **819544:** Improved reception on EFR32xG23 and EFR32xG24 when using a PHY with fast detect enable (preamble sense mode).
- **843708:** Moved function declarations from [rail_features.h](rail-features-h) to [rail.h](rail-h) to avoid a convoluted include dependency order.
- **844325:** Fixed [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) to properly return 0 (error) rather than 4096 for an undersized FIFO.
- **844936:** Fixed an issue where using [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) could cause a brownout reset on EFR32xG23.
- **853714:** Fixed an issue with xGM240 modules causing them to assert during initialization.
- **857210:** Added support in [Coexistence Utility](rail-util-coex) for configuring priority options when directional priority is enabled but no static priority GPIO is defined.
- **988518:** Fixed an issue where the radio sequencer would leave portions of the chip enabled after AoX CTE packet reception, preventing the device from going into EM2 sleep and potentially causing missed packet receive events.

###### 2.13.0

- **376658:** Fixed an issue with the BLE coded PHY on EFR32xG21 where a packet received with a corrupt coding indicator would result in an invalid start of packet timestamp.
- **645362:** The [Packet Trace Interface (PTI) Utility](rail-util-pti) component will now validate that the correct set of pins are in use for the desired PTI mode.
- **653200:** RAIL will now error if attempting to start a CSMA or LBT transmit while a scheduled RX is still in progress or vice versa.
- **714958:** The RAIL channel of a received packet is now available in the packet's [RAIL_RxPacketDetails_t::channel](rail-rx-packet-details-t#channel) field. This can be of value when scanning or hopping across multiple channels while letting packets accumulate in the receive FIFO for later processing.
- **739371:** Added the [RAIL_ConfigPaAutoEntry](pa#rail-config-pa-auto-entry) API to allow for easier configuration of PA auto mode operation in RAIL.
- **746775:** Added PA curves for BGM240P and MGM240P modules.
- **748680:** Added the [RAIL_SetRssiDetectThreshold](receive#rail-set-rssi-detect-threshold) API to allow the user to detect when the RSSI is at or above a configurable threshold. Once configured the [RAIL_EVENT_DETECT_RSSI_THRESHOLD](events#rail-event-detect-rssi-threshold) event can be used to detect when this happens.
- **758341:** Restricted the SL_RAIL_UTIL_PA_RAMP_TIME_US to 10us on some EFR32 modules to match the certification conditions.
- **772769:** Fixed an issue when running IR Calibration on the EFR32xG23 using [RAIL_CalibrateIrAlt](calibration#rail-calibrate-ir-alt) where we could compute an invalid IRCAL value for certain PHYs and chips.
- **777427:** Fixed support for using the signal identifier CCA modes simultaneously with a user-enabled signal identifier trigger event.
- **812815:** Added support for the MGM240L022RNF module.
- **813381:** Added support for the FGM230SA27HGN and FGM230SBHGN modules.
- **819644:** Fixed an issue with frame-type decoding PHYs running at more than 500kbps on EFR32xG22 and later.
- **825083:** Fixed an issue on EFR32xG23 and EFR32xG24 where PTI could merge multiple receive packets into the same transaction when interrupt latency is significant.
- **828716:** Added the [RAIL_GetChannelAlt](radio-configuration#rail-get-channel-alt) API. This function returns the channel the radio is currently using. If using DMP and run on the inactive protocol it returns the channel that will be used when next switching to that protocol. When using channel hopping, mode switch, and other features that change channels dynamically this may be different from what is returned by [RAIL_GetChannel](radio-configuration#rail-get-channel) as this function will track what channel the radio is actually on at that moment and not what it started on.
- **829499:** Fixed an issue where [RAIL_GetRadioStateDetail](state-transitions#rail-get-radio-state-detail) would not report the correct state information when frame detection was disabled or during an LBT operation.
- **830214:** Ensure that the [RAIL_RadioConfigChangedCallback_t](radio-configuration#rail-radio-config-changed-callback-t) is called for all RAIL handles in a dynamic multi-protocol application where multiple handles use the same underlying PHY configuration.
- **835299:** Fixed an issue with dynamic handling of whitening and FCS in FSK when only [RAIL_IEEE802154_E_OPTION_GB868](ieee802-15-4#rail-ieee802154-e-option-gb868) was enabled.
- **844600:** Fixed issue of not being able to receive packets during a [RAIL_ScheduleRx](receive#rail-schedule-rx) configured with a zero relative start time when Power Manager sleep is enabled and configured with an EM2 or lower energy requirement.

###### 2.12.2

- **759793:** Fixed an issue with BLE long-range reception on EFR32xG21 that corrupted packet data and tripped [RAIL_ASSERT_FAILED_UNEXPECTED_STATE_RX_FIFO](assertions#rail-assert-failed-unexpected-state-rx-fifo).
- **764346:** BLE and 802.15.4 built-in PHYs are now exposed as public symbols in header files. Do not modify these without explicit instructions by Silicon Labs.
- **764347:** Added a new [Built-in PHYs for alternate HFXO frequencies](rail-util-built-in-phys) component to enable the built-in phys to operate with either 38.4 MHz or 39 MHz crystals on EFR32xG24 devices.
- **774883:** Updated power curves for ZGM230SA27HGN, ZGM230SA27HNN, ZGM230SB27HGN modules to provide more accurate output powers at the lower and higher end of the dBm range.
- **777290:** The PA auto mode configuration is fixed to use both HP and LP PA modes on the 10dBm EFR32xG24 chips.
- **777427:** Fixed support for using the signal identifier CCA modes simultaneously with a user enabled signal identifier trigger event.
- **812938:** Fixed the [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense) mode on EFR32xG22 and EFR32xG23 to properly stay active after detecting Timing and Preamble when using the standard demodulator.
- **813182:** Previously selecting an invalid CCA mode using RAIL_IEEE802154_ConfigCcaMode would fail silently and continue to use the RSSI based CCA mode. Now RAIL_IEEE802154_ConfigCcaMode will return an error if an invalid CCA mode is selected.

###### 2.12.1

- **758341:** Restricted the SL_RAIL_UTIL_PA_RAMP_TIME_US to 10us on some EFR32 modules to match the certification conditions.
- **764234:** Changed Quuppa channel 2 frequency from 2480 MHz to 2403 MHz.
- **765843:** Updated the Z-Wave PHYs for the EFR32xG23 to prevent a sensitivity degradation on the R2 (9.6 kbps) PHY.
- **773178:** Fixed compiler warning in [Callbacks Utility](rail-util-callbacks) component when app_assert component ignores asserts.

###### 2.12.0

- **646980:** An attempt to use an unsupported built-in radio channel configuration, e.g. on a module that does not support that protocol or configuration, will now trip [RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG](assertions#rail-assert-failed-invalid-channel-config) rather than returning success and ignoring the configuration.
- **671651:** Fixed timing problems with certain [State Transitions](state-transitions) or [RX Channel Hopping](rx-channel-hopping) delay values on the EFR32xG22 and newer parts.
- **682739:** Fixed an issue with the BLE coded PHY's modulation index on the EFR32xG21 parts that could cause deviation measurements to fail.
- **688211:** Added IEEE802.15.4 Coexistence and FEM PHYs to EFR32xG12 and EFR32xG13 based modules.
- **688211:** Updated IEEE802.15.4 FEM PHYs on EFR32xG12 and EFR32xG13 based modules for improved performance.
- **697705:** Added support for the ZGM230SA27HGN, ZGM230SA27HNN, and ZGM230SB27HGN modules.
- **708206:** Added [RAIL_GetTxPacketsRemaining()](state-transitions#rail-get-tx-packets-remaining) API for use when handling one of the [RAIL_EVENTS_TX_COMPLETION](events#rail-events-tx-completion) to get a sense of how many transmits remain in a [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) sequence.
- **712012:** Updated all header files to have extern "C" when being built with C++ for compatibility.
- **714271:** Fixed an issue where RAIL_IEEE802154_Config2p4GHzRadio*() and RAIL_IEEE802154_ConfigGB*Radio() functions were improperly clearing or setting certain [RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t). Also documented that these functions still implicitly clear or set certain [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t) suitable for that configuration.
- **714709:** Made the [RAIL_EnableRxDutyCycle()](rx-channel-hopping#rail-enable-rx-duty-cycle) API safe to call in a multiprotocol application.
- **715123:** Added PA curves for HP, MP, LP and LLP modes on all EFR32xG23 radio boards.
- **716369:** Fixed an issue where incorrect radio transition times were being applied at higher temperatures when using the high power PA on EFR32xG22 parts.
- **718290:** Changed the LQI measurement to use chip errors on IEEE802.15.4 PHYs for EFR32xG24 parts.
- **719194:** Added [RAIL_PA_BAND_COUNT](pa#rail-pa-band-count) to count [RAIL_PaBand_t](pa#rail-pa-band-t).
- **720948:** Added a new [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) to capture direct mode data on supported devices.
- **721163:** To save both flash and RAM, moved information formerly contained in [RAIL_Config_t::protocol](rail-config-t#protocol), [RAIL_Config_t::scheduler](rail-config-t#scheduler), and [RAIL_Config_t::buffer](rail-config-t#buffer) internal to RAIL and sized appropriately for single vs. multiprotocol. RAIL multiprotocol now provides two internal state buffers for two protocols by default. An application that needs more must now call [RAIL_AddStateBuffer3()](general#rail-add-state-buffer3) or [RAIL_AddStateBuffer4()](general#rail-add-state-buffer4) to add a 3rd and 4th buffer, respectively. Otherwise [RAIL_Init()](general#rail-init) will fail when trying to initialize a 3rd or 4th protocol.
- **723098:** Fixed [RAIL_SetFixedLength](radio-configuration#rail-set-fixed-length)(handle, [RAIL_SETFIXEDLENGTH_INVALID](radio-configuration#rail-setfixedlength-invalid)) to restore dynamic frame length operation if the current PHY was originally configured for that.
- **723558:** Added support for BGM240PA22VNA, BGM240PA32VNA, BGM240PA32VNN, BGM240PB22VNA, BGM240PB32VNA, BGM240PB32VNN, MGM240PA22VNA, MGM240PA32VNA, MGM240PA32VNN, MGM240PB22VNA, MGM240PB32VNA and MGM240PB32VNN modules.
- **723605:**[Coexistence Utility](rail-util-coex) GPIO interrupt numbers are now chosen at runtime to avoid conflicts.
- **726491:** A new RAIL API [RAIL_GetSchedulerStatusAlt](multiprotocol#rail-get-scheduler-status-alt) will now return more descriptive radio scheduler events as well as the [RAIL_Status_t](general#rail-status-t) of the RAIL API invoked by the radio scheduler. As a part of the new API, new [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) events have been added while retaining the previous ones for backwards compatibility. Note that the underlying values of the existing [RAIL_SchedulerStatus_t](multiprotocol#rail-scheduler-status-t) events may have changed.
- **727721:** Updated the RAIL_IEEE802154_Config2p4GHzRadio*Fem PHYs on the EFR32xG12 and EFR32xG13 devices to improve performance.
- **727728:** Added a new [RAIL_IEEE802154_Config2p4GHzRadioCustom1](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-custom1) API to configure an alternate IEEE 802.15.4 PHY with slightly different performance characteristics for the EFR32xG12 and EFR32xG13 parts. Use this API if instructed by Silicon Labs for your use case.
- **738931:** Fixed an issue with the BLE Coded PHYs on the EFR32xG22 device that could cause some packets to be improperly sent and not trigger a [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) event.
- **739594:** Fixed an issue with the [RX_IQDATA_FILTLSB](data-management#rx-iqdata-filtlsb)[RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) on EFR32xG23 parts where the data did not properly saturate and was instead just the lower 16 bits of IQ sample data.
- **744323:** Fixed an issue when using BLE AoX where non-AoX packets were transmitted on an undefined antenna. They will now always use the first antenna in the configured [RAIL_BLE_AoxConfig_t::antArrayAddr](rail-ble-aox-config-t#ant-array-addr) pattern.
- **745528:** Fixed some incorrect [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) values for 802.15.4 ACKs when promiscuous, or when the PanId coordinator received a packet with only source PanId and no destination address.
- **753655:** The example CSV files referred to in AN1127: Power Amplifier Power Conversion Functions in RAIL 2.x are updated with realistic values.
- **753860:** Fixed an issue when running IR Calibration on the EFR32xG23 ([RAIL_CalibrateIrAlt](calibration#rail-calibrate-ir-alt)) where we could compute a completely invalid IRCAL value for certain PHYs and chips.
- **754219:** Increased maximum BLE Coexistence request window setting, SL_RAIL_UTIL_COEX_REQ_WINDOW, in [Coexistence Utility](rail-util-coex) from 255 to 5000.

###### 2.11.3

- **737292:** Fixed an issue on the EFR32xG21 that was causing some BLE coded PHY packets to be sent with a corrupted sync word and payload breaking the connection.
- **738158:** Fixed the [RX_DIRECT_MODE_DATA](data-management#rx-direct-mode-data)[RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) data source on the EFR32xG23.
- **741120:** Fixed an issue where the IQ data captured during BLE's CTE could be all zeros on the 2Mbps PHY.
- **743258:** Fixed an issue that could cause the antenna switching pattern in BLE AoX applications to sometimes repeat a previous sequence instead of following the expected antenna sequence.

###### 2.11.2

- **274536:** Added a new [RAIL_ConfigDirectMode()](diagnostic#rail-config-direct-mode) API for configuring direct mode settings on all chips. This can set whether the data stream is synchronous or asynchronous and which GPIOs are used for the feature.
- **671651:** Fixed timing problems with certain [State Transitions](state-transitions) or [RX Channel Hopping](rx-channel-hopping) delay values on the EFR32xG22 and newer parts.
- **714271:** Fixed an issue where RAIL_IEEE802154_Config2p4GHzRadio*() and RAIL_IEEE802154_ConfigGB*Radio() functions were improperly clearing or setting certain [RAIL_IEEE802154_EOptions_t](ieee802-15-4#rail-ieee802154-e-options-t). Also documented that these functions still implicitly clear or set certain [RAIL_IEEE802154_GOptions_t](ieee802-15-4#rail-ieee802154-g-options-t) suitable for that configuration.
- **715123:** Added PA curves for EFR32XG23 for HP, MP, LP and LLP modes for both 14dBm and 20dBm variants.
- **716369:** Fixed an issue where incorrect radio transition times were being applied at higher temperatures when using the high power PA on EFR32xG22 parts.
- **720948:** Added a new [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) to capture direct mode data on supported devices.
- **735862:** Now when using a [RAIL_RxDataSource_t](data-management#rail-rx-data-source-t) other than [RX_PACKET_DATA](data-management#rx-packet-data) the receiver will be disabled any time a [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) occurs and need to be manually restarted. If the [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) event is not enabled then the receiver will continue to run and lose some amount of data until the buffer is processed which matches the old behavior.

###### 2.11.1

- **646980:** An attempt to use an unsupported built-in radio channel configuration, e.g. on a module that does not support that protocol or configuration, will now trip [RAIL_ASSERT_FAILED_INVALID_CHANNEL_CONFIG](assertions#rail-assert-failed-invalid-channel-config) rather than returning success and ignoring the configuration.
- **675252:** Fixed an antenna diversity regression where a transmitted auto- ACK would incorrectly go out the currently configured TX antenna rather than the antenna used to receive the packet being acknowledged.
- **676896:** Fixed an issue in OOK PHYs where dynamic adjustments made to receive a packet with a high RSSI could persist after the packet and decrease the ability to receive packets with a lower RSSI.
- **696198:** Fixed an issue on PHYs that do not support dual sync words. If [RAIL_RX_OPTION_ENABLE_DUALSYNC](receive#rail-rx-option-enable-dualsync) is called when one of these PHYs is loaded the [RAIL_ConfigRxOptions](receive#rail-config-rx-options) function will now return [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).
- **697097:** Fixed a rare situation where a premature [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) event might occur when auto-ACK is enabled and a scheduled transmit using [RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](transmit#rail-scheduled-tx-during-rx-abort-tx) is pending when an erroneous packet is received.
- **700439:** Fixed an issue where configuring a Selective RF Sense Wakeup packet by calling [RAIL_ConfigRfSenseSelectiveOokWakeupPhy](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy) followed by [RAIL_SetRfSenseSelectiveOokWakeupPayload](rf-sense#rail-set-rf-sense-selective-ook-wakeup-payload) would put RAIL in fixed length mode and leave it there even after a new PHY was loaded. We will now revert the fixed length settings to their default when loading a new PHY after the Selective RF Sense Wakeup PHY was loaded so that the incoming PHY's settings are used.
- **710273:** Fixed an issue using [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop) with [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) or [RAIL_BLE_SetNextTxRepeat()](bletx2-tx#rail-ble-set-next-tx-repeat) when they return an error found in the channel-hopping configuration, yet would still attempt to repeat the next transmit anyway.
- **710983:** Added the new [RAIL_STREAM_CARRIER_WAVE_PHASENOISE](diagnostic#rail-stream-carrier-wave-phasenoise)[RAIL_StreamMode_t](diagnostic#rail-stream-mode-t) for phase noise measurement.
- **719194:** Added RAIL_PA_BAND_COUNT to count RAIL_PaBand_t.

###### 2.11.0

- **369712:** Added [RAIL_StartScheduledCcaCsmaTx](packet-tx#rail-start-scheduled-cca-csma-tx) and [RAIL_StartScheduledCcaLbtTx](packet-tx#rail-start-scheduled-cca-lbt-tx) APIs to allow applications to schedule a CSMA/LBT transmit.
- **456701:** Fixed an issue on EFR32xG1x parts where calling [RAIL_Init()](general#rail-init) with the MSC->CTRL.CLKDISFAULTEN bit set would cause a bus fault.
- **524885:** Added support for a new [RAIL_EVENT_ZWAVE_LR_ACK_REQUEST_COMMAND](events#rail-event-zwave-lr-ack-request-command), triggered on the reception of a Z-Wave Long range packet with acknowledgement request bit set, following which the application must call [RAIL_ZWAVE_SetLrAckData](z-wave#rail-zwave-set-lr-ack-data) to populate the fields of the Z-Wave Long range acknowledgement packet.
- **626961:** Add support for the RAIL_TX_POWER_MODE_*_HIGHEST options in the [RAIL_GetTxPowerCurve()](pa-curve-conversions#rail-get-tx-power-curve) function.
- **654600:** On EFR32XG21, a watchdog has been added to terminate an RSSI averaging operation in case the [RAIL_EVENT_RSSI_AVERAGE_DONE](events#rail-event-rssi-average-done) event does not occur.
- **655541:** Fixed an issue on EFR32XG22 and later where packet filtering might be incomplete in FEC-enabled radio configurations causing good packets to be improperly dropped. Note that if packet filtering fails close to the end of an otherwise successfully received packet, the packet may be flagged [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error) rather than [RAIL_RX_PACKET_ABORT_FILTERED](receive#rail-rx-packet-abort-filtered). This issue is still possible on earlier chips due to hardware filtering restrictions.
- **660021:** Changed when [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) event is issued to better facilitate support for 802.15.4E-2012 Enhanced ACKing and reduce time spent in the event handler. The event is now issued **after** receiving the Auxiliary Security Header (if present) in the MAC Header of the incoming frame, and for MAC Command frames, after receiving the MAC Command byte (which may be encrypted). This change is **not** backwards compatible with prior releases for Enhanced ACK requesting frames, but is for Immediate ACK requesting frames. Use of [RAIL_IEEE802154_EnableEarlyFramePending()](ieee802-15-4#rail-ieee802154-enable-early-frame-pending) is no longer required to support Enhanced ACKing; the notion of early frame pending notification has also shifted to after the Auxiliary Security Header for Enhanced ACK requesting frames.
- **661651:** Changed RAIL Timer Synchronization over sleep on the EFR32xG21 to use the RTCC instead of the PRORTC to reduce current consumption in EM2.
- **665705:** Fixed an issue where a transmit with [RAIL_TX_OPTION_SYNC_WORD_ID](transmit#rail-tx-option-sync-word-id) 1 to use SYNC2 would improperly indicate SYNC1 was used in the packet trace appended information.
- **666275:** Fixed potential delays when using RAIL's channel hopping or duty cycling features in EM1P mode on the EFR32xG22 and newer parts.
- **667103:** Fixed [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) to behave as documented when passed NULL dataPtr: the data is thrown away rather than copied out.
- **671817:** Fixed an issue when switching between certain radio configurations (e.g. Z-Wave) where use of [RAIL_TX_OPTION_REMOVE_CRC](transmit#rail-tx-option-remove-crc) can become permanently stuck.
- **673333:** Fixed an issue with [RAIL_TX_OPTION_WAIT_FOR_ACK](transmit#rail-tx-option-wait-for-ack) transmits where an RX overflow during the ACK wait period would silently abort the ACK timer resulting in no [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) being generated.
- **681133:** Added [RAIL_TX_OPTION_RESEND](transmit#rail-tx-option-resend) to allow re-transmitting the packet most recently loaded into the Transmit FIFO. This can be used in combination with [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) on supported platforms to repeatedly transmit the same packet.
- **681135:** Added new [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat) API and [RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t) to allow configuration of repeated transmits triggered by an initial transmit.
- **681136:** Added ability to configure TxToTx state transition time via [RAIL_StateTiming_t::txToTx](rail-state-timing-t#tx-to-tx) and [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing). This time is generally used between an autoACK transmit and a user transmit that was pending. It's also used during repeated transmits by default, but can be overridden by the [RAIL_TxRepeatConfig_t::delayOrHop](rail-tx-repeat-config-t#delay-or-hop) or [RAIL_BLE_TxRepeatConfig_t::delayOrHop](rail-ble-tx-repeat-config-t#delay-or-hop) configuration.
- **681141:** Added ability to hop channels during repeated transmits in [RAIL_TxRepeatConfig_t](rail-tx-repeat-config-t) using [RAIL_TX_REPEAT_OPTION_HOP](transmit#rail-tx-repeat-option-hop).
- **681143:** Added BLE-specific hooks for repeated transmits with channel hopping in [RAIL_BLE_SetNextTxRepeat()](bletx2-tx#rail-ble-set-next-tx-repeat) and [RAIL_BLE_TxRepeatConfig_t](rail-ble-tx-repeat-config-t).
- **682032:** Fix an issue where setting [RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](transmit#rail-scheduled-tx-during-rx-abort-tx) for a scheduled transmit could cause subsequent non-scheduled transmits to be blocked.
- **695484:** The posting of [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) now occurs before the PA ramps down, at the same time other transmit completion events get posted.
- **696665:** Fixed an issue in [RAIL_ConvertRawToDbm](pa#rail-convert-raw-to-dbm) for PAs which use piecewise-linear line segment fit, where the minimum raw power level was incorrectly compared to the minimum deci-dBm value.
- **697097:** Fixed a rare situation where a premature [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) event might occur when auto-ACK is enabled and a scheduled transmit using [RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](transmit#rail-scheduled-tx-during-rx-abort-tx) is pending when an erroneous packet is received.
- **699890:** Fixed missing C++ compatibility in the [Initialization Utility](rail-util-init) component's generated header file.
- **701604:** Fixed an issue where using [RX Channel Hopping](rx-channel-hopping) with channels in different frequency bands would cause RAIL to assert.
- **703788:** Fixed an issue on EFR32xG2x devices where RAIL would not allow you to initialize the radio with voltage scaling enabled even though this is supported on these devices.
- **705595:** Fixed an issue where custom PA curves provided through the PA Module were not respected when building Silicon Labs Zigbee applications.
- **705802:** Allow [RAIL_ZWAVE_ReceiveBeam](z-wave#rail-zwave-receive-beam) to be run on US LR regions instead of always returning an error.
- **706542:** The [Callbacks Utility](rail-util-callbacks) component can now be configured to not provide the [RAILCb_AssertFailed()](assertions#rail-cb-assert-failed) function for situations where the application wants to provide its own implementation.
- **708511:** Fixed possible [RAIL_ASSERT_FAILED_UNEXPECTED_STATE_TX_FIFO](assertions#rail-assert-failed-unexpected-state-tx-fifo) when [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo) is called after the transmit FIFO had been filled enough to cause its write offset to wrap.

###### 2.10.2

- **652028:** If the selected [RAIL_TxPower_t](pa#rail-tx-power-t) is not supported by the chip, then by default RAIL_TX_POWER_MODE_2P4_HIGHEST is chosen as the power mode.
- **666275:** Fixed potential delays when using RAIL's channel hopping or duty cycling features in EM1P mode on the EFR32xG22 and newer parts.
- **666917:** Previously runtime configuring the Zigbee coexistence PHY select timeout to 255 ms would only guarantee 255 ms on the coexistence optimized PHY. Now the coexistence optimized PHY will be selected indefinitely after runtime configuring the coexistence PHY select timeout to 255 ms.
- **667555:** Fixed an issue with the [Front End Module (FEM) Utility](fem-util) component where it would generate an error if the Rx pin was not required and turned off by the user.
- **669697:** Updated the configuration libraries on BGM210PB22JIA and BGM210PB32JIA modules to fix issues using these parts in the field.
- **671817:** Fixed an issue when switching between certain radio configurations (e.g. Z-Wave) where use of [RAIL_TX_OPTION_REMOVE_CRC](transmit#rail-tx-option-remove-crc) can become permanently stuck.
- **672904:** The minimum and maximum power levels for BGM220P and BGM220SC modules are updated to be 0 and 15 respectively.
- **672909:** Fixed an issue with PA auto mode where it might try to use a [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) that is not valid for the current part.
- **673246:** A multiprotocol scheduled receive with a relative start time and an absolute end time now respects that end time regardless of when the receive actually starts. Before, the end time was made relative and pushed out based on the actual start time to keep the receive window the same width in duration. This is a backwards-incompatible change, but should align better with what users expected when specifying an absolute end time.
- **684407:** Fixed an issue where calling [RAIL_ConfigAntenna()](antenna-control#rail-config-antenna) on EFR32xG22 and newer devices could fault if the GPIO block clock was not explicitly enabled beforehand.
- **687455:** Fixed the conversion of power level to dBm to fetch correct values for BGM220P and BGM220S modules when using the RAIL_TX_POWER_MODE_2P4GIG_HP power mode and power levels above the maximum.

###### 2.10.1

- **635037:** Added support on the EFR32xG22 parts for a new BLE PHY that can receive 1Mbps and LR Coded packets simultaneously. See [RAIL_BLE_ConfigPhySimulscan()](ble#rail-ble-config-phy-simulscan).
- **652969:** Restored automatic IR calibration on EFR32xG22 at [RAIL_Init()](general#rail-init) time.
- **653955:** Fixed an issue when using the [Coexistence Utility](rail-util-coex) component where PWM was enabled if SL_RAIL_UTIL_COEX_PWM_DEFAULT_ENABLED was set, even if SL_RAIL_UTIL_COEX_PWM_REQ_ENABLED was disabled. Now SL_RAIL_UTIL_COEX_PWM_DEFAULT_ENABLED is ignored when SL_RAIL_UTIL_COEX_PWM_REQ_ENABLED is disabled.
- **654726:** Fixed an issue where antenna diversity was not being enabled on EFR32xG1x devices when configured through the [Antenna Diversity Utility](rail-util-ant-div) component.
- **656175:** Fixed an issue where any [RAIL_ChannelConfigEntry_t](rail-channel-config-entry-t) in a [RAIL_ChannelConfig_t](rail-channel-config-t) with a maximum power less than 0 dBm would be stuck at the maximum power no matter what power was requested.
- **663815:** Fixed an issue when using the [Antenna Diversity Utility](rail-util-ant-div) component where moving from TX antenna mode HAL_ANTENNA_MODE_ENABLE2 to HAL_ANTENNA_MODE_DIVERSITY would cause the antenna selection to get stuck on antenna 2.
- **665161:** Fixed an issue on EFR32xG22 and later PTI where the network analyzer could misrepresent the RSSI of incoming packets.

###### 2.10.0

- **244222:** Added support for reporting more detailed transmit errors on the Packet Trace Interface (PTI).
- **318768:** Added new API [RAIL_GetRadioStateDetail](state-transitions#rail-get-radio-state-detail) that provides more detailed radio state information than [RAIL_GetRadioState](state-transitions#rail-get-radio-state).
- **362133:** The default RSSI offset on the EFR32xG1, EFR32xG12, EFR32xG13, EFR32xG14, and EFR32xG21 chips does not compensate for a known internal hardware offset. This offset is chip specific and can be found using the new [Received Signal Strength Indicator (RSSI) Utility](rail-util-rssi) component which will load the correct value for your chip by default when the RSSI Offset component or Hardware Configurator peripheral is enabled. Since the hardware and antenna design can also impact this offset it is recommended that you measure this value for your particular hardware for the best accuracy. This correction is not enabled by default on the chips listed above to prevent changing radio behavior significantly without the user opting into this change. For the EFR32xG22 and future chips the hardware offset is measured and included by default. Please be aware that if any prior CCA token modifications have been made to modify the threshold for CSMA/LBT transmits, adding an RSSI Offset value could reduce or prevent TX.
- **446308:** Updated [RAIL_ZWAVE_ReceiveBeam()](z-wave#rail-zwave-receive-beam) to automatically idle the radio when [RAIL_ZWAVE_ReceiveBeam()](z-wave#rail-zwave-receive-beam) finishes even when no beam is detected.
- **451099:** Added the ability to use the [Initialization Utility](rail-util-init) component multiple times when creating a multiprotocol application.
- **471715:** Fixed an issue when using [RAIL_ConfigAntenna()](antenna-control#rail-config-antenna) on the EFR32xG22 with an RF path other than 0 since these parts do not have multiple RF paths.
- **478948:** Added [RAIL_RxPacketInfo_t::filterMask](rail-rx-packet-info-t#filter-mask) field of type [RAIL_AddrFilterMask_t](address-filtering#rail-addr-filter-mask-t) which is a bitmask representing which address filter(s) the packet has passed.
- **493557:** Added the ability for [RAIL_GetRssi()](receive#rail-get-rssi) to wait for a valid RSSI in radio states that are transitioning into RX. Additionally, a maximum wait timeout for a valid RSSI can be configured using the new API [RAIL_GetRssiAlt()](receive#rail-get-rssi-alt).
- **494571:** Added a new [RAIL_ZWAVE_ConfigRxChannelHopping()](z-wave#rail-zwave-config-rx-channel-hopping) API to configure Z-Wave Rx channel hopping using the recommended hopping parameters.
- **494571:** Added a new [RAIL_ZWAVE_GetRegion()](z-wave#rail-zwave-get-region) API to determine the currently selected Z-Wave region.
- **495497:** Changed [RAIL_PacketTimeStamp_t::totalPacketBytes](rail-packet-time-stamp-t#total-packet-bytes) from uint32_t to uint16_t to reduce RAM usage.
- **497196:** The [Initialization Utility](rail-util-init) component now defaults most options to a disabled state, instead of enabled. Now you have to opt-in, instead of opt- out, of RAIL init functionality.
- **501510:** Added a new [RAIL_SupportsTxPowerModeAlt()](features#rail-supports-tx-power-mode-alt) API to get the minimum and maximum power levels for a specific power mode if the power mode is supported by the chip.
- **519195:** The EFR32xG21 will now use RTCC channel 0, as opposed to the PRORTC, to perform sleep timer synchronization. This will help lower the EM2 current consumption for this chip.
- **519288:** The [RAIL 2.x PA Power Conversion Utility](rail-util-pa) component now enables PA calibration by default to ensure that PA power remains consistent chip-to-chip.
- **520521:** Added a new API [RAIL_SetAddressFilterAddressMask()](address-filtering#rail-set-address-filter-address-mask) that allows for setting a bit mask pattern for packet data in the address filters.
- **520937:** Add new [RAIL_EVENT_RF_SENSED](events#rail-event-rf-sensed) as an alternative to the current [RAIL_StartRfSense()](rf-sense#rail-start-rf-sense) callback parameter.
- **520943:** Added a new API [RAIL_ConfigSleepAlt()](sleep#rail-config-sleep-alt) to allow configuring the PRS channel, RTCC channel, and whether sleep is enabled in one call.
- **524046:** Added support for MGM210PB22JIA, MGM210PB32JIA, BGM210PB22JIA and BGM210PA32JIA modules.
- **580312:** Created a new [Protocol Utility](rail-util-protocol) component for setting up RAIL to use one of the standards based PHYs by default.
- **630457:** On custom boards, the [Packet Trace Interface (PTI) Utility](rail-util-pti) component no longer reserves pins for use without being configured.
- **632723:** The EFR32xG22 will limit going to EM1P sleep mode when an 80MHz HRFRCO PLL system clock is selected. Going to EM1P sleep is not supported when using the DPLL on this hardware as it can cause clock drift which would impact radio timing and tuning.
- **635237:** Added an event [RAIL_EVENT_PA_PROTECTION](events#rail-event-pa-protection) to indicate the power protection circuit has kicked in.
- **638067:** Fixed a DMP issue that poached transmit power when switching between protocols using the same channel configuration and channel.
- **638239:** Created a [Callbacks Utility](rail-util-callbacks) component for application- level callbacks.
- **639833:** Fixed a potential radio hang on a corrupted BLE packet when doing BLE AoX.
- **642893:** Reduced RAIL library flash data alignment needs on the EFR32xG22.
- **645641:** Fixed an EFR32xG22 issue where a state transition to receive after a transmit from EM2 sleep would drop packets.
- **650072:** In multiprotocol RAIL, when the supplied handle is not the active handle, [RAIL_GetRadioState](state-transitions#rail-get-radio-state) now returns [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx) rather than [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle) if a background receive is currently scheduled.

###### 2.9.2

- **501674:** Reduced the time from last modulated bit on air to ramp down on EFR32xG1x devices.
- **623922:** Fix to set the right power on EFR32xG21 when the PA uses VDD around 1.8V.

###### 2.9.1

- **493409:** Fixed an issue where output power might not be set correctly when changing frequency bands within one channel configuration.
- **497061:** Corrected an issue on EFR32xG1x chips where specifying a large ramp time could erroneously add extra delay to a transmit.
- **519195:** EFR32xG21 will now use RTCC channel 0, as opposed to the PRORTC, to perform sleep timer synchronization. This will help lower the EM2 current consumption for this chip.
- **524046:** Added support for MGM210PB22JIA, MGM210PB32JIA, BGM210PB22JIA and BGM210PA32JIA modules.

###### 2.9.0

- **204557:** Added support for setting the default value of the FramePending bit in outgoing IEEE 802.15.4 data poll ACKs to true. This means that the user would then be responsible for clearing this bit in the frame pending callback instead of having it default to cleared and having to set it. See the [RAIL_IEEE802154_Config_t::defaultFramePendingInOutgoingAcks](rail-ieee802154-config-t#default-frame-pending-in-outgoing-acks) field for configuring this feature.
- **298829:** Added a new API [RAILCb_ConfigSleepTimerSync()](sleep#rail-cb-config-sleep-timer-sync) to allow for configuration of the PRS and RTCC channels used for timer sync operations.
- **300348:** Added support for a new [RAIL_EVENT_SCHEDULED_RX_STARTED](events#rail-event-scheduled-rx-started) and [RAIL_EVENT_SCHEDULED_TX_STARTED](events#rail-event-scheduled-tx-started), triggered when a scheduled receive or transmit begins. These are the same value because a scheduled receive and transmit cannot occur at the same time. Note: This new event shifted the bit positions of some events in [RAIL_Events_t](events#rail-events-t).
- **381485:** Provided new [RAIL_RX_CHANNEL_HOPPING_MODE_MULTI_SENSE](rx-channel-hopping#rail-rx-channel-hopping-mode-multi-sense) along with [RAIL_RxChannelHoppingConfigMultiMode_t](rail-rx-channel-hopping-config-multi-mode-t) to configure its parameters. This mode can be configured to tolerate brief loss of timing and/or preamble making it less susceptible to hopping than the single-sense modes. It can also be used with RX duty cycling.
- **402203:** Provided new [RAIL_RX_CHANNEL_HOPPING_OPTION_RSSI_THRESHOLD](rx-channel-hopping#rail-rx-channel-hopping-option-rssi-threshold) to augment each of the [RAIL_RxChannelHoppingMode_t](rx-channel-hopping#rail-rx-channel-hopping-mode-t) modes with one RSSI Threshold check on entering receive for the channel. If the RSSI is below that specified by [RAIL_RxChannelHoppingConfigEntry_t::rssiThresholdDbm](rail-rx-channel-hopping-config-entry-t#rssi-threshold-dbm) then hop (or if below [RAIL_RxDutyCycleConfig_t::rssiThresholdDbm](rail-rx-duty-cycle-config-t#rssi-threshold-dbm), suspend RX). [RAIL_RxDutyCycleConfig_t](rail-rx-duty-cycle-config-t) has been augmented not only with this new field, but also now includes [RAIL_RxDutyCycleConfig_t::options](rail-rx-duty-cycle-config-t#options) field. For those options to be recognized by [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle) (due to backwards compatibility) [RAIL_RxDutyCycleConfig_t::mode](rail-rx-duty-cycle-config-t#mode) must be one of the new WITH_OPTIONS modes, e.g. [RAIL_RX_CHANNEL_HOPPING_MODE_TIMEOUT_WITH_OPTIONS](rx-channel-hopping#rail-rx-channel-hopping-mode-timeout-with-options).
- **411017:** Relax constraints in RAIL to allow calling [RAIL_SetRxTransitions](state-transitions#rail-set-rx-transitions), [RAIL_SetTxTransitions](state-transitions#rail-set-tx-transitions), [RAIL_ScheduleRx](receive#rail-schedule-rx), and all of the RAIL_BLE_ConfigPhy functions before the radio is completely IDLE.
- **414398:** Added support for the Silicon Labs Power Manager component. When enabled via [RAIL_InitPowerManager()](sleep#rail-init-power-manager) RAIL will communicate directly with the power manager to configure sleep modes. See the [Sleep](sleep) section for more documentation.
- **429513:** Added support for RAIL's FrameType based length on the EFR32xG22.
- **442248:** Updated the pa_customer_curve_fits.py helper script to work with Python 3 as well as Python 2.
- **442978:** Changed pa_customer_curve_fits.py to take maxpower as a parameter to generate better curves. When maxpower and increment are different from the defaults they will now be included in the output curve. The current power curve limits can be read at runtime from the new RAIL_GetTxPowerCurveLimits API.
- **450750:** The [RAIL_GetRadioEntropy()](general#rail-get-radio-entropy) API will now ensure a valid radio configuration has been loaded using [RAIL_ConfigChannels()](radio-configuration#rail-config-channels) since it can cause problems if the radio is used before this.
- **454096:** Updated the function [RAIL_GetRxPacketDetailsAlt](packet-information#rail-get-rx-packet-details-alt) to return the time position of the received packet timestamp corresponding to the default location in the packet.
- **454096:** Added a new function, [RAIL_GetTxPacketDetailsAlt2](transmit#rail-get-tx-packet-details-alt2), which allows a [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) structure to be passed as an argument.
- **454096:** Added a new function, [RAIL_GetTxTimePreambleStartAlt](transmit#rail-get-tx-time-preamble-start-alt), which allows a [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) structure to be passed as an argument.
- **454096:** Added a new function, [RAIL_GetTxTimeSyncWordEndAlt](transmit#rail-get-tx-time-sync-word-end-alt), which allows a [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) structure to be passed as an argument.
- **454096:** Added a new function, [RAIL_GetTxTimeFrameEndAlt](transmit#rail-get-tx-time-frame-end-alt), which allows a [RAIL_TxPacketDetails_t](rail-tx-packet-details-t) structure to be passed as an argument.
- **456338:** Fixed an issue with RAIL state transitions where an internal timer wrapping could cause incorrect transition times. This error would previously affect at most one packet every 15 minutes.
- **459581:** Fixed an issue with the EFR32xG21 medium power PA that could cause the output power to be too low for certain power level and ramp time combinations.
- **464534:** Fixed issue where [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) ran twice as long as it should have.
- **464734:** Regenerated the power curves for the EFR32xG22 to allow access to the maximum power level available on the chip.
- **464735:** Closed tiny timing window on EFR32xG13 that might corrupt PTI appended info when idling the radio.
- **465096:** Fixed an issue where [RAIL_Idle()](state-transitions#rail-idle-1) was not properly terminating an ongoing [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) process.
- **465220:** Bluetooth Angle of Arrival and Angle of Departure support has been removed from the EFR32xG13 chip. For future usage of this feature please look to the EFR32xG22.
- **466012:** Fixed an issue where the CRC could be disabled indefinitely on transmit when switching configs in a multiphy setup.
- **474678:** Fixed an issue with duty cycle receive and channel hopping on the EFR32xG1x parts where some parts of the radio would be left on even with long delay parameters causing extra current to be used. This allows for a noticeable improvement in power consumption when using the [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle) API with delays of more than a hundred microseconds.
- **475184:** Fixed an issue on the EFR32xG22 where the receiver was not automatically re-calibrated if the temperature changed significantly while sitting in receive. This could cause the radio to go off channel for significant temperature changes resulting in receive problems.
- **477621:** Improved frequency accuracy on EFR32xG1x devices when the radio configuration has an entry with a large number of channels. Previously, small errors in the channel spacing calculation could exist. If they did, then when computing the channel frequency this error would be multiplied by the channel number minus the start channel for that entry causing some drift for higher order channels. This was not much an issue in most cases, but for certain PHY and crystal combinations it could be worse.
- **477833:** Some radio configurations on the EFR32XG22 are not usable with RAIL address filtering and RAIL 802.15.4 filtering. Add an assert to catch those cases.
- **479539:** Fixed a bug where the [RAIL_ConfigTxPower()](pa#rail-config-tx-power) would override the PA capacitor tuning values for transmit and receive without caching them. In a multiprotocol scenario this could cause us to apply incorrect PA capacitor tuning values set prior to a call to [RAIL_ConfigTxPower](pa#rail-config-tx-power). Note that you must still call [RAIL_SetPaCTune](radio-configuration#rail-set-pa-c-tune) after any making any changes to the power configuration via [RAIL_ConfigTxPower](pa#rail-config-tx-power).
- **479665:** Fixed an issue where [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo) would not reject a buffer smaller than 64 bytes and would mistakenly think it is very big.<br />  
   In addition, [RAIL_ASSERT_FAILED_RX_FIFO_BYTES](assertions#rail-assert-failed-rx-fifo-bytes) can no longer occur with a 64 byte buffer when doing IR calibration.
- **482007:** Fixed a bug in multiprotocol RAIL where running an IR calibration during a protocol switch would fail. The calibration function will now return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if called in such a scenario.
- **483688:** Fixed an issue where the power mode selected when using RAIL_TX_POWER_MODE_2P4GIG_HIGHEST on supported chips was not saved in a multiprotocol context and could cause problems.
- **484374:** Fixed regression from 2.8.1 on EFR32xG21 where Bluetooth LE did not include packet sync word on PTI.
- **488752:** Fixed an issue with MGM1x and BGM1x modules that caused PHY changes to be slower than when using stand alone parts. This could cause problems in certain BLE or DMP use cases where reconfiguration time is critical.
- **489214:** Fixed an issue where calling [RAIL_IEEE802154_CalibrateIr2p4Ghz](calibration#rail-ieee802154-calibrate-ir2p4-ghz), [RAIL_IEEE802154_CalibrateIrSubGhz](calibration#rail-ieee802154-calibrate-ir-sub-ghz), or [RAIL_BLE_CalibrateIr](calibration#rail-ble-calibrate-ir) with a NULL imageRejection parameter would result in a crash.

###### 2.8.10

- **456701:** Fixed an issue on EFR32xG1x parts where calling [RAIL_Init()](general#rail-init) with the MSC->CTRL.CLKDISFAULTEN bit set would cause a bus fault.
- **702377:** The GB868 PHYs have been modified to improve performance for the EFR32xG1, EFR32xG12, EFR32xG13 and EFR32xG14.

###### 2.8.9

- **645641:** Fixed an issue on EFR32xG22 where a state transition to receive after a transmit from EM2 sleep would drop packets.
- **661651:** Changed RAIL Timer Synchronization over sleep on the EFR32xG21 to use the RTCC instead of the PRORTC to reduce current consumption in EM2.
- **671168:** Fixed an issue on EFR32xG22 parts where current consumption would be higher than expected after radio activity.

###### 2.8.8

- **639833:** Fixed a potential radio hang on a corrupted BLE packet when doing BLE AoX.

###### 2.8.7

- **499216:** Fixed an issue with the EFR32xG21 medium power PA that could cause the output power to be too low for certain power level and ramp time combinations.
- **499366:** Added support for new BGM220 modules.

###### 2.8.6

- **477833:** Some radio configurations on the EFR32XG22 are not usable with RAIL address filtering and RAIL 802.15.4 filtering. Add an assert to catch those cases.
- **484374:** Fixed regression from 2.8.1 on EFR32xG21 where BLE did not include packet sync word on PTI.

###### 2.8.4

- **344182:** Added new [RAIL_BLE_ConfigAoxAntenna](ao-x#rail-ble-config-aox-antenna) API to configure which GPIO pins are used for BLE AoX.
- **411017:** Relax constraints in RAIL to allow calling [RAIL_SetRxTransitions](state-transitions#rail-set-rx-transitions), [RAIL_SetTxTransitions](state-transitions#rail-set-tx-transitions), [RAIL_ScheduleRx](receive#rail-schedule-rx), and all of the RAIL_BLE_ConfigPhy before the radio is completely IDLE
- **465096:** Fixed an issue where [RAIL_Idle()](state-transitions#rail-idle-1) was not properly terminating an ongoing [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) process.
- **467589:** Updated default dynamic multiprotocol (DMP) transition timings to make them work with Zigbee and BLE DMP applications work. The previously suggested workaround of adding 30 us to the default transition time using [RAIL_SetTransitionTime()](multiprotocol#rail-set-transition-time) is no longer required.
- **471373:** Fixed an issue on the EFR32xG22 where loading IEEE 802.15.4 and BLE PHYs without a reset would cause an assert with error code [RAIL_ASSERT_CACHE_CONFIG_FAILED](assertions#rail-assert-cache-config-failed).
- **471955:** Fixed an issue with BGM220 modules that caused an assert, [RAIL_ASSERT_INVALID_MODULE_ACTION](assertions#rail-assert-invalid-module-action), when using them in previous releases.

###### 2.8.3

- **387749:** Revamped [Features](features) and [rail_features.h](rail-features-h), providing runtime RAIL_SupportsSomeFeature() APIs for each of the features as some features may be restricted to certain chips within a family. Also added more consistent RAIL_SUPPORTS_ compile-time synonyms for the features while retaining the existing RAIL_FEAT_ defines for backwards compatibility. These defines can now be used in C code and not just preprocessor #if statements.
- **442248:** Updated the pa_customer_curve_fits.py helper script to work with Python 3 as well as Python 2.
- **464735:** Closed tiny timing window on EFR32xG13 that might corrupt PTI appended info when idling the radio.
- **464774:** * Calling [RAIL_ConfigSleep()](sleep#rail-config-sleep) with [RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled) on chips that use the PRORTC for synchronization (EFR32xG13 and newer) will now only configure the choose the LF clock source if the PRORTC IRQ is disabled. This allows for other code to safely configure the PRORTC like the Silicon Labs generic sleep timer.
- **466396:** Added support for new BGM220 modules.
- **469015:** Fixed an issue on the EFR32xG21 that could cause the [RAIL_GetRadioEntropy()](general#rail-get-radio-entropy) function to return the same first 4 bytes when called with the radio off after a reset.

###### 2.8.2

- **456338:** Fixed an issue with RAIL state transitions where an internal timer wrapping could cause incorrect transition times. This error would previously affect a maximum of one packet every 15 minutes.
- **460062:** Fixed a [RAIL_ScheduleRx()](receive#rail-schedule-rx) issue where [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) might not be posted when the Rx [RAIL_StateTransitions_t::error](rail-state-transitions-t#error) transition is to [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle) and the Rx window ended during receipt of an erroneous packet.

###### 2.8.1

- **251720:** Added the new [RAIL_STREAM_10_STREAM](diagnostic#rail-stream-10-stream)[RAIL_StreamMode_t](diagnostic#rail-stream-mode-t) to allow you to send a 1010 stream for debugging.
- **316106:** Added a new function, [RAIL_StartTxStreamAlt](diagnostic#rail-start-tx-stream-alt), which allows the specific antenna to be specified for a stream transmit.
- **383197:** Added new [RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](receive#rail-rx-packet-handle-oldest-complete) packet handle to allow the user to get a reference to the oldest unreleased complete packet.
- **435689:** Added a new [External Thermistor](external-thermistor) interface to RAIL. This allows access the user to connect and read the impedance of an external thermistor on supported chips.
- **444205:** Fixed a transmit-from-idle issue with [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) or [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) which would always fail when the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) is configured below the minimum the radio is capable of achieving (typically 65-100 microseconds depending on platform).
- **450750:** The [RAIL_GetRadioEntropy()](general#rail-get-radio-entropy) API will now ensure a valid radio configuration has been loaded using [RAIL_ConfigChannels()](radio-configuration#rail-config-channels) since it can cause problems if the radio is used before this.
- **452628:** Fixed an issue where idling the radio from an Rx antenna diversity mode would consume extra power.
- **452690:** Fixed an issue where Rx antenna diversity could be left enabled after switching to a radio configuration that lacks diversity support.
- **455495:** Added [RAIL_IEEE802154_ConvertRssiToEd()](ieee802-15-4#rail-ieee802154-convert-rssi-to-ed) and [RAIL_IEEE802154_ConvertRssiToLqi()](ieee802-15-4#rail-ieee802154-convert-rssi-to-lqi) to assist Zigbee 802.15.4 certification testing.
- **456225:** Changed the value of [RAIL_FREQUENCY_OFFSET_INVALID](diagnostic#rail-frequency-offset-invalid) from -1 to -32768 since -1 is a reasonable frequency offset to pass to [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset). Also added convenience definitions [RAIL_FREQUENCY_OFFSET_MIN](diagnostic#rail-frequency-offset-min) and [RAIL_FREQUENCY_OFFSET_MAX](diagnostic#rail-frequency-offset-max) to specify the valid range of offset values the radio supports.

###### 2.8.0

- **197573:** Suppressed extraneous [RAIL_EVENT_TX_START_CCA](events#rail-event-tx-start-cca) events that might occur during long CCA durations. Now only one such event should occur per CCA try.
- **295265:** Added two new APIs, [RAIL_GetSyncWords](radio-configuration#rail-get-sync-words) and [RAIL_ConfigSyncWords()](radio-configuration#rail-config-sync-words), to allow getting and setting the sync word configuration of your PHY at runtime.
- **301472:** On EFR32xG12 thru EFR32xG14, added support for 802.15.4G-2012 SUN PHY dynamic frame payload whitening on reception and transmit based on the PHY header's Data Whitening flag setting. This feature is automatically enabled when [RAIL_IEEE802154_ConfigGOptions()](ieee802-15-4#rail-ieee802154-config-g-options)' [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868) is enabled, and assumes the radio configuration specifies the appropriate whitening algorithm and settings.
- **301488:** On EFR32xG12 thru EFR32xG14, added support for 802.15.4G-2012 SUN PHY dynamic frame payload 2/4-byte FCS (CRC) on reception and transmit based on the PHY header's FCS Type flag setting. This feature is automatically enabled when [RAIL_IEEE802154_ConfigGOptions()](ieee802-15-4#rail-ieee802154-config-g-options)' [RAIL_IEEE802154_G_OPTION_GB868](ieee802-15-4#rail-ieee802154-g-option-gb868) is enabled. The radio configuration's (single) CRC algorithm settings are ignored, overridden by RAIL.
- **301501:** On EFR32xG12 thru EFR32xG14, 802.15.4 AutoACK behavior has also been updated so transmitted immediate ACKs reflect the Whitening and 2/4-byte FCS of the received frame being acknowledged.
- **369722:** Added [RAIL_TX_OPTION_CCA_ONLY](transmit#rail-tx-option-cca-only) to just perform CCA (CSMA/LBT), stopping short of automatically transmitting when the channel is clear.
- **369727:** Added support for a new [RAIL_EVENT_TX_STARTED](events#rail-event-tx-started), triggered when the first preamble bit is about to go on-air. Also included the ability to retrieve the equivalent [RAIL_PACKET_TIME_AT_PREAMBLE_START](system-timing#rail-packet-time-at-preamble-start) timestamp of that event from the event's handler via [RAIL_GetTxTimePreambleStart()](transmit#rail-get-tx-time-preamble-start). Note: This new event shifted the bit positions of some events in [RAIL_Events_t](events#rail-events-t).
- **369727:** Also changed [RAIL_GetRxTimePreambleStartAlt()](packet-information#rail-get-rx-time-preamble-start-alt), [RAIL_GetRxTimeSyncWordEndAlt()](packet-information#rail-get-rx-time-sync-word-end-alt), and [RAIL_GetRxTimeFrameEndAlt()](packet-information#rail-get-rx-time-frame-end-alt) to properly update its pPacketDetails' [RAIL_PacketTimeStamp_t::timePosition](rail-packet-time-stamp-t#time-position) to reflect the adjusted [RAIL_PacketTimeStamp_t::packetTime](rail-packet-time-stamp-t#packet-time) rather than leaving it as [RAIL_PACKET_TIME_DEFAULT](system-timing#rail-packet-time-default).
- **384878:** Clarified documentation of the [RAIL_EVENT_RX_ACK_TIMEOUT](events#rail-event-rx-ack-timeout) event and [RAIL_AutoAckConfig_t::ackTimeout](rail-auto-ack-config-t#ack-timeout) period which extends only to packet sync word detection of an expected ACK, not packet completion of that ACK.
- **397072:** Added an API, [RAIL_StopInfinitePreambleTx](diagnostic#rail-stop-infinite-preamble-tx), that can stop an infinite preamble on PHYs configured to use infinite preambles.
- **402991:** Added additional information to the packet trace stream for the Z-Wave protocol to indicate what region is currently active to help with decoding.
- **406080:** Added support for RFSENSE Selective (OOK) mode for supported chips, which currently includes only EFR32xG22 devices. Please refer to RAIL internal chip specific documentation for more details.
- **406871:** Documented RAIL's internal 16-packet metadata FIFO which exists on EFR32 platforms supplementing the receive FIFO of packet data. Refer to [Data Management](data-management) and [EFR32](efr32-main) for details. Included is support for a new [RAIL_EVENT_RX_FIFO_FULL](events#rail-event-rx-fifo-full), triggered with any packet completion event in which the receive FIFO or packet metadata FIFO are full. This tells the application it must free up the oldest packets/data ASAP to reduce the chance of [RAIL_EVENT_RX_FIFO_OVERFLOW](events#rail-event-rx-fifo-overflow) (however, overflow may already have occurred). Note: This new event shifted the bit positions of some events in [RAIL_Events_t](events#rail-events-t).
- **411498:**[RAIL_StartAverageRssi()](receive#rail-start-average-rssi) now returns [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if called when the radio is not idle, enforcing its documented behavior.
- **414114:** Added a new PA mode which will attempt to automatically choose the PA which consumes the least amount of current to reliably produce the requested output power. See [RAIL_EnablePaAutoMode()](pa#rail-enable-pa-auto-mode) for details.
- **417340:** Fixed an issue where [RAIL_RxPacketDetails_t::isAck](rail-rx-packet-details-t#is-ack) would incorrectly be set true for non-ACK or unexpected ACK packets received successfully (e.g. when [RAIL_IEEE802154_ACCEPT_ACK_FRAMES](ieee802-15-4#rail-ieee802154-accept-ack-frames) is enabled) or aborted while waiting for the expected ACK. Note that when [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) is in effect, an expected ACK includes one that fails CRC, and will have isAck set true.
- **418493:** RAIL_ConfigRadio will now return RAIL_STATUS_INVALID_STATE if called from the inactive config in dynamic multiprotocol instead of returning success but not applying the change.
- **427934:** Fixed a race condition that could cause a device to not re- enable frame detection after an Rx overflow event if the overflow was processed and cleared very quickly.
- **430026:** Enforced and clarified that [RAIL_Init()](general#rail-init) should not be called more than once per protocol.
- **430081:** Fixed an issue where the first Clear Channel Assessment (CCA) of a CSMA/LBT transmit from radio idle state would consistently fail when the [RAIL_CsmaConfig_t::ccaBackoff](rail-csma-config-t#cca-backoff) or [RAIL_LbtConfig_t::lbtBackoff](rail-lbt-config-t#lbt-backoff) time is smaller than the [RAIL_StateTiming_t::idleToRx](rail-state-timing-t#idle-to-rx) time.
- **436163:** Fixed a post-receive transition timing issue for received packets that were on the air longer than 32 milliseconds. AutoACK turnaround timing should now behave properly at low data rates.
- **437054:** Fixed an issue with the pa_customer_curve_fits.py that caused values below -12 to not be considered when computing the fit. Re-generated default, Silicon Labs-provided curves to consume this fix, resulting in minor changes to the lowest-power segment in curve-fit based PA's. If using a custom power curve created using the documentation in AN1127 customers should re-run the script on the already collected output data to get slightly more accurate curves.
- **441635:** Return the correct RAIL_TxPowerMode_t value of RAIL_TX_POWER_MODE_NONE from RAIL_GetTxPowerConfig if called before RAIL_ConfigTxPower.
- **446289:** Fixed [RAIL_IDLE_ABORT](state-transitions#rail-idle-abort) to idle the radio sooner when in [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx), especially now that [RAIL_RxChannelHoppingConfigEntry_t::delay](rail-rx-channel-hopping-config-entry-t#delay) can extend the time in that state.
- **447578:** Fixed an issue where setting a transmit power over the maximum allowed for a given channel would result in no change in the output power instead of using the maximum allowed value.
- **450187:** Fixed an issue where calling [RAIL_Idle()](state-transitions#rail-idle-1) with [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown) while in receive with channel hopping enabled could corrupt some internal channel hopping state and trigger a bus fault or other radio problems.

###### 2.7.4

- **436215:** Fixed an issue on the EFR32xg13 parts that caused the 2Mbps BLE IFS time to be incorrect when receiving very short packets.
- **443144:** Fixed the module specific config libraries for the xGM210xA modules: BGM210LA22JIF, BGM210LA22JNF, BGM210PA22JIA, BGM210PA22JNA, BGM210PA32JIA, BGM210PA32JNA, MGM210LA22JIF, MGM210LA22JNF, MGM210PA22JIA, MGM210PA22JNA, MGM210PA32JIA, MGM210PA32JNA. Without this change these modules would assert with [RAIL_ASSERT_INVALID_MODULE_ACTION](assertions#rail-assert-invalid-module-action).

###### 2.7.3

- **425464:** Improved interoperability with many common devices for the 1Mbps Viterbi BLE PHY on the EFR32xG13 chips. Note that this does revert a previous change to improve interoperability from [changelist_2_6_4](changelist#changelist-1changelist-2-6-4) that attempted to improve interoperability with a few specific devices. For best interoperability we recommend using the [RAIL_BLE_ConfigPhy1Mbps()](ble#rail-ble-config-phy1-mbps) standard PHY.
- **431229:** Resolved an issue on EFR32xG1x devices which could cause the transmit power to be incorrect when using the low power 2.4GHz PA ([RAIL_TX_POWER_MODE_2P4_LP](pa#rail-tx-power-mode-2-p4-lp)).

###### 2.7.2

- **336739:** Added new [RAIL_EVENT_RX_SCHEDULED_RX_MISSED](events#rail-event-rx-scheduled-rx-missed) and [RAIL_EVENT_TX_SCHEDULED_TX_MISSED](events#rail-event-tx-scheduled-tx-missed) events to inform the user when these are missed after waking from [RAIL_Sleep()](sleep#rail-sleep). This can happen if the specified wakeup time is not long enough.
- **421410:** Fixed an issue introduced in 2.7.1 with TX PTI on EFR32XG13 including an extra byte of appended information, confusing the network analyzer.

###### 2.7.1

- **337468:** Fixed an issue where calling [RAIL_Sleep()](sleep#rail-sleep) if there were no RAIL events pended would not stop and synchronize the clock source as requested but would return success indicating it had. The clock source will now be properly stopped and synchronized even if there are no events pending and it will be the user's responsibility to wake up on time.
- **337468:** Fixed an issue where calling [RAIL_Wake()](sleep#rail-wake) without a successful call to [RAIL_Sleep()](sleep#rail-sleep) first could cause the clock source to drift even when using [RAIL_SLEEP_CONFIG_TIMERSYNC_ENABLED](sleep#rail-sleep-config-timersync-enabled).
- **389462:** Fixed an issue with [RAIL_Calibrate()](calibration#rail-calibrate) in multiprotocol, which would return [RAIL_STATUS_INVALID_STATE](general#rail-status-invalid-state) if it is called with an inactive railHandle. Now, [RAIL_Calibrate()](calibration#rail-calibrate) will make the given railHandle active, if not already, and perform calibration.
- **389462:** Fixed an issue with [RAIL_Calibrate()](calibration#rail-calibrate) where after completing calibration the radio would no longer be able to receive any packets, sometimes, until it was reset.
- **396786:** Added support for the following EFR32xG21-based modules: BGM210L022JIF1, BGM210L022JIF2, BGM210L022JNF1, BGM210L022JNF2, BGM210LA22JIF1, BGM210LA22JIF2, BGM210LA22JNF1, BGM210LA22JNF2, BGM210P022JIA1, BGM210P022JIA2, BGM210P022JNA2, BGM210P032JIA1, BGM210P032JIA2, BGM210P032JNA2, BGM210PA22JIA1, BGM210PA22JIA2, BGM210PA22JNA2, BGM210PA32JIA1, BGM210PA32JIA2, BGM210PA32JNA2, MGM210L022JIF1, MGM210L022JIF2, MGM210L022JNF1, MGM210L022JNF2, MGM210LA22JIF1, MGM210LA22JIF2, MGM210LA22JNF1, MGM210LA22JNF2, MGM210P022JIA1, MGM210P022JIA2, MGM210P022JNA2 MGM210P032JIA1, MGM210P032JIA2, MGM210P032JNA2 MGM210PA22JIA1, MGM210PA22JIA2, MGM210PA22JNA2 MGM210PA32JIA1, MGM210PA32JIA2, MGM210PA32JNA2
- **401826:** Fixed several issues and race conditions with [RAIL_ScheduleRx()](receive#rail-schedule-rx) window end handling and event reporting to conform to its intended design:  
  - When the RX window ends with no [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion) imminent, [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) is posted.  
  - When the RX window is implicitly ended by one of the [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion), e.g. because it results in an RX transition to Idle or because [RAIL_ScheduleRxConfig_t::rxTransitionEndSchedule](rail-schedule-rx-config-t#rx-transition-end-schedule) is non-zero, the event(s) posted depend on that setting:    
    - When zero, both events are posted simultaneously.    
    - When non-zero, only the appropriate [RAIL_EVENTS_RX_COMPLETION](events#rail-events-rx-completion) is posted, unless that event is not enabled, in which case [RAIL_EVENT_RX_SCHEDULED_RX_END](events#rail-event-rx-scheduled-rx-end) is substituted instead.  
  - When the RX window ends while receiving a packet, it is deferred to the expected RX completion event (which includes aborting that packet when [RAIL_ScheduleRxConfig_t::hardWindowEnd](rail-schedule-rx-config-t#hard-window-end) is non-zero). Event(s) reported at that time are the same as in the previous case.
- **406276:** Restored ability for [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) and [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) to perform an immediate transmit when their respective [RAIL_CsmaConfig_t::csmaTries](rail-csma-config-t#csma-tries) or [RAIL_LbtConfig_t::lbtTries](rail-lbt-config-t#lbt-tries) is 0. This functionality was improperly removed in 2.6.0.
- **407047:** Fixed an EFR32xG21 issue where CSMA/LBT CCA durations were significantly shorter than specified.
- **408096:** Fixed the 802.15.4 ACK turnaround time on the EFR32xG21 platform. Due to a calculation error this was actually 18 us too short which could cause interoperability problems.
- **414257:** Added [RAIL_TX_POWER_LEVEL_MAX](pa#rail-tx-power-level-max) which can be used to set the max PA power level across PA's. [RAIL_TX_POWER_LEVEL_INVALID](pa#rail-tx-power-level-invalid) was added in 2.7.0 as the value 255. Some customers were using 255 to set max power across PA's with [RAIL_SetTxPower](pa#rail-set-tx-power), which previously worked, but will now return an error.

###### 2.7.0

- **379150:** Added support to [RAIL_Sleep()](sleep#rail-sleep) for the PLFRCO on EFR32xG13 Rev D parts.
- **357922:** Changed the LQI metric for the 2.4GHz IEEE802.15.4 PHY configurations to be scaled from 0 - 255 and to include more data to make it more stable. This can impact existing applications that are using the LQI values returned in prior RAIL versions.
- **378035:** Use of the unsafe enum GPIO_Port_TypeDef within RAIL aggregate types [RAIL_PtiConfig_t](rail-pti-config-t) and [RAIL_AntennaConfig_t](rail-antenna-config-t) has been replaced by safe uint8_t.
- **376229:** Fixed an issue with Rx antenna diversity operation that prevented CCA from working, causing CSMA failures.
- **315849:** Reduced switch time overhead for dynamic multiprotocol applications. The new switch times as well as information about them are documented at [Understanding the Protocol Switch Time](rail-multiprotocol#rail-multiprotocol-1rail-radio-scheduler-switch-time).
- **370805:** Fixed an issue with the EFR32xG21 reporting a phantom packet on PTI after reset.
- **377026:** Improved documentation of [RAIL_RxPacketStatus_t](receive#rail-rx-packet-status-t) values and their corresponding [RAIL_Events_t](events#rail-events-t) events.
- **400303:** Corrected an issue where [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy) due to [RAIL_CsmaConfig_t::csmaTimeout](rail-csma-config-t#csma-timeout) or [RAIL_LbtConfig_t::lbtTimeout](rail-lbt-config-t#lbt-timeout) would prevent further transmits.
- **400303:** Corrected an issue where an invalid [RAIL_CsmaConfig_t::ccaDuration](rail-csma-config-t#cca-duration) or [RAIL_LbtConfig_t::lbtDuration](rail-lbt-config-t#lbt-duration) too large for the radio configuration to handle would not fail the respective transmit; this now returns [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter).
- **400303:** Clarified that [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) and [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy) leave the TX FIFO intact without consuming any of its packet data.
- **392350:** Corrected an issue where the radio might be left in receive after a [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) or [RAIL_EVENT_TX_CHANNEL_BUSY](events#rail-event-tx-channel-busy) when the transmit [RAIL_StateTransitions_t::error](rail-state-transitions-t#error) is [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle).
- **251786:** Added new 802.15.4 RAIL APIs [RAIL_IEEE802154_EnableEarlyFramePending()](ieee802-15-4#rail-ieee802154-enable-early-frame-pending) and [RAIL_IEEE802154_EnableDataFramePending()](ieee802-15-4#rail-ieee802154-enable-data-frame-pending) to support Thread Basil-Hayden Enhanced Frame Pending feature.
- **369736:** Added new 802.15.4 RAIL APIs [RAIL_IEEE802154_ConfigGOptions()](ieee802-15-4#rail-ieee802154-config-g-options) and [RAIL_IEEE802154_ConfigEOptions()](ieee802-15-4#rail-ieee802154-config-e-options) for configuring certain 802.15.4E-2012 and G-2012 features needed by GB868. Also, RAIL may now suppress the [RAIL_EVENT_IEEE802154_DATA_REQUEST_COMMAND](events#rail-event-ieee802154-data-request-command) when latency has delayed the handling of that event too late to influence the outgoing ACK for it.
- **385960:** Added information to packet trace for every protocol switch in dynamic multiprotocol telling the user what protocol RAIL has changed to as well the radio event that triggered this switch. This information is visible in Network Analyzer for better debugging of DMP applications.
- **389439:** The EFR32xG13 AoX RAIL library is no longer present as that functionality has been merged into the standard RAIL library for EFR32xG13.
- **360371:** Fixed an issue where calling [RAIL_GetTxPowerDbm](pa#rail-get-tx-power-dbm) prior to calling [RAIL_SetTxPower](pa#rail-set-tx-power) would return -500 i.e. -50dBm. As a part of the fix, we now return an invalid dBm value, [RAIL_TX_POWER_MIN](pa#rail-tx-power-min), if [RAIL_SetTxPower](pa#rail-set-tx-power) was not called before calling [RAIL_GetTxPowerDbm](pa#rail-get-tx-power-dbm) or if [RAIL_SetTxPower](pa#rail-set-tx-power) it returns an error status.
- **382575:** Added a new API [RAIL_UseDma()](general#rail-use-dma), which can be used to enhance RAIL startup speed if called before [RAIL_Init()](general#rail-init).
- **376711:** Added support for Z-Wave node ID based packet filtering via the [RAIL_ZWAVE_OPTION_NODE_ID_FILTERING](z-wave#rail-zwave-option-node-id-filtering) option.
- **386163:** Added support for the radio sending an ACK packet automatically when in Z-Wave mode as long as node ID filtering and [Auto-Ack](auto-ack) features are enabled and a packet requesting an ACK is sent to the device.

---

###### 2.6.5

- Corrected the frequencies used by Z-Wave in the China, Malaysia, and India regions to match the specification. China was using the EU frequencies, Malaysia was using 868.10 MHz, and India was not applying the required 20 kHz offset to the R1 channel.

###### 2.6.4

- Fix an issue on the EFR32xG21 where the medium power and low power PAs might not complete ramping and end up transmitting at a lower power than desired.
- Improved interoperability of the BLE 1Mbps PHY on EFR32xG13 devices.
- Improved performance of OOK PHYs.
- Updated packet trace format to include extra information for BLE packets.

###### 2.6.3

- Fixed an issue introduced in 2.6.2 where issuing a [RAIL_Idle()](state-transitions#rail-idle-1) with mode [RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](state-transitions#rail-idle-force-shutdown-clear-flags) could sometimes cause the receive FIFO to be corrupted and trigger a RAIL assert with code ([RAIL_ASSERT_FAILED_ILLEGAL_RXLEN_ENTRY_STATUS](assertions#rail-assert-failed-illegal-rxlen-entry-status)).
- Various bug fixes and improvements for the EFR32xG21 parts.

###### 2.6.2

- Updated the PA curves on the EFR32xG21 chips to slightly improve transmit power accuracy.
- Resolved an issue where [RAIL_GetChannelHoppingRssi](rx-channel-hopping#rail-get-channel-hopping-rssi) would return an RSSI value even if receive was disabled.
- Resolved an issue where [RAIL_GetChannelHoppingRssi](rx-channel-hopping#rail-get-channel-hopping-rssi) would not update the RSSI value while receiving packets.
- Resolved an issue in multiprotocol where an absolute event with a non zero slip time would always work even if scheduled in the past.

###### 2.6.1

- Resolved an issue on the EFR32xG21 platform that could cause the chip to hang when coming out of a reset if [RAIL_Idle()](state-transitions#rail-idle-1) was called at the wrong time.
- Added [RAIL_GetChannelHoppingRssi](rx-channel-hopping#rail-get-channel-hopping-rssi) API to allow the user to read the RSSI from each channel when channel hopping is enabled.
- Fixed an issue where CRC-failed packets received with [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) would be reported with [RAIL_RX_PACKET_READY_SUCCESS](receive#rail-rx-packet-ready-success) instead of [RAIL_RX_PACKET_READY_CRC_ERROR](receive#rail-rx-packet-ready-crc-error) when the [RAIL_EVENT_RX_FRAME_ERROR](events#rail-event-rx-frame-error) event isn't enabled.
- Fixed an issue on the EFR32xG21 platform that caused the chip to incorrectly compute the PA ramp time at high power levels. If this happened, the ramp time would be higher than expected and cause large delays in the [RAIL_StateTiming_t::rxToTx](rail-state-timing-t#rx-to-tx) time which is used for sending ACK packets.
- Fixed an issue on the EFR32xG21 platform that could cause erroneous Rx overflow events and failed receives when using the 125Kbps BLE coded PHY.

###### 2.6.0

- Fixed an issue causing the receive antenna to always be reported as antenna 0 when using receive antenna diversity.
- Added alternative APIs for calculating receive timestamps, which give correct results for Long-Range BLE: [RAIL_GetRxTimeFrameEndAlt](packet-information#rail-get-rx-time-frame-end-alt), [RAIL_GetRxTimePreambleStartAlt](packet-information#rail-get-rx-time-preamble-start-alt), [RAIL_GetRxTimeSyncWordEndAlt](packet-information#rail-get-rx-time-sync-word-end-alt).
- Fixed an issue where receive events could corrupt the transmit packet length in frame type based length mode if they came in between the start transmit call and the actual transmit.
- Fixed an Auto-ACK problem where ACKs were being sent for CRC error frames when [RAIL_RX_OPTION_IGNORE_CRC_ERRORS](receive#rail-rx-option-ignore-crc-errors) is in effect.
- Fixed a math error that could cause the [RAIL_CsmaConfig_t::ccaDuration](rail-csma-config-t#cca-duration) to be shorter than requested. This would happen whenever the (ccaDuration * rx_baudrate) exceeded the size of a 32 bit integer.
- Fixed an issue in the multiprotocol RAIL library where the [RAIL_GetTxPower()](pa#rail-get-tx-power) function could return the wrong output power if called with any RAIL handle other than the active one. We will now return the actual power that would be set if that protocol is active.
- Fixed the PA conversion code so that it better handles error conditions and will not trigger a fault when given NULL parameters.
- Added new API to retrieve the channel index of the most recent Beam packet accepted: [RAIL_ZWAVE_GetBeamChannelIndex](z-wave#rail-zwave-get-beam-channel-index).
- Added a new [RAIL_DelayUs()](system-timing#rail-delay-us) API for short blocking delays using the RAIL time base.
- Fixed a problem where state timings would not properly be updated when switching if both protocols used the same channel configuration structure.
- Fixed an issue on the EFR32xG14 series that prevented Rx antenna diversity from functioning properly. This was introduced in the RAIL 2.5.0 release.
- Restored pre-2.5.0 behavior with [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold) to disable threshold events from occurring when passed an rxThreshold of the FIFO's size or larger. A 2.5.0 change allowed such rxThreshold settings to cause the event to fire when the buffer became full, though it's been mis-documented as one byte away from becoming full for quite a while – something that was never actually implemented and is now removed from the documentation.
- Fixed [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx) and [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx) to return [RAIL_STATUS_INVALID_PARAMETER](general#rail-status-invalid-parameter) when passed invalid configuration parameters in their respective [RAIL_CsmaConfig_t](rail-csma-config-t) or [RAIL_LbtConfig_t](rail-lbt-config-t), whose documentation has been updated accordingly. In earlier releases the requested operation would proceed with an invalid or incomplete hardware configuration, resulting in undefined behavior.

---

###### 2.5.1

- Worked around a BLE longrange problem where Rx abort could cause deafness.

###### 2.5.0

- Added a channel hopping feature with [RAIL_ConfigRxChannelHopping](rx-channel-hopping#rail-config-rx-channel-hopping) and [RAIL_EnableRxChannelHopping](rx-channel-hopping#rail-enable-rx-channel-hopping). This feature allows users to specify a list of channels to scan over during receive. This feature allows for much faster scanning with less delay (about 100us) than simply repeatedly calling [RAIL_StartRx()](receive#rail-start-rx) with different channels.
- Included two default transmit power curves in the library: RAIL_TxPowerCurvesDcdc and RAIL_TxPowerCurvesVbat. When the pa-conversions plugin is used, one of these can be passed to the plugin, based on the way the power amplifier is powered.
- Added the ability to specify a Link Quality Indicator (LQI) conversion callback with [RAIL_ConvertLqi](receive#rail-convert-lqi) such that the hardware's LQI value can be changed before application consumption of that value.
- Fixed an issue where [RAIL_StopTxStream()](diagnostic#rail-stop-tx-stream) was taking an extended amount of time to complete.
- Certain received packet details in [RAIL_RxPacketDetails_t](rail-rx-packet-details-t), which were formerly available only for successfully received packets, are now also available for unsuccessfully received packets.
- [RAIL_DataMethod_t](data-management#rail-data-method-t) and related documentation have been updated to reflect that many FIFO_MODE concepts can now be used in PACKET_MODE, and the distinction between these modes has become nearly invisible for transmit. Also eliminated the previous restriction that both receive and transmit [RAIL_DataMethod_t](data-management#rail-data-method-t) must match in the [RAIL_DataConfig_t](rail-data-config-t) passed to [RAIL_ConfigData()](data-management#rail-config-data).
- [RAIL_ConfigData()](data-management#rail-config-data) no longer resets the receive FIFO when switching to [RAIL_DataMethod_t::FIFO_MODE](data-management#fifo-mode).
- Added a new [RAIL_TxOptions_t](transmit#rail-tx-options-t) option [RAIL_TX_OPTION_CCA_PEAK_RSSI](transmit#rail-tx-option-cca-peak-rssi) to allow the user to use the peak RSSI instead of the average RSSI over the CCA period during CSMA and LBT transmits. This is only supported on EFR32xG12 and newer silicon.
- Added a new [RAIL_TxOptions_t](transmit#rail-tx-options-t) option [RAIL_TX_OPTION_ALT_PREAMBLE_LEN](transmit#rail-tx-option-alt-preamble-len) to allow the user to transmit with a runtime-specified preamble length. This alternate preamble length is set with [RAIL_SetTxAltPreambleLength](transmit#rail-set-tx-alt-preamble-length).
- Added [Z-Wave](z-wave) PHY configurations and functionality to the RAIL library.
- Fixed an issue that could cause register corruption in very rare conditions due to a bus access race condition. The specific registers impacted were limited to those related to the radio and the corruption was most likely when running the coherent IEEE802.15.4 PHY on the EFR32xG12 and EFR32xG13 platforms. On other platforms and PHY configurations the issue is possible though very unlikely and never observed (id: 317234).
- Resolved a multiprotocol scheduler issue that could cause some interrupted events to not be reported to the caller. Since these events never run there are no other related events either so state machines relying on RAIL events could get stuck in invalid states (id: 341124).
- Enhanced [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold) and [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold) to now support a threshold value of [RAIL_FIFO_THRESHOLD_DISABLED](data-management#rail-fifo-threshold-disabled) to explicitly disable a threshold previously established.
- Fixed a documentation issue where a variety of RAIL APIs were incorrectly shown as "Referenced by RAIL_CopyRxPacket()".

---

###### 2.4.1

- Fixed an issue with [RAIL_Sleep()](sleep#rail-sleep) that could cause the wake event to be set very far in the future. This would prevent waking at the proper time and cause problems for the application.
- Fixed an issue in the multiprotocol library where the txToRxSearch time set by [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing) would be lost after a protocol switch if there were no timings stored in the channel configuration.
- Fixed an issue preventing radio coexistence transmit abort counter from incrementing.
- Fixed radio coexistence HAL_CONFIG support for shared priority and shared request.

###### 2.4.0

- Added ability to set custom receive FIFO sizes via the [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo) function. The new [RAILCb_SetupRxFifo()](data-management#rail-cb-setup-rx-fifo) callback may be used to override the default FIFO initialization to save RAM.
- Added alternate functions to get packet details, in a way that helps lower code size: [RAIL_GetRxPacketDetailsAlt()](packet-information#rail-get-rx-packet-details-alt) and [RAIL_GetTxPacketDetailsAlt()](transmit#rail-get-tx-packet-details-alt). These come with functions to adjust the returned time stamp to different places in the packet: [RAIL_GetRxTimePreambleStart()](packet-information#rail-get-rx-time-preamble-start), [RAIL_GetRxTimeSyncWordEnd()](packet-information#rail-get-rx-time-sync-word-end), [RAIL_GetRxTimeFrameEnd()](packet-information#rail-get-rx-time-frame-end), [RAIL_GetTxTimePreambleStart()](transmit#rail-get-tx-time-preamble-start), [RAIL_GetTxTimeSyncWordEnd()](transmit#rail-get-tx-time-sync-word-end), and [RAIL_GetTxTimeFrameEnd()](transmit#rail-get-tx-time-frame-end).
- Broke up the IR calibration code to save code size for Zigbee and BLE where the results are stored on chip.
- Added a new [RAIL_SetRssiOffset()](receive#rail-set-rssi-offset) command to offset all RSSIs used by RAIL to match any hardware offsets on a given board.
- Added a new [RAIL_StopTx()](transmit#rail-stop-tx) function to stop only pending or current transmits without impacting receive.
- For multiprotocol, added the ability to update a task's priority after it started with [RAIL_SetTaskPriority()](multiprotocol#rail-set-task-priority).
- Added the ability to pre-apply a radio configuration to hardware before a TX or RX operation begins via [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel).
- Added the ability to query RAIL for the channel configuration currently configured for use via [RAIL_GetChannel()](radio-configuration#rail-get-channel).
- Fixed an issue where relative tasks with a non-zero slip time could start a few hundred microseconds earlier than they were supposed to.
- Fixed an issue that could cause antenna diversity to not function correctly.
- Fixed an issue where [RAIL_Idle()](state-transitions#rail-idle-1) with [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown) could cause an erroneous [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) event to fire.

###### 2.3.1

- Fixed one case where calling [RAIL_Idle()](state-transitions#rail-idle-1) with the mode set to [RAIL_IDLE_FORCE_SHUTDOWN](state-transitions#rail-idle-force-shutdown) could cause us to output partial packet trace appended information.
- Deferred multiprotocol event failures until just before the event must start when the expected runtime of a task causes it to not fit. These were previously reported immediately even though future tasks could change.

---

###### 2.3.0

- Added a [RAIL_CopyRxPacket()](packet-information#rail-copy-rx-packet) helper for use after [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info).
- Added a fast, but inconsistent, transition times mode. This can be activated by setting state timings to 0.
- Resolved a potential receive FIFO corruption that could occur when calling [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet) or [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet).
- A multi-timer API was added that allows for multiple software timers all driven off the one hardware timer. This must be explicitly enabled and will use more code than the standard APIs, but can be done through [RAIL_ConfigMultiTimer()](system-timing#rail-config-multi-timer). Once in use, all timer APIs must use the multi timer versions to prevent conflicts with the hardware timer.
- Added diagnostic functions [RAIL_Verify()](diagnostic#rail-verify) and [RAIL_ConfigVerification()](diagnostic#rail-config-verification) to provide a means of verifying internal radio memory contents.
- Added alternative calibration APIs to RAIL_Calibrate, for potential code size savings: RAIL_CalibrateTemp, RAIL_CalibrateIr, and RAIL_ApplyIrCalibration.
- Fixed an issue where requesting a small fixed CSMA backoff could result in a very large value from being selected instead.
- Made PHY configuration improvements for BLE and Zigbee on the efr32xg14 platform.

---

###### 2.2.0

- In FIFO mode on the EFR32 the FIFO could only be read after 8 bytes were received. This restriction has now been lifted though the user must be careful and understand that in certain cases they could be reading appended information and not packet bytes.
- On the EFR32XG14 some BLE packets showed up with invalid timestamps. These are now filtered and reported as aborted to the user so that the stack does not time sync to an invalid timestamp and lose the connection.
- Fixed an issue where state transition times would not be recomputed when changing the PA ramp time on the fly.
- Fixed a regression in 2.1.1 that caused Frame Type based length configurations to lock up the receiver. There was an issue where bits in the byte that were not supposed to be a part of the frame type were being included some times and could cause problems in the receive processing logic.
- Prevented [RAIL_StartRx()](receive#rail-start-rx) from resetting the receive FIFO. This was a legacy feature that was not documented and, though it generally worked, would cause problems to users processing deferred receive events or users that called [RAIL_StartRx()](receive#rail-start-rx) in an interrupt disabled context. If this behavior was required it can be replicated by idling the radio and then calling [RAIL_ResetFifo()](data-management#rail-reset-fifo) with rxFifo set to true before any calls to [RAIL_StartRx()](receive#rail-start-rx).
- Fixed an issue in the [RAIL_IEEE802154_SetAddresses()](ieee802-15-4#rail-ieee802154-set-addresses) function that caused it to never set any long address except for the first one and to set that one to the value given in the final long address entry.
- Updated the documentation for the IEEE 802.15.4 and BLE protocol functions to show properly usage with the new RAIL 2.0 API.
- Dynamic Multiprotocol fixes:  
  - Added support for each protocol having auto ACK enabled by allocating space for independent ACK buffers.  
  - Ensured that the sync word is properly output in BLE Long Range no matter when the packet data is loaded into the transmit FIFO.  
  - Prevented the sync word in packet trace feature from being turned on in Zigbee when it's enabled by BLE.

---

###### 2.1.2

- Removed unimplemented functions RAIL_GetActiveChannelConfig() and RAIL_GetActiveChannelConfigEntry().

###### 2.1.1

- [RAIL_PauseTxAutoAck()](auto-ack#rail-pause-tx-auto-ack) was internally pausing the Rx AutoAck logic. This has now been corrected.
- EFR32XG12 and EFR32XG13 devices were detecting a high number of false 15.4 sync words. Even though these packets were eventually filtered they would show up on PTI. In 2.1.1 there should be significantly fewer of these packets as some of this was caused by a bug in a configuration algorithm.
- Channel power limits for BLE PHYs were not always being respected. This could have caused us to use a power which might result in certification issues.
- The [RAIL_StateBuffer_t](general#rail-state-buffer-t) type was incorrectly sized resulting in a waste of RAM for RAIL applications. This has now been trimmed down to the actual size required.

###### 2.1.0

- Packet receive APIs were totally revamped to allow faster and out-of-order deferred processing of received packets and their data outside of interrupt/callback context. Gone are RAIL_GetRxPacketHandle(), RAIL_ReadRxFifoAppendedInfo(), and the memory management RAILCb_ callbacks, replaced with [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info) that provides pointers directly to the received data held in RAIL's internal receive FIFO buffer allowing for zero-copy operation. See other RAIL 2.x porting documentation and new routines [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info), [RAIL_GetRxPacketDetails()](packet-information#rail-get-rx-packet-details), [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet), and [RAIL_ReleaseRxPacket()](receive#rail-release-rx-packet), along with updated [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet) and [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo) behavior.
- On the transmit side, zero-copy is also now supported by allowing applications to specify their own buffers for the transmit FIFO, eliminating RAIL's former internal fixed-size 512-byte one. See new [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo).
- The former RAIL_LoadTxData() has been merged into an updated [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo) API.
- The RAIL_Event_t type was renamed [RAIL_Events_t](events#rail-events-t) now that multiple events can be presented to the application simultaneously in RAIL's generic events callback, rather than relying on the internal arbitrary order that RAIL imposed previously, which may not match the application's or protocol's expectations.
- Event/callback configuration is now managed entirely by [RAIL_ConfigEvents()](events#rail-config-events), eliminating the old RAIL_ConfigTx() and RAIL_SetCallbackConfig() APIs.
- Channel numbers were increased in range from 8 bits to 16 bits, and channel configurations made much more flexible allowing for multi-band radio configurations and an easy way to specify TX power limits on certain channels that otherwise share a common configuration. See new APIs RAIL_GetActiveChannelConfig() and RAIL_GetActiveChannelConfigEntry() along with changes to [RAIL_ConfigChannels()](radio-configuration#rail-config-channels).
- Power levels were given a formal [RAIL_TxPowerLevel_t](pa#rail-tx-power-level-t) type, and [RAIL_SetTxPower()](pa#rail-set-tx-power) now returns a [RAIL_Status_t](general#rail-status-t) not the power level actually achieved – must now use [RAIL_GetTxPower()](pa#rail-get-tx-power) to get that.
- PA power curves and the conversion between RAIL power level and dBm have been fully abstracted to live outside of RAIL, allowing customers complete flexibility to characterize their designs and PA selection. See new APIs [RAIL_ConfigTxPower()](pa#rail-config-tx-power), [RAIL_ConvertDbmToRaw()](pa#rail-convert-dbm-to-raw), [RAIL_ConvertRawToDbm()](pa#rail-convert-raw-to-dbm), [RAIL_GetTxPowerConfig()](pa#rail-get-tx-power-config), [RAIL_GetTxPowerDbm()](pa#rail-get-tx-power-dbm), [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm), and [RAIL_EnablePaCal()](calibration#rail-enable-pa-cal).
- Protocols using Frame Types to determine packet length are better integrated into the Studio radio configurator and channel configuration. Gone are APIs like RAIL_ConfigFrameTypeLength() and RAIL_EnableAddressFilterByFrameType() whose functionality is now subsumed within channel configurations.
- APIs to support RAIL timebase synchronization across sleep/wake were added: [RAIL_ConfigSleep()](sleep#rail-config-sleep), [RAIL_Sleep()](sleep#rail-sleep), and [RAIL_Wake()](sleep#rail-wake).
- State transitions for success and error are now encapsulated in a new [RAIL_StateTransitions_t](rail-state-transitions-t) structure. This affected the [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions) and [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) routines.
- The former RAIL_EVENT_TX_BUFFER_UNDERFLOW has been broken out into non-ACK ([RAIL_EVENT_TX_UNDERFLOW](events#rail-event-tx-underflow)) and ACK ([RAIL_EVENT_TXACK_UNDERFLOW](events#rail-event-txack-underflow)) flavors like the other transmit completion events.
- Diagnostic toning APIs were merged into the streaming APIs as the [RAIL_StreamMode_t::RAIL_STREAM_CARRIER_WAVE](diagnostic#rail-stream-carrier-wave).
- [RAIL_ConfigCal()](calibration#rail-config-cal) was revamped to use [RAIL_CalMask_t](calibration#rail-cal-mask-t).
- [RAIL_Calibrate()](calibration#rail-calibrate)'s bool calSave argument was removed, being redundant with a NULL vs. non-NULL calValues argument.
- Support for Packet Traffic Arbitration (PTA) or Coexistence was added in the form of an API to prevent transmits from going on the air: [RAIL_EnableTxHoldOff()](transmit#rail-enable-tx-hold-off), along with [RAIL_IsTxHoldOffEnabled()](transmit#rail-is-tx-hold-off-enabled) to check the current state.
- The former RAIL_AutoAckDisable() was merged into [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack) by means of its [RAIL_AutoAckConfig_t::enable](rail-auto-ack-config-t#enable) parameter field.
- The former RAIL_EnableRxFifoThreshold() was replaced by using [RAIL_ConfigEvents()](events#rail-config-events) to enable/disable the [RAIL_EVENT_RX_FIFO_ALMOST_FULL](events#rail-event-rx-fifo-almost-full) event.
- The former blocking RAIL_PollAverageRssi() was eliminated; use the non-blocking [RAIL_StartAverageRssi()](receive#rail-start-average-rssi) instead.
- Several APIs were renamed for consistency and updated accordingly:  
  - former RAIL_GetTxPacketInfo() is now [RAIL_GetTxPacketDetails()](transmit#rail-get-tx-packet-details);  
  - former RAIL_UseTxBufferForAutoAck() is now [RAIL_UseTxFifoForAutoAck()](auto-ack#rail-use-tx-fifo-for-auto-ack);  
  - former RAIL_LoadAutoAckBuffer() is now [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo).
- More API functions were updated to take a [RAIL_Handle_t](general#rail-handle-t) argument: [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset), [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset), and the [RAIL_IEEE802154_ protocol](ieee802-15-4) APIs.
- [RAIL_IEEE802154_GetAddress()](ieee802-15-4#rail-ieee802154-get-address) was updated to return [RAIL_Status_t](general#rail-status-t) rather than [RAIL_IEEE802154_Address_t](rail-ieee802154-address-t) which is now passed as an output argument.
- [RAIL_EnableDirectMode()](diagnostic#rail-enable-direct-mode) and [RAIL_SetTune()](diagnostic#rail-set-tune) now return [RAIL_Status_t](general#rail-status-t) rather than void.
- A multiprotocol scheduler API was added to get its status: [RAIL_GetSchedulerStatus()](multiprotocol#rail-get-scheduler-status).
- The [RAILCb_AssertFailed()](assertions#rail-cb-assert-failed) callback returns with a [RAIL_Handle_t](general#rail-handle-t) parameter that might be NULL since assert conditions might occur during initialization prior to handle assignment or during multiprotocol switching.
- Many APIs with pointer arguments were clarified to use const pointers where the API doesn't modify the data pointed to.

---

###### 2.0.0

- All API names were updated to follow a strictly VerbNoun convention.
- RAIL_SetAbortScheduledTxDuringRx() is no longer a separate API, rather it was added to [RAIL_ScheduleTxConfig_t](rail-schedule-tx-config-t). Set the desired TX during RX behavior when that struct is passed to [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx).
- Add support for building single-prototocol, multi-protocol, and core RAIL libraries.
- Changed [RAIL_RadioState_t](state-transitions#rail-radio-state-t) to a bitmask. Supported [RAIL_RadioState_t](state-transitions#rail-radio-state-t) bits are: [RAIL_RF_STATE_ACTIVE](state-transitions#rail-rf-state-active), [RAIL_RF_STATE_RX](state-transitions#rail-rf-state-rx), and [RAIL_RF_STATE_TX](state-transitions#rail-rf-state-tx); combinations of these bits yield the additional states [RAIL_RF_STATE_INACTIVE](state-transitions#rail-rf-state-inactive), [RAIL_RF_STATE_IDLE](state-transitions#rail-rf-state-idle), [RAIL_RF_STATE_RX_ACTIVE](state-transitions#rail-rf-state-rx-active), and [RAIL_RF_STATE_TX_ACTIVE](state-transitions#rail-rf-state-tx-active).
- Added [RAIL_RX_OPTION_TRACK_ABORTED_FRAMES](receive#rail-rx-option-track-aborted-frames) to configure seeing full packets via Packet Trace, even after they have been aborted.
- Added RAIL 15.4 PTI Rx error code UNDESIRED_ACK to indicate an ACK filtered because it did not have the desired sequence number matching that in the recently-transmitted ACK-requesting frame.
- Updated return type from uint8_t to [RAIL_Status_t](general#rail-status-t) for many functions.
- Removed deprecated bit error-rate APIs RAIL_BerConfigSet(), RAIL_BerRxStart(), RAIL_BerRxStop(), RAIL_BerStatusGet(), along with deprecated types RAIL_BerConfig_t and RAIL_BerStatus_t.
- TX related events are now broken out to specify whether the event is relevant to an ACK packet or user-initiated TX. Specifically those are [RAIL_EVENT_TX_ABORTED](events#rail-event-tx-aborted) and [RAIL_EVENT_TXACK_ABORTED](events#rail-event-txack-aborted), [RAIL_EVENT_TX_BLOCKED](events#rail-event-tx-blocked) and [RAIL_EVENT_TXACK_BLOCKED](events#rail-event-txack-blocked), and [RAIL_EVENT_TX_PACKET_SENT](events#rail-event-tx-packet-sent) and [RAIL_EVENT_TXACK_PACKET_SENT](events#rail-event-txack-packet-sent). One of each type (i.e. one ACK, one non-ACK) can occur before being handled.
- [RAIL_StartTx()](packet-tx#rail-start-tx) no longer takes a pre-TX operation function pointer to do scheduled or CCA transmits. Instead, there are now separate APIs for each type of transmit: [RAIL_StartTx()](packet-tx#rail-start-tx), [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx), [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx), [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx).
- [RAIL_TxOptions_t](transmit#rail-tx-options-t) has been converted to a 32-bit bitmask, so that RX and TX options are both represented as bitmasks. A single TX option mask is passed into each TX call.
- [RAIL_ConfigEvents()](events#rail-config-events) now also takes two bitmasks, one to indicate which events should be affected, and the second indicating which of those events should be enabled.
- Similarly, [RAIL_ConfigRxOptions()](receive#rail-config-rx-options) takes two bitmasks, one to indicate which options to update, and the second indicating the desired value of those options, which affect all future receives.
- Options for removing RX appended info and ignoring CRC are now controlled exclusively by [RAIL_ConfigRxOptions()](receive#rail-config-rx-options).

---

###### 1.6.1

- Added new BLE radio configurations for EFR32xG13 parts to fix a transmit overshoot issue on the coded PHY configurations for BLE Long Range.
- Fixed DCDC voltage droop during RAIL_RfInit()
- Added an API ([RAIL_EnablePaCal()](calibration#rail-enable-pa-cal)) that enables loading of chip to chip PA calibration data.

###### 1.6.0

- Fixed an issue where RAIL_RfStateGet() would mistakenly return RAIL_RF_STATE_IDLE instead of RAIL_RF_STATE_TX when a Transmit operation's LBT is active.
- Added an API (RAIL_SetAbortScheduledTxDuringRx) that sets the behavior when a scheduled TX fires during an RX or ACK. If the API is passed false, TX's will be delayed until the RX (or ACK to the RX) is complete. That behavior is the default and what always happened previously. Passing the function true however will abort scheduled TX's that fire during the RX (or ACK to the RX) and fire the RAILCb_TxRadioStatus callback.
- Added new RAILCb_AssertFailed callback to give the flexible handling of asserts within RAIL. This includes defines of assert codes and error reasons in [rail_assert_error_codes.h](rail-assert-error-codes-h). The default implementation hangs in an infinite loop.
- Added RAIL_ENUM define to override enum size ambuiguity in the ARM EABI by making them actually a uint8_t. For documentation purposes they are still shown as enums.
- Added new TX options: removeCrc, to override whether CRC is sent; and syncWordId, to choose which SYNC word to transmit when multiple SYNC words are configured.
- Added new RX option: RAIL_RX_OPTION_ENABLE_DUALSYNC, which allows multiple SYNC words to be searched for on PHYs that support it.
- Added RAIL_PeekRxPacket to allow reading part of a packet before it has been fully received.
- Changed BER Test functionality in RAILTest such that if a RX overflow is detected (due to the incoming datarate being too high), the test now aborts and displays an appropriate status message.
- Fixed an issue where the code could hang in a RX overflow state when receiving incoming data streams.
- RAIL_TxToneStart() and RAIL_TxStreamStart() now idle the radio before transmitting.
- Fixed an issue where calling RAIL_TimerSet() while in the middle of a stream or tone transmission could lock up the radio.
- Added new frequency offset related functions, RAIL_GetRxFreqOffset and RAIL_SetFreqOffset, and the associated RAIL_FrequencyOffset_t type definition.

---

###### 1.5.2

- Fixed an issue in 1.5.1 that would cause scheduled receive, scheduled transmit, and RAIL timer operations to fail on EFR32xG12 with a relative delay of 0.
- Fixed an issue in 1.5.1 that would cause scheduled receive and scheduled transmit to fail if called with an absolute time from [0, rxWarmTime) or [0, txWarmTime) respectively.
- Fixed an issue where a failed scheduled transmit operation would prevent any transmit from succeeding until RAIL_RfIdle() or RAIL_RfIdleExt() were called.
- Fixed an issue in 1.5.1 where calling idle while looking for an ACK could cause the radio to get stuck in the receive state.

###### 1.5.1

- Added official support for the EFR32xG12 parts through a new librail_efr32xg12.a version of the library.
- Added RAIL_SetRxOptions API for configuration of receive options, such as RAIL_RX_OPTION_STORE_CRC.
- Increase transmit and receive fifo sizes to 512 bytes for all EFR32xG1 parts. This impacts both packet and fifo modes.
- Added [RAIL_RxDataSource_t::RX_DEMOD_DATA](data-management#rx-demod-data) in order to receive demodulated data via FIFO method.
- Shortened the duration that the transmit buffer lock in RAIL_TxDataLoad() is held, as it was overprotective. RAIL will still report an error if the application attempts to manipulate the transmit buffer while actively transmitting data.
- Improved state transition timings for enhanced precision and accuracy. To improve precision we have switched to a more stable receive complete event since our previous trigger could jitter for certain radio configurations. To improve accuracy we measured and removed PHY specific overhead for BLE applications. Note that this measurement was BLE specific and does **not** completely correct accuracy on any arbitrary PHY configuration. For custom PHY configurations you will still have to manually calibrate out any offsets by measurement and any previous measurements are likely different now.
- Moved BER test implementation out of the RAIL library and into RAILTest. Deprecated the existing BER test functions in the RAIL API. With BER test code now existing in RAILTest, you must use version 2.2.1 or later of the radio configurator.
- Disabled receive buffer overflow and transmit buffer underflow as BUFC_IRQHandler() events. These events now only occur in FRC_IRQHandler().
- Sped up RAIL transmit and receive buffer read/write operations.
- Fixed a race condition that could cause the receive packet callback to be delayed until the next receive packet event.

###### 1.5.0

- Added other methods of [Data Management](data-management). The application can configure RAIL to provide/retrieve data via FIFO method.
- The new FIFO method of data management brings with it two new callbacks: RAILCb_TxFifoAlmostEmpty(), and RAILCb_RxFifoAlmostFull(). Note that you must implement these new callbacks or stub them out if you do not intend to use them.

---

###### 1.4.2

- Fixed a bug in how we handled IEEE 802.15.4 data request packets. Specifically, we were not issuing the RAILCb_IEEE802154_DataRequestCommand() callback for data request packets that were sent with MAC security enabled.
- Fixed a bug where calling RAIL_TxDataLoad() at an inopportune time could cause that and all subsequent such calls to fail.

###### 1.4.1

- Implemented LQI measurement. The field in RAIL_AppendedInfo_t is now populated on every packet receive.
- Allow transmit while receive is active, if the channel is the same. After transmitting, the radio will follow the configured state transitions as before.
- Allow shorter ccaBackoff times if receive is active during the CSMA or LBT process.
- Allow calling RAIL_RxConfig while receiving.
- Added new receive event: RAIL_RX_CONFIG_PACKET_ABORTED
- Added new RAIL_TxConfig API, along with more transmit events: RAIL_TX_CONFIG_CHANNEL_CLEAR, RAIL_TX_CONFIG_CCA_RETRY, RAIL_TX_CONFIG_START_CCA
- Fixed a filtering bug in the IEEE 802.15.4 code. We were incorrectly filtering packets with a 0xFFFF source PANID while the coordinator which caused problems in the joining process. The new logic will only use the source PANID for filtering if we are the coordinator, there is no destination address, and the frame type is MAC command or Data.
- Migrated to Gecko SDK 5.0, including the new em_core APIs for interrupt enabling and disabling. This adds required dependencies on the CORE_EnterCritical() and CORE_ExitCritical() functions.
- Added new RSSI functions for hardware and software averaging: RAIL_StartAverageRSSI(), RAIL_GetAverageRSSI(), RAIL_AverageRSSIReady(), RAIL_PollAverageRSSI().
- Added new RSSI callback: RAILCb_RssiAverageDone().
- Added the ability to switch between multiple BLE phys, including 2Mbps phys, on chips that support the new phys.

###### 1.4.0

- Added support for the EFR32MG12P part family with larger RAM and Flash size variants along with some new chip features.
- Renamed anything that was just efr32 in the previous releases to efr32xg1 to differentiate it from the new efr32xg12 family of parts.
- Add support for the new BLE 2MBit PHY to the BLE acceleration and configuration APIs on EFR32xG12 chips.
- Better optimize IR Calibration run times for all EFR32xG1 parts. You must use version 0.69 or later of the radio configurator.

---

###### 1.3.2

- Added [RAIL_SetPtiProtocol()](pti#rail-set-pti-protocol) and [RAIL_PtiProtocol_t](pti#rail-pti-protocol-t). This function allows the application to configure RAIL's packet trace interface to output protocol specific data.
- Fix BER functions to operate at 1Mbps data rates.
- RAIL_RfIdle() does not clear the transmit buffer anymore. RAIL_TxDataLoad() resets the transmit buffer with every packet set. This fixes the case where RAIL_RfIdle() is called after RAIL_TxDataLoad().
- Fixed bug when using fixed packet lengths configured via the Radio Configurator. RAIL_TxStart() will not overwrite the configured fixed length to the amount of data loaded by RAIL_TxDataLoad().
- Fixed bug in RADIO_PA_Init() where ramp times greater than 11.2 ms would be truncated to a very short ramp.

###### 1.3.1

- Added IEEE 802.15.4 hardware acceleration. The new APIs can be found in [protocol/ieee802154/rail_ieee802154.h](rail-ieee802154-h). Documentation for these APIs can be found in [IEEE 802.15.4](ieee802-15-4). This includes a new callback: RAILCb_IEEE802154_DataRequestCommand().
- Added Auto Ack hardware acceleration. Documentation for these APIs can be found in [Auto-Ack](auto-ack).
- Added RAIL_TxStartWithOptions(). This new API takes a pointer to [RAIL_TxOptions_t](transmit#rail-tx-options-t) that contains options to modify the upcoming transmit.
- Increased minimum state transition time to 100 us.
- Added [RAIL_STATUS_INVALID_CALL](general#rail-status-invalid-call)
- Added RAIL_AppendedInfo_t::isAck

###### 1.3.0

- Added BLE hardware acceleration. The new APIs can be found in [protocol/ble/rail_ble.h](rail-ble-h). Documentation for these APIs can be found in [BLE](ble).
- Added [RAIL_ScheduleRx()](receive#rail-schedule-rx) and [RAIL_ScheduleRxConfig_t](rail-schedule-rx-config-t). This allows the application to schedule a RX window using the RAIL timebase.
- Added [RAIL_TIME_DISABLED](system-timing#rail-time-disabled) enum to [RAIL_TimeMode_t](system-timing#rail-time-mode-t).
- Added an extended idle function which gives you more control of how the radio is idled. See RAIL_RfIdleExt() and RAIL_RfIdleMode_t for more details.
- Added RAIL_RX_CONFIG_TIMEOUT and RAIL_RX_CONFIG_SCHEDULED_RX_END
- Added RAIL_TX_CONFIG_TX_ABORTED and RAIL_TX_CONFIG_TX_BLOCKED
- Added an extended radio status callback that supports up to 32 different status reasons (RAILCb_RxRadioStatusExt()). You may implement this instead of RAILCb_RxRadioStatus() or continue using the old version if you do not need access to more than the first 8 status values.

---

###### 1.2.7

- Added FEM control signals
- Added RAIL_SetPaCTune in order to tune the PA capacitor value for TX and RX.
- Fix typo in RAIL_StreamMode_t : PSUEDO_RANDOM_STREAM to PSEUDO_RANDOM_STREAM

###### 1.2.6

- Added ability to reset demod.

###### 1.2.5

- Fixed register settings for BER testing.
- Fixed packet buffer for contents larger than 170 bytes.

###### 1.2.4

- Presented worst case RfSense wake period

###### 1.2.3

- Optimized address filtering code for operation at higher data rates.
- Clarified data rate limitations of address filtering.

###### 1.2.2

- Added [RAIL_SetTime()](system-timing#rail-set-time) in order to allow the user to change the RAIL timebase with microsecond granularity.
- Removed spurious calls to RAIL_RxRadioStatus() with the RAIL_RX_CONFIG_BUFFER_OVERFLOW argument, which were happening when receive was aborted due to events such as address filtering failures.
- Fixed incorrect PA output power calculations.

###### 1.2.1

- Allow RAIL_RxStart() and RAIL_TxStart() to not error if the radio is heading to idle after a call to RAIL_RfIdle(). Application code does not have to wait until the radio is completely idle before calling a receive or transmit operation as long as the radio is heading to idle.

###### 1.2.0

- Fixed IR calibration such that calibration values are more accurate for radio configurations with datarates below 10Kbps.
- Fixed IR calibration such that the default calibration value is applied when a better calibration value is unable to be calculated.
- Added RAIL_CalInit() for calibration initialization.
- Added BER test API and structures for diagnostic use - RAIL_BerConfigSet(), RAIL_BerRxStart(), RAIL_BerRxStop(), RAIL_BerStatusGet(), RAIL_BerConfig_t, RAIL_BerStatus_t.
- Enabled DC Calibration during initialization.

---

###### 1.1.1

- Fixed CCA timing to prevent invalid CCA failures when starting out of IDLE state.
- Fixed RX state transitions to TX when ignoring CRC errors. Will properly take the success route when a CRC error occurs while ignoring CRC errors.
- Fixed TX error state transition after CCA failure.

###### 1.1.0

- RAIL_RX_CONFIG_INVALID_CRC changed to RAIL_RX_CONFIG_FRAME_ERROR  
  - This now accurately represents the callback flag.  
  - A frame error is either an invalid crc, a frame coding error, or a variable length error. On detection of a frame error, the radio will proceed to the defined error state.
- [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions) and [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions) APIs added  
  - Add ability to configure radio to automatically to transition to a given radio state on completion of a receive or transmit event.
- [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing) API added  
  - State transition times can be configured. The given timestamps will not perfectly match on-air times, due to the RX and TX chain delays, which are dependent on the radio configuration.
- RAIL_AddressFilterByFrameType() added  
  - If address filtering and frame type length decoding are both enabled, this gives the ability to enable or disable address filtering per frame type

###### 1.0.0

- Return quarter dBm resolution from RAIL_RxGetRSSI(). This changes the return value to an int16_t from an int8_t.
- Added calibration APIs ([Calibration](calibration))  
  - The RAIL library will notify the application via callback, RAILCb_CalNeeded(), whenever it detects a calibration is needed.  
  - An API is provided allowing the application to choose when to calibrate the radio, to pass in a known calibration value, or force a calibration to occur.
- RAIL_TxPowerSet() returns the power level that can be set which might not match the requested power level.

---

###### Beta 1 - November 16, 2015

- Exposed EFR32 RF Energy Sensing capability via a RAIL API.  
  - This functionality allows the radio to be woken from sleep by a large amount of energy over the air.
- Added new RAIL Timer APIs ([System Timing](system-timing))  
  - This provides access to a hardware timer running at the RAIL timebase. You can use this to implement simple protocol timing that may be needed by your low level radio code.  
  - This change also adds a new RAILCb_TimerExpired() that must be implemented by your application.
- Added APIs to access the bit rate and symbol rate for the current PHY (RAIL_BitRateGet(), RAIL_SymbolRateGet()).
- Cleaned up RAIL type names so that they all begin with the RAIL_ prefix. This will require updates to existing application code.
- Initial integration with Simplicity Studio's application builder tools

###### Alpha 2 - September 14, 2015

- Filtering of receive packets based on defined address fields and compare values. See [Address Filtering](address-filtering) for more details.
- Added different Pre-Transmit options for the Tx function.  
  - Scheduling of packet transmission at an absolute time or after a defined delay.  
  - Packet transmission conditional on Clear Channel Assessment (CSMA, LBT).
- The ability to read RSSI manually with RAIL_RxGetRSSI().
- Support for building RAIL applications using both GCC and IAR toolchains.

###### Alpha 1

- Initial release with support for transmit receive and basic radio configuration.

#### RAILtest Changelist

###### RAIL 3.1.x:

- **1529962:** Fixed issue where railtest and sl_rail_test could silently ignore attempts to select coexistence optimized PHY configurations on non-Series 1 devices. These CLI commands now report a runtime error for unsupported devices.
- **1579758:** Changed sl_rail_test repeated transmit behavior so a transmit using wait-for-ACK does not schedule the next transmit until the ACK is received or times out. The previous behavior can be restored with the new optional setTxDelay parameter to schedule on transmit completion.
- **1622188:** Updated setEventConfig and printEvents commands in sl_rail_test to display enabled events and use a more readable low/high 32-bit event mask format.

###### RAIL 2.18.x:

- **1321076:** Fixed an issue with setDebugSignal railtest command that broke DOUT and DCLK signals.
- **1419786:** Updated Wi-SUN mode switch channel mask for BZ band in RAILTEST on the EFR32xG25 part.

###### RAIL 2.16.x:

- **1175616:** Added support for RAILTEST on the MGM240x modules.
- **1185980:** Added support for channel masks during Wi-SUN mode switch in RAILTEST application on the EFR32xG25.

###### RAIL 2.15.x:

- **1103500:** When printRxErrors is in effect, erroneous packets now show RSSI and any erroneous payload received when Rx FIFO mode is used.
- **1105873:** RAILtest now displays board name (if known) on bootup.

###### RAIL 2.13.x:

- **825100:** Added a clearer error message when setRssiOffset is used and the radio is not idle.
- **828171:** Added support for all types of line endings to the sweepTxPower command to prevent situations where advancing to the next power level could trigger twice in a row.
- **845292:** Added resetCause (in hex) to railtest's bootup display.

###### RAIL 2.12.x:

- **721006:** Any pin on ports A, B, C, or D can now be selected to use as a debug signal in railtest using the setDebugSignal command.

###### RAIL 2.11.x:

- **679427:** Altered RAILtest to allow for more dependencies to be removed - antenna diversity, RF path, CLI, CLI RAM storage, CLI delay.
- **689827:** Fixed a hanging issue caused by Rx channel hopping being enabled without a successful Rx channel hopping configuration. This was previously a recommended practice but is now required.
- **700831:** RAILtest sleep command again allows distinguishing energy modes 4h and 4s.
- **712345:** Added additional bootup messages to RAILtest showing radio, system, and PTI configuration information.
- **737886:** Fixed the help text for the setTimings command which had the order swapped for the rxToTx and txToRx time parameters.

###### RAIL 2.10.x:

- **605067:** The SL_RAIL_TEST_PER warning has been removed from RAILtest when a PER pin is not configured for use.

###### RAIL 2.9.x:

- **381485:** Added `configChannelHoppingMulti` command for pre-configuring channel hopping multi-sense mode parameters prior to issuing `configRxChannelHopping` command. Also augmented `configRxDutyCycle` command to allow parameterization of this mode.
- **402203:** Augmented `configChannelHoppingOptions` command to allow specifying RSSI threshold when enabling that option. Augmented `configRxDutyCycle` command to allow specifying options in general including the RSSI threshold.
- **427841:** Updated the Command Line Interface (CLI) help display format.
- **488425:** CLI commands are now displayed back to the user using the same capitalization as they are entered (e.g. entering command `configTXoptions` will display `configTXoptions` and not `configTxOptions`).
- **454890:** Restructured RAILtest to use a common main.c template with a software component-based architecture to select software features.
- **487098:** Disabled graphics, buttons, LEDs and PER test GPIO pin by default.
- **484333:** Standardized spelling of `RAILtest` for consistency.  
  - Updated bootup message example: `{{(reset)}{App:RAILtest}{Built:Jul 19 2019 13:36:24}}`
- **633846:** Altered CLI input of command `setDebugSignal`.
- **630457:** Fixed an issue where the RAIL PTI component would automatically reserve hardware pins when no pins were specified for use.

###### RAIL 2.8.x:

- **344361:** Added new command `getCteSampleRate` to retrieve the actual ADC sample rate used to capture the CTE.
- **369727:** Added new commands `setTxTimePos` and `setRxTimePos` to designate the time position of displayed packet timestamps among the RAIL_PacketTimePosition_t choices. In txEnd messages, now also display the lastTxStart time, and fixed a bug with the lastTxStatus display.
- **406293:** Fixed an issue where a memory pointer could be discarded from the event queue on queue overflow and never released. This can occur if the memory buffer pool is greater than the event queue size.
- **415017:** Updated the RAILTest bootup message to incorporate the `reset` command, the application name and the date and time of the RAILTest build.  
  - Updated bootup message example: `{{(reset)}{App:RAIL Test App}{Built:Jul 19 2019 13:36:24}}`
- **406080:** Added new commands `configRfSenseWakeupPhy` and `setRfSenseTxPayload` to support waking up chips that support RFSENSE Selective(OOK) mode. Updated `sleep` and `rfsense` commands to allow setting the syncword length and syncword for EFR32XG22 chips which support RFSENSE Selective(OOK) mode. The `tx` command will always overwrite the TX FIFO with a default payload, hence `setRfSenseTxPayload` must be used with `fifoModeTestOptions` set to use `txFifoManual` to prevent the FIFO being overwritten.
- **460516:** Fixed minor railtest problem where `setConfigIndex` might not restart receiver listening like `setChannel` would if the receiver was on when the command was issued.

###### RAIL 2.7.x:

- **368510:** Fixed an issue if receive was entered because of a transmit state transition where we would not change the channel when calling setChannel and would ignore calls to `rx 1` to enter normal receive mode.
- **394431:** Fixed an issue where the configured antenna diversity settings in HAL config would not be applied to the radio at startup.

###### RAIL 2.6.x:

- Fixed `setMultiTimer` which was ignoring its mode argument; `abs` mode now works.
- The commands `setRxOptions` and `configTxOptions` can now be called without any parameters to print the current state of these options.
- RAILTest now uses its config-changed callback for both external and internal radio configs to ensure that the appropriate PA level is always selected.
- Added 802.15.4 `setDataReqLatency` command for testing purposes.
- Fixed some asynchronous event print outs related to Z-Wave beam frame reception since they could corrupt the output.
- Added `getChannelHoppingRssi` command to read the RSSI when in channel hopping mode on each available channel.

###### RAIL 2.5.x:

- Added the following multitimer commands.  
  - `enableMultiTimer`, `setMultiTimer`, `multiTimerCancel`, `printMultiTimerStats`
- Added `printRxErrors` command to enable/disable printing of unsuccessfully received packets.
- Added the ability to save command scripts to flash and run them from flash. Renamed command `startScript` to `runScript`. Added command `clearScript`.

###### RAIL 2.4.x:

- Added the RAM Modem Reconfiguration commands. These commands allow the dynamic configuration of the modem via a set of studio scripted commands.

###### RAIL 2.0.x:

- `setChannel` no longer requires the radio be idle.

###### RAIL 1.6.x:

- simple `tx` command transmits with defaults (i.e. don't wait for ack, send CRC, use sync word 0)
- configTxOptions now controls 3 options  
  - BIT0: Wait for ack  
  - BIT1: Send CRC  
  - BIT2: Sync Word ID
- setRxOptions now controls 3 options  
  - BIT0: Store CRC  
  - BIT1: Ignore CRC errors  
  - BIT2: Enable dual sync

###### RAIL 1.5.x:

- Added the following commands:  
  - `rxConfig`, `setRxOptions`, `setFixedLength`, `fifoStatus`, `dataConfig`, `setTxFifoThreshold`, `setRxFifoThreshold`, `iqCapture`

###### RAIL 1.4.1:

- Added the following commands:  
  - `setPtiProtcol`, `sweepPower`, `startAvgRssi`, `getAvgRssi`, `setBle1Mbps`, `setBle2Mbps`

###### RAIL 1.3.1:

- Added Bluetooth Low Energy commands  
  - `setBleMode`, `getBleMode`, `setBleChannelParams`, `setBleAdvertising`
- Fixed help text for `setPanId802154`, `setshortAddr802154`, `setLongAddr802154`
- Changed parameters for `acceptFrames` separating the bitmask into individual elements

###### RAIL 1.3.0:

- Added Auto Acknowledgement commands  
  - `autoAckConfig`, `autoAckDisable`, `setAckPayload`, `setAckLength`, `printAckPacket`, `getAutoAck`, `autoAckPause`, `setTxAckOptions`
- Added IEEE 802.15.4 commands  
  - `enable802154`, `config2p4GHz802154`, `acceptFrames`, `setPromiscuousMode`, `setPanCoordinator`, `setPanId802154`, `setShortAddr802154`, `setLongAddr802154`
- Added scheduled RX command `rxAt`
- Added `transmitWithOptions` and `configTxOptions` commands
- Added `setDebugSignal` command.

###### RAIL 1.2.1:

- Added `setPaCtune` which can configure custom PA capacitor tuning values for TX and RX
- Fixed RSSI slope requiring a 4dB power change for 1dB change in the received packet print

###### RAIL 1.2.0:

- Added bit error rate test commands - `setBerConfig`, `berRx`, and `berStatus`.
- Added packet error rate test commands - `perRx`, `perStatus`.
- Added the ability to set the RAIL timebase in microseconds - `setTime`.
- RxOverflow counter now only counts number of overflows, instead of mistakenly counting some non-overflow events.
- Removed the RfUs output parameter from the 'sleep' command due to it being incorrect.

###### RAIL 1.1 - May 15, 2016:

- Automatic state transitions and timings added via `setRxTransitions`, `setTxTransitions`, and `setTimings`.
- Ability to selectively enable the address filter on certain frame types added through `addressFilterByFrame` command.
- Independent status booleans were removed in favor of a single `AppMode` status variable, which keeps track of the state of RAILtest.
- More validation is done to ensure that certain RAIL commands are only run in the correct AppMode and radio state. The radio must be IDLE for `setChannel`, `freqOverride`, `setPower`, and `setCtune` to succeed.
- `setTestMode` was removed in favor of individual commands for `setTxUnderflow`, `setRxOverflow`, and `setCalibrations`
- `toggleTone` became `setTxTone`, and `toggleStream` became `setTxStream`.
- Removed command `getTicks`, since the [RAIL_GetTime()](system-timing#rail-get-time) function made the timer used unnecessary.
- Removed command `txTimeReport`, since it was exposing implemenation-specific behavior encapsulated by RAIL.

###### Beta 1 - November 16, 2015:

- New library features for RF Energy Sensing exposed via new `rfSense` and `sleep` commands.
- New RAIL timer functionality exposed via the `setTimer`, `timerCancel`, and `printTimerStats` commands.
- New `printDataRates` command to get information about the current PHY's data rates.
- Documentation clean up.

###### Alpha 2 - September 14, 2015:

- Commands for filtering of receive packets based on defined address fields and compare values.
- Scheduling of packet transmission at an absolute time or after a defined delay.
- Packet transmission conditional on Clear Channel Assessment (CSMA, LBT).
- The ability to read RSSI manually.
- Capability to switch between multiple PHY configurations at runtime.
- Revised help text (more uniform parameter descriptions).

#### API Changes

##### RAIL Library 3.1.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[sl_rail_get_events_config(sl_rail_handle_t rail_handle)](events#sl-rail-get-events-config)|sl_rail_events_t|API to get the configured events information|
|[sl_rail_supports_rf_sense_ook_phy(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rf-sense-ook-phy)|bool|API to indicate whether the chip supports RFSENSE OOK PHY|
|[sl_rail_util_mp_transition_time_get(const sl_rail_util_mp_transition_time_entry_t *p_table, const size_t table_size, sl_rail_time_t *p_transition_time)](multiprotocol-transition-time#sl-rail-util-mp-transition-time-get)|sl_status_t|API to retrieve the transition time for the current system clock frequency|
|[sl_rail_util_mp_transition_time_init(void)](multiprotocol-transition-time#sl-rail-util-mp-transition-time-init)|void|API to initialize the multi-protocol transition time utility|
|[sl_rail_util_pa_get_power_table_info(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode)](pa-power-conversions#sl-rail-util-pa-get-power-table-info)|const [sl_rail_pa_descriptor_t](sl-rail-pa-descriptor-t)|API to get TX PA power setting table and related values|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|sl_rail_util_pa_get_power_setting_table(sl_rail_handle_t rail_handle, sl_rail_tx_power_mode_t mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)|const sl_rail_pa_power_setting_t|[sl_rail_util_pa_get_power_setting_table(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)](pa-power-conversions#sl-rail-util-pa-get-power-setting-table)|const sl_rail_pa_power_setting_t|API has been modified to use sl_rail_tx_power_mode_t instead of sl_rail_tx_pa_mode_t but recommendation is to use [sl_rail_util_pa_get_power_table_info()](pa-power-conversions#sl-rail-util-pa-get-power-table-info)|

##### RAIL Library 3.0.3

No changes

##### RAIL Library 3.0.2

No changes

##### RAIL Library 3.0.1

No changes

##### RAIL Library 3.0.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[sl_rail_is_next_cca_now(sl_rail_handle_t rail_handle)](packet-tx#sl-rail-is-next-cca-now)|bool|new API to check whether next CCA is imminent|
|[sl_rail_abort_rx_incoming_packet(sl_rail_handle_t rail_handle)](packet-information#sl-rail-abort-rx-incoming-packet)|sl_rail_status_t|new API to abort an incoming packet actively being received|
|[sl_rail_add_state_buffer_3(sl_rail_handle_t radio_handle)](general#sl-rail-add-state-buffer-3)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_AddStateBuffer3()](general#rail-add-state-buffer3)|
|[sl_rail_add_state_buffer_4(sl_rail_handle_t radio_handle)](general#sl-rail-add-state-buffer-4)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_AddStateBuffer4()](general#rail-add-state-buffer4)|
|[sl_rail_apply_ir_calibration(sl_rail_handle_t rail_handle, sl_rail_ir_cal_values_t *p_image_rejection, sl_rail_antenna_sel_t rf_path)](calibration#sl-rail-apply-ir-calibration)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ApplyIrCalibrationAlt()](calibration#rail-apply-ir-calibration-alt)|
|[sl_rail_ble_calibrate_ir(sl_rail_handle_t rail_handle, uint32_t *p_image_rejection)](calibration#sl-rail-ble-calibrate-ir)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_CalibrateIr()](calibration#rail-ble-calibrate-ir)|
|[sl_rail_ble_config_aox(sl_rail_handle_t rail_handle, const sl_rail_ble_aox_config_t *p_aox_config)](ao-x#sl-rail-ble-config-aox)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigAox()](ao-x#rail-ble-config-aox)|
|[sl_rail_ble_config_aox_antenna(sl_rail_handle_t rail_handle, const sl_rail_ble_aox_antenna_config_t *p_antenna_config)](ao-x#sl-rail-ble-config-aox-antenna)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigAoxAntenna()](ao-x#rail-ble-config-aox-antenna)|
|[sl_rail_ble_config_channel_radio_params(sl_rail_handle_t rail_handle, const sl_rail_ble_state_t *p_params)](ble#sl-rail-ble-config-channel-radio-params)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigChannelRadioParams()](ble#rail-ble-config-channel-radio-params)|
|[sl_rail_ble_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_channel_config, sl_rail_ble_phy_t phy_id)](ble#sl-rail-ble-config-channels)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_BLE_ConfigChannels()|
|[sl_rail_ble_config_phy_1_mbps(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-config-phy-1-mbps)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigPhy1Mbps()](ble#rail-ble-config-phy1-mbps)|
|[sl_rail_ble_config_phy_2_mbps(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-config-phy-2-mbps)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigPhy2Mbps()](ble#rail-ble-config-phy2-mbps)|
|[sl_rail_ble_config_phy_coded(sl_rail_handle_t rail_handle, sl_rail_ble_coding_t ble_coding)](ble#sl-rail-ble-config-phy-coded)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigPhyCoded()](ble#rail-ble-config-phy-coded)|
|[sl_rail_ble_config_phy_quuppa(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-config-phy-quuppa)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigPhyQuuppa()](ble#rail-ble-config-phy-quuppa)|
|[sl_rail_ble_config_phy_simulscan(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-config-phy-simulscan)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigPhySimulscan()](ble#rail-ble-config-phy-simulscan)|
|[sl_rail_ble_config_signal_identifier(sl_rail_handle_t rail_handle, sl_rail_ble_signal_identifier_mode_t signal_identifier_mode)](ble#sl-rail-ble-config-signal-identifier)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_ConfigSignalIdentifier()](ble#rail-ble-config-signal-identifier)|
|[sl_rail_ble_cte_buffer_is_locked(sl_rail_handle_t rail_handle)](ao-x#sl-rail-ble-cte-buffer-is-locked)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_CteBufferIsLocked()](ao-x#rail-ble-cte-buffer-is-locked)|
|[sl_rail_ble_deinit(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-deinit)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_Deinit()](ble#rail-ble-deinit)|
|[sl_rail_ble_enable_signal_detection(sl_rail_handle_t rail_handle, bool enable)](ble#sl-rail-ble-enable-signal-detection)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_EnableSignalDetection()](ble#rail-ble-enable-signal-detection)|
|[sl_rail_ble_get_cte_sample_offset(sl_rail_handle_t rail_handle)](ao-x#sl-rail-ble-get-cte-sample-offset)|uint8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_GetCteSampleOffset()](ao-x#rail-ble-get-cte-sample-offset)|
|[sl_rail_ble_get_cte_sample_rate(sl_rail_handle_t rail_handle)](ao-x#sl-rail-ble-get-cte-sample-rate)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_GetCteSampleRate()](ao-x#rail-ble-get-cte-sample-rate)|
|[sl_rail_ble_init(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-init)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_Init()](ble#rail-ble-init)|
|[sl_rail_ble_init_cte(sl_rail_handle_t rail_handle)](ao-x#sl-rail-ble-init-cte)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_InitCte()](ao-x#rail-ble-init-cte)|
|[sl_rail_ble_is_enabled(sl_rail_handle_t rail_handle)](ble#sl-rail-ble-is-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_IsEnabled()](ble#rail-ble-is-enabled)|
|[sl_rail_ble_lock_cte_buffer(sl_rail_handle_t rail_handle, bool lock)](ao-x#sl-rail-ble-lock-cte-buffer)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_LockCteBuffer()](ao-x#rail-ble-lock-cte-buffer)|
|[sl_rail_ble_phy_switch_to_rx(sl_rail_handle_t rail_handle, sl_rail_ble_phy_t phy, uint16_t rail_channel, sl_rail_time_t start_rx_time, const sl_rail_ble_state_t *p_params)](ble#sl-rail-ble-phy-switch-to-rx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_PhySwitchToRx()](ble#rail-ble-phy-switch-to-rx)|
|[sl_rail_ble_set_next_tx_repeat(sl_rail_handle_t rail_handle, const sl_rail_ble_tx_repeat_config_t *p_repeat_config)](bletx2-tx#sl-rail-ble-set-next-tx-repeat)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SetNextTxRepeat()](bletx2-tx#rail-ble-set-next-tx-repeat)|
|[sl_rail_ble_supports_1_mbps(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-1-mbps)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_Supports1Mbps()](features#rail-ble-supports1-mbps)|
|[sl_rail_ble_supports_2_mbps(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-2-mbps)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_Supports2Mbps()](features#rail-ble-supports2-mbps)|
|[sl_rail_ble_supports_antenna_switching(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-antenna-switching)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsAntennaSwitching()](features#rail-ble-supports-antenna-switching)|
|[sl_rail_ble_supports_coded_phy(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-coded-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsCodedPhy()](features#rail-ble-supports-coded-phy)|
|[sl_rail_ble_supports_cte(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-cte)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsCte()](features#rail-ble-supports-cte)|
|[sl_rail_ble_supports_iq_sampling(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-iq-sampling)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_BLE_SupportsIqSampling()|
|[sl_rail_ble_supports_phy_switch_to_rx(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-phy-switch-to-rx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsPhySwitchToRx()](features#rail-ble-supports-phy-switch-to-rx)|
|[sl_rail_ble_supports_quuppa(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-quuppa)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsQuuppa()](features#rail-ble-supports-quuppa)|
|[sl_rail_ble_supports_signal_identifier(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-signal-identifier)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsSignalIdentifier()](features#rail-ble-supports-signal-identifier)|
|[sl_rail_ble_supports_simulscan_phy(sl_rail_handle_t rail_handle)](features#sl-rail-ble-supports-simulscan-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_BLE_SupportsSimulscanPhy()](features#rail-ble-supports-simulscan-phy)|
|[sl_rail_calibrate(sl_rail_handle_t rail_handle, sl_rail_cal_values_t *p_cal_values, sl_rail_cal_mask_t cal_force_mask)](calibration#sl-rail-calibrate)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Calibrate()](calibration#rail-calibrate)|
|[sl_rail_calibrate_hfxo(sl_rail_handle_t rail_handle, int8_t *p_crystal_error_ppm)](calibration#sl-rail-calibrate-hfxo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_CalibrateHfxo()|
|[sl_rail_calibrate_ir(sl_rail_handle_t rail_handle, sl_rail_ir_cal_values_t *p_image_rejection, sl_rail_antenna_sel_t rf_path)](calibration#sl-rail-calibrate-ir)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CalibrateIr()](calibration#rail-calibrate-ir)|
|[sl_rail_calibrate_temp(sl_rail_handle_t rail_handle)](calibration#sl-rail-calibrate-temp)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CalibrateTemp()](calibration#rail-calibrate-temp)|
|[sl_rail_cancel_auto_ack(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-cancel-auto-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CancelAutoAck()](auto-ack#rail-cancel-auto-ack)|
|[sl_rail_cancel_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)](system-timing#sl-rail-cancel-multi-timer)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CancelMultiTimer()](system-timing#rail-cancel-multi-timer)|
|[sl_rail_cancel_scheduled_trx(sl_rail_handle_t rail_handle)](scheduler-series-3#sl-rail-cancel-scheduled-trx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_CancelScheduledTrx()|
|[sl_rail_cancel_timer(sl_rail_handle_t rail_handle)](system-timing#sl-rail-cancel-timer)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CancelTimer()](system-timing#rail-cancel-timer)|
|[sl_rail_changed_dcdc(void)](retiming#sl-rail-changed-dcdc)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ChangedDcdc()](retiming#rail-changed-dcdc)|
|[sl_rail_compensate_hfxo(sl_rail_handle_t rail_handle, int8_t crystal_error_ppm)](external-thermistor#sl-rail-compensate-hfxo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_CompensateHfxo()|
|[sl_rail_config_address_filter(sl_rail_handle_t rail_handle, const sl_rail_addr_config_t *p_addr_config)](address-filtering#sl-rail-config-address-filter)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigAddressFilter()](address-filtering#rail-config-address-filter)|
|[sl_rail_config_antenna(sl_rail_handle_t rail_handle, const sl_rail_antenna_config_t *p_config)](antenna-control#sl-rail-config-antenna)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigAntenna()](antenna-control#rail-config-antenna)|
|[sl_rail_config_auto_ack(sl_rail_handle_t rail_handle, const sl_rail_auto_ack_config_t *p_auto_ack_config)](auto-ack#sl-rail-config-auto-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigAutoAck()](auto-ack#rail-config-auto-ack)|
|[sl_rail_config_cal(sl_rail_handle_t rail_handle, sl_rail_cal_mask_t cal_enable_mask)](calibration#sl-rail-config-cal)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigCal()](calibration#rail-config-cal)|
|[sl_rail_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_config, sl_rail_radio_config_changed_callback_t config_changed_callback)](radio-configuration#sl-rail-config-channels)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigChannels()](radio-configuration#rail-config-channels)|
|[sl_rail_config_direct_mode(sl_rail_handle_t rail_handle, const sl_rail_direct_mode_config_t *p_direct_mode_config)](diagnostic#sl-rail-config-direct-mode)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigDirectMode()](diagnostic#rail-config-direct-mode)|
|[sl_rail_config_events(sl_rail_handle_t rail_handle, sl_rail_events_t mask, sl_rail_events_t events)](events#sl-rail-config-events)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigEvents()](events#rail-config-events)|
|[sl_rail_config_hfxo_compensation(sl_rail_handle_t rail_handle, const sl_rail_hfxo_compensation_config_t *p_hfxo_compensation_config)](external-thermistor#sl-rail-config-hfxo-compensation)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_ConfigHfxoCompensation()|
|[sl_rail_config_hfxo_thermistor(sl_rail_handle_t rail_handle, const sl_rail_hfxo_thermistor_config_t *p_hfxo_thermistor_config)](external-thermistor#sl-rail-config-hfxo-thermistor)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_ConfigHfxoThermistor()|
|[sl_rail_config_multi_timer(sl_rail_handle_t rail_handle, bool enable)](system-timing#sl-rail-config-multi-timer)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigMultiTimer()](system-timing#rail-config-multi-timer)|
|[sl_rail_config_pti(sl_rail_handle_t rail_handle, const sl_rail_pti_config_t *p_pti_config)](pti#sl-rail-config-pti)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigPti()](pti#rail-config-pti)|
|[sl_rail_config_retime_options(sl_rail_handle_t rail_handle, sl_rail_retime_options_t mask, sl_rail_retime_options_t options)](retiming#sl-rail-config-retime-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigRetimeOptions()](retiming#rail-config-retime-options)|
|[sl_rail_config_rf_sense_selective_ook_wakeup_phy(sl_rail_handle_t rail_handle)](rf-sense#sl-rail-config-rf-sense-selective-ook-wakeup-phy)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigRfSenseSelectiveOokWakeupPhy()](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy)|
|[sl_rail_config_rx_channel_hopping(sl_rail_handle_t rail_handle, sl_rail_rx_channel_hopping_config_t *p_rx_hopping_config)](rx-channel-hopping#sl-rail-config-rx-channel-hopping)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigRxChannelHopping()](rx-channel-hopping#rail-config-rx-channel-hopping)|
|[sl_rail_config_rx_data(sl_rail_handle_t rail_handle, const sl_rail_rx_data_config_t *p_rx_data_config)](data-management#sl-rail-config-rx-data)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_ConfigRxData()|
|[sl_rail_config_rx_duty_cycle(sl_rail_handle_t rail_handle, const sl_rail_rx_duty_cycle_config_t *p_rx_duty_cycle_config)](rx-channel-hopping#sl-rail-config-rx-duty-cycle)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigRxDutyCycle()](rx-channel-hopping#rail-config-rx-duty-cycle)|
|[sl_rail_config_rx_options(sl_rail_handle_t rail_handle, sl_rail_rx_options_t rx_options_mask, sl_rail_rx_options_t rx_options)](receive#sl-rail-config-rx-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigRxOptions()](receive#rail-config-rx-options)|
|[sl_rail_config_sleep(sl_rail_handle_t rail_handle, const sl_rail_timer_sync_config_t *p_timer_sync_config)](sleep#sl-rail-config-sleep)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigSleep()](sleep#rail-config-sleep)|
|[sl_rail_config_sync_words(sl_rail_handle_t rail_handle, const sl_rail_sync_word_config_t *p_sync_word_config)](radio-configuration#sl-rail-config-sync-words)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigSyncWords()](radio-configuration#rail-config-sync-words)|
|[sl_rail_config_thermal_protection(sl_rail_handle_t radio_handle, const sl_rail_chip_temp_config_t *p_chip_temp_config)](thermal-protection#sl-rail-config-thermal-protection)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigThermalProtection()](thermal-protection#rail-config-thermal-protection)|
|[sl_rail_config_tx_data(sl_rail_handle_t rail_handle, const sl_rail_tx_data_config_t *p_tx_data_config)](data-management#sl-rail-config-tx-data)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_ConfigTxData()|
|[sl_rail_config_tx_power(sl_rail_handle_t rail_handle, const sl_rail_tx_power_config_t *p_config)](pa#sl-rail-config-tx-power)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigTxPower()](pa#rail-config-tx-power)|
|[sl_rail_config_vdet(sl_rail_handle_t radio_handle, const sl_rail_vdet_config_t *p_config)](vdet#sl-rail-config-vdet)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConfigVdet()](vdet#rail-config-vdet)|
|[sl_rail_convert_lqi(sl_rail_handle_t rail_handle, sl_rail_convert_lqi_callback_t lqi_callback)](receive#sl-rail-convert-lqi)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ConvertLqi()](receive#rail-convert-lqi)|
|[sl_rail_copy_device_info(sl_rail_handle_t radio_handle)](general#sl-rail-copy-device-info)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CopyDeviceInfo()](general#rail-copy-device-info)|
|[sl_rail_copy_rx_packet(sl_rail_handle_t rail_handle, uint8_t *p_dest, const sl_rail_rx_packet_info_t *p_packet_info)](packet-information#sl-rail-copy-rx-packet)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_CopyRxPacket()](packet-information#rail-copy-rx-packet)|
|[sl_rail_deinit_power_manager(void)](sleep#sl-rail-deinit-power-manager)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_DeinitPowerManager()](sleep#rail-deinit-power-manager)|
|[sl_rail_delay_us(sl_rail_handle_t rail_handle, sl_rail_time_t microseconds)](system-timing#sl-rail-delay-us)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_DelayUs()](system-timing#rail-delay-us)|
|[sl_rail_enable_address_filter(sl_rail_handle_t rail_handle, bool enable)](address-filtering#sl-rail-enable-address-filter)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableAddressFilter()](address-filtering#rail-enable-address-filter)|
|[sl_rail_enable_address_filter_address(sl_rail_handle_t rail_handle, bool enable, uint8_t field, uint8_t index)](address-filtering#sl-rail-enable-address-filter-address)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableAddressFilterAddress()](address-filtering#rail-enable-address-filter-address)|
|[sl_rail_enable_cache_synth_cal(sl_rail_handle_t rail_handle, bool enable)](state-transitions#sl-rail-enable-cache-synth-cal)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableCacheSynthCal()](state-transitions#rail-enable-cache-synth-cal)|
|[sl_rail_enable_direct_mode(sl_rail_handle_t rail_handle, bool enable_direct_tx, bool enable_direct_rx)](diagnostic#sl-rail-enable-direct-mode)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableDirectMode()](diagnostic#rail-enable-direct-mode)|
|[sl_rail_enable_pa_cal(sl_rail_handle_t rail_handle, bool enable)](calibration#sl-rail-enable-pa-cal)|void|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnablePaCal()](calibration#rail-enable-pa-cal)|
|[sl_rail_enable_prs_lna_bypass(sl_rail_handle_t rail_handle, bool enable, const sl_rail_prs_lna_bypass_config_t *p_prs_lna_bypass_config)](receive#sl-rail-enable-prs-lna-bypass)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnablePrsLnaBypass()](receive#rail-enable-prs-lna-bypass)|
|[sl_rail_enable_pti(sl_rail_handle_t rail_handle, bool enable)](pti#sl-rail-enable-pti)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnablePti()](pti#rail-enable-pti)|
|[sl_rail_enable_rx_channel_hopping(sl_rail_handle_t rail_handle, bool enable, bool reset)](rx-channel-hopping#sl-rail-enable-rx-channel-hopping)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableRxChannelHopping()](rx-channel-hopping#rail-enable-rx-channel-hopping)|
|[sl_rail_enable_rx_duty_cycle(sl_rail_handle_t rail_handle, bool enable)](rx-channel-hopping#sl-rail-enable-rx-duty-cycle)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableRxDutyCycle()](rx-channel-hopping#rail-enable-rx-duty-cycle)|
|[sl_rail_enable_tx_hold_off(sl_rail_handle_t rail_handle, bool enable)](transmit#sl-rail-enable-tx-hold-off)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableTxHoldOff()](transmit#rail-enable-tx-hold-off)|
|[sl_rail_enable_vdet(sl_rail_handle_t radio_handle, bool enable)](vdet#sl-rail-enable-vdet)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_EnableVdet()](vdet#rail-enable-vdet)|
|[sl_rail_get_auto_ack_fifo(sl_rail_handle_t rail_handle, uint8_t **pp_ack_buffer, uint16_t *p_ack_buffer_bytes)](auto-ack#sl-rail-get-auto-ack-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetAutoAckFifo()](auto-ack#rail-get-auto-ack-fifo)|
|[sl_rail_get_average_rssi(sl_rail_handle_t rail_handle)](receive#sl-rail-get-average-rssi)|int16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetAverageRssi()](receive#rail-get-average-rssi)|
|[sl_rail_get_bit_rate(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-get-bit-rate)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetBitRate()](radio-configuration#rail-get-bit-rate)|
|[sl_rail_get_channel(sl_rail_handle_t rail_handle, uint16_t *p_channel)](radio-configuration#sl-rail-get-channel)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetChannel()](radio-configuration#rail-get-channel)|
|[sl_rail_get_channel_hopping_rssi(sl_rail_handle_t rail_handle, uint8_t channel_index)](rx-channel-hopping#sl-rail-get-channel-hopping-rssi)|int16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetChannelHoppingRssi()](rx-channel-hopping#rail-get-channel-hopping-rssi)|
|[sl_rail_get_channel_metadata(sl_rail_handle_t rail_handle, sl_rail_channel_metadata_t *p_channel_metadata, uint16_t *p_number_of_entries, uint16_t min_channel, uint16_t max_channel)](radio-configuration#sl-rail-get-channel-metadata)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetChannelMetadata()](radio-configuration#rail-get-channel-metadata)|
|[sl_rail_get_config(sl_rail_handle_t rail_handle)](general#sl-rail-get-config)|const [sl_rail_config_t](sl-rail-config-t)|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_GetConfig()|
|[sl_rail_get_crc_init_val(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-get-crc-init-val)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetCrcInitVal()](radio-configuration#rail-get-crc-init-val)|
|[sl_rail_get_default_rx_duty_cycle_config(sl_rail_handle_t rail_handle, sl_rail_rx_duty_cycle_config_t *p_rx_duty_cycle_config)](rx-channel-hopping#sl-rail-get-default-rx-duty-cycle-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetDefaultRxDutyCycleConfig()](rx-channel-hopping#rail-get-default-rx-duty-cycle-config)|
|[sl_rail_get_first_channel(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_config)](radio-configuration#sl-rail-get-first-channel)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_GetFirstChannel()|
|[sl_rail_get_hfxo_compensation_config(sl_rail_handle_t rail_handle, sl_rail_hfxo_compensation_config_t *p_hfxo_compensation_config)](external-thermistor#sl-rail-get-hfxo-compensation-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_GetHfxoCompensationConfig()|
|[sl_rail_get_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr, sl_rail_time_mode_t time_mode)](system-timing#sl-rail-get-multi-timer)|sl_rail_time_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetMultiTimer()](system-timing#rail-get-multi-timer)|
|[sl_rail_get_pa_mode(sl_rail_handle_t rail_handle)](pa#sl-rail-get-pa-mode)|sl_rail_tx_pa_mode_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_GetPaMode()|
|[sl_rail_get_pa_mode_from_channel_entry(sl_rail_handle_t rail_handle)](pa#sl-rail-get-pa-mode-from-channel-entry)|sl_rail_tx_pa_mode_t||
|[sl_rail_get_pending_cal(sl_rail_handle_t rail_handle)](calibration#sl-rail-get-pending-cal)|sl_rail_cal_mask_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetPendingCal()](calibration#rail-get-pending-cal)|
|[sl_rail_get_pti_config(sl_rail_handle_t rail_handle, sl_rail_pti_config_t *p_pti_config)](pti#sl-rail-get-pti-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetPtiConfig()](pti#rail-get-pti-config)|
|[sl_rail_get_pti_protocol(sl_rail_handle_t rail_handle)](pti#sl-rail-get-pti-protocol)|sl_rail_pti_protocol_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetPtiProtocol()](pti#rail-get-pti-protocol)|
|[sl_rail_get_radio_clock_freq_hz(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-get-radio-clock-freq-hz)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRadioClockFreqHz()](diagnostic#rail-get-radio-clock-freq-hz)|
|[sl_rail_get_radio_entropy(sl_rail_handle_t rail_handle, uint8_t *p_buffer, uint16_t bytes)](general#sl-rail-get-radio-entropy)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRadioEntropy()](general#rail-get-radio-entropy)|
|[sl_rail_get_radio_state(sl_rail_handle_t rail_handle)](state-transitions#sl-rail-get-radio-state)|sl_rail_radio_state_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRadioState()](state-transitions#rail-get-radio-state)|
|[sl_rail_get_radio_state_detail(sl_rail_handle_t rail_handle)](state-transitions#sl-rail-get-radio-state-detail)|sl_rail_radio_state_detail_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRadioStateDetail()](state-transitions#rail-get-radio-state-detail)|
|[sl_rail_get_retime_options(sl_rail_handle_t rail_handle, sl_rail_retime_options_t *p_options)](retiming#sl-rail-get-retime-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRetimeOptions()](retiming#rail-get-retime-options)|
|[sl_rail_get_rf_path(sl_rail_handle_t rail_handle, sl_rail_antenna_sel_t *p_rf_path)](antenna-control#sl-rail-get-rf-path)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRfPath()](antenna-control#rail-get-rf-path)|
|[sl_rail_get_rssi(sl_rail_handle_t rail_handle, sl_rail_time_t wait_timeout_us)](receive#sl-rail-get-rssi)|int16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRssi()](receive#rail-get-rssi)|
|[sl_rail_get_rssi_detect_threshold(sl_rail_handle_t rail_handle)](receive#sl-rail-get-rssi-detect-threshold)|int8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRssiDetectThreshold()](receive#rail-get-rssi-detect-threshold)|
|[sl_rail_get_rssi_offset(sl_rail_handle_t rail_handle)](receive#sl-rail-get-rssi-offset)|int8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRssiOffset()](receive#rail-get-rssi-offset)|
|[sl_rail_get_rx_fifo_bytes_available(sl_rail_handle_t rail_handle)](data-management#sl-rail-get-rx-fifo-bytes-available)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxFifoBytesAvailable()](data-management#rail-get-rx-fifo-bytes-available)|
|[sl_rail_get_rx_fifo_threshold(sl_rail_handle_t rail_handle)](data-management#sl-rail-get-rx-fifo-threshold)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxFifoThreshold()](data-management#rail-get-rx-fifo-threshold)|
|[sl_rail_get_rx_freq_offset(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-get-rx-freq-offset)|sl_rail_frequency_offset_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxFreqOffset()](diagnostic#rail-get-rx-freq-offset)|
|[sl_rail_get_rx_incoming_packet_info(sl_rail_handle_t rail_handle, sl_rail_rx_packet_info_t *p_packet_info)](packet-information#sl-rail-get-rx-incoming-packet-info)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxIncomingPacketInfo()](packet-information#rail-get-rx-incoming-packet-info)|
|[sl_rail_get_rx_incoming_packet_rssi(sl_rail_handle_t rail_handle)](receive#sl-rail-get-rx-incoming-packet-rssi)|int8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxIncomingPacketRssi()](receive#rail-get-rx-incoming-packet-rssi)|
|[sl_rail_get_rx_packet_details(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, sl_rail_rx_packet_details_t *p_packet_details)](packet-information#sl-rail-get-rx-packet-details)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxPacketDetails()](packet-information#rail-get-rx-packet-details)|
|[sl_rail_get_rx_packet_info(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, sl_rail_rx_packet_info_t *p_packet_info)](packet-information#sl-rail-get-rx-packet-info)|sl_rail_rx_packet_handle_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxPacketInfo()](packet-information#rail-get-rx-packet-info)|
|[sl_rail_get_rx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)](packet-information#sl-rail-get-rx-time-frame-end)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxTimeFrameEnd()](packet-information#rail-get-rx-time-frame-end)|
|[sl_rail_get_rx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)](packet-information#sl-rail-get-rx-time-preamble-start)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxTimePreambleStart()](packet-information#rail-get-rx-time-preamble-start)|
|[sl_rail_get_rx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details)](packet-information#sl-rail-get-rx-time-sync-word-end)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxTimeSyncWordEnd()](packet-information#rail-get-rx-time-sync-word-end)|
|[sl_rail_get_rx_transitions(sl_rail_handle_t rail_handle, sl_rail_state_transitions_t *p_transitions)](state-transitions#sl-rail-get-rx-transitions)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetRxTransitions()](state-transitions#rail-get-rx-transitions)|
|[sl_rail_get_scheduler_status(sl_rail_handle_t rail_handle, sl_rail_scheduler_status_t *p_scheduler_status, sl_rail_status_t *p_rail_status)](multiprotocol#sl-rail-get-scheduler-status)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetSchedulerStatus()](multiprotocol#rail-get-scheduler-status)|
|[sl_rail_get_symbol_rate(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-get-symbol-rate)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetSymbolRate()](radio-configuration#rail-get-symbol-rate)|
|[sl_rail_get_sync_words(sl_rail_handle_t rail_handle, sl_rail_sync_word_config_t *p_sync_word_config)](radio-configuration#sl-rail-get-sync-words)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetSyncWords()](radio-configuration#rail-get-sync-words)|
|sl_rail_get_temperature(sl_rail_handle_t radio_handle, int16_t temp_buffer[((3U)+(1U))], bool reset)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTemperature()](thermal-protection#rail-get-temperature)|
|[sl_rail_get_thermal_protection(sl_rail_handle_t radio_handle, sl_rail_chip_temp_config_t *p_chip_temp_config)](thermal-protection#sl-rail-get-thermal-protection)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetThermalProtection()](thermal-protection#rail-get-thermal-protection)|
|[sl_rail_get_thermistor_impedance(sl_rail_handle_t rail_handle, uint32_t *p_thermistor_impedance_ohms)](external-thermistor#sl-rail-get-thermistor-impedance)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetThermistorImpedance()](external-thermistor#rail-get-thermistor-impedance)|
|[sl_rail_get_time(sl_rail_handle_t rail_handle)](system-timing#sl-rail-get-time)|sl_rail_time_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTime()](system-timing#rail-get-time)|
|[sl_rail_get_timer(sl_rail_handle_t rail_handle)](system-timing#sl-rail-get-timer)|sl_rail_time_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTimer()](system-timing#rail-get-timer)|
|[sl_rail_get_transition_time(sl_rail_handle_t radio_handle)](multiprotocol#sl-rail-get-transition-time)|sl_rail_time_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTransitionTime()](multiprotocol#rail-get-transition-time)|
|[sl_rail_get_tune(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-get-tune)|uint32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTune()](diagnostic#rail-get-tune)|
|[sl_rail_get_tune_delta(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-get-tune-delta)|int32_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTuneDelta()](diagnostic#rail-get-tune-delta)|
|[sl_rail_get_tuned_channel(sl_rail_handle_t rail_handle, uint16_t *p_channel)](radio-configuration#sl-rail-get-tuned-channel)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_GetTunedChannel()|
|[sl_rail_get_tx_fifo_space_available(sl_rail_handle_t rail_handle)](data-management#sl-rail-get-tx-fifo-space-available)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxFifoSpaceAvailable()](data-management#rail-get-tx-fifo-space-available)|
|[sl_rail_get_tx_fifo_threshold(sl_rail_handle_t rail_handle)](data-management#sl-rail-get-tx-fifo-threshold)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxFifoThreshold()](data-management#rail-get-tx-fifo-threshold)|
|[sl_rail_get_tx_packet_details(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)](transmit#sl-rail-get-tx-packet-details)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxPacketDetails()](transmit#rail-get-tx-packet-details)|
|[sl_rail_get_tx_packets_remaining(sl_rail_handle_t rail_handle)](state-transitions#sl-rail-get-tx-packets-remaining)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxPacketsRemaining()](state-transitions#rail-get-tx-packets-remaining)|
|[sl_rail_get_tx_power_dbm(sl_rail_handle_t rail_handle)](pa#sl-rail-get-tx-power-dbm)|sl_rail_tx_power_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxPowerDbm()](pa#rail-get-tx-power-dbm)|
|[sl_rail_get_tx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)](transmit#sl-rail-get-tx-time-frame-end)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxTimeFrameEnd()](transmit#rail-get-tx-time-frame-end)|
|[sl_rail_get_tx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)](transmit#sl-rail-get-tx-time-preamble-start)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxTimePreambleStart()](transmit#rail-get-tx-time-preamble-start)|
|[sl_rail_get_tx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details)](transmit#sl-rail-get-tx-time-sync-word-end)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxTimeSyncWordEnd()](transmit#rail-get-tx-time-sync-word-end)|
|[sl_rail_get_tx_transitions(sl_rail_handle_t rail_handle, sl_rail_state_transitions_t *p_transitions)](state-transitions#sl-rail-get-tx-transitions)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetTxTransitions()](state-transitions#rail-get-tx-transitions)|
|[sl_rail_get_vdet(sl_rail_handle_t radio_handle, uint32_t *p_vdet_mv)](vdet#sl-rail-get-vdet)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetVdet()](vdet#rail-get-vdet)|
|[sl_rail_get_vdet_config(sl_rail_handle_t radio_handle, sl_rail_vdet_config_t *p_config)](vdet#sl-rail-get-vdet-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetVdetConfig()](vdet#rail-get-vdet-config)|
|[sl_rail_get_version(sl_rail_version_t *p_version)](general#sl-rail-get-version)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetVersion()](general#rail-get-version)|
|[sl_rail_get_whitening_init_val(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-get-whitening-init-val)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_GetWhiteningInitVal()](radio-configuration#rail-get-whitening-init-val)|
|[sl_rail_hold_rx_packet(sl_rail_handle_t rail_handle)](receive#sl-rail-hold-rx-packet)|sl_rail_rx_packet_handle_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_HoldRxPacket()](receive#rail-hold-rx-packet)|
|[sl_rail_idle(sl_rail_handle_t rail_handle, sl_rail_idle_mode_t mode, bool wait)](state-transitions#sl-rail-idle-1)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Idle()](state-transitions#rail-idle-1)|
|[sl_rail_ieee802154_accept_frames(sl_rail_handle_t rail_handle, uint8_t frames_mask)](ieee802-15-4#sl-rail-ieee802154-accept-frames)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_AcceptFrames()](ieee802-15-4#rail-ieee802154-accept-frames)|
|[sl_rail_ieee802154_calibrate_ir_2p4_ghz(sl_rail_handle_t rail_handle, uint32_t *p_image_rejection)](calibration#sl-rail-ieee802154-calibrate-ir-2p4-ghz)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_CalibrateIr2p4GHz()|
|[sl_rail_ieee802154_compute_channel_from_phy_mode_id(sl_rail_handle_t rail_handle, uint8_t new_phy_mode_id, uint16_t *p_channel)](ieee802-15-4#sl-rail-ieee802154-compute-channel-from-phy-mode-id)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ComputeChannelFromPhyModeId()](ieee802-15-4#rail-ieee802154-compute-channel-from-phy-mode-id)|
|[sl_rail_ieee802154_config_2p4_ghz_radio(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Config2p4GHzRadio()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio)|
|[sl_rail_ieee802154_config_2p4_ghz_radio_ant_div(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Config2p4GHzRadioAntDiv()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div)|
|[sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-coex)|
|[sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_coex_fem(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-coex-fem)|sl_rail_status_t||
|[sl_rail_ieee802154_config_2p4_ghz_radio_ant_div_fem(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-ant-div-fem)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Config2p4GHzRadioAntDivFEM()|
|[sl_rail_ieee802154_config_2p4_ghz_radio_coex(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Config2p4GHzRadioCoex()](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-coex)|
|[sl_rail_ieee802154_config_2p4_ghz_radio_coex_fem(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-coex-fem)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Config2p4GHzRadioCoexFEM()|
|[sl_rail_ieee802154_config_2p4_ghz_radio_fast_channel_switching(sl_rail_handle_t rail_handle)](ieee802154-fast-channel-switching-api#sl-rail-ieee802154-config-2p4-ghz-radio-fast-channel-switching)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Config2p4GHzRadioFastChannelSwitching()|
|[sl_rail_ieee802154_config_2p4_ghz_radio_fem(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio-fem)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Config2p4GHzRadioFEM()|
|[sl_rail_ieee802154_config_2p4_ghz_radio_rx_duty_cycling(sl_rail_handle_t rail_handle)](ieee802154-rx-duty-cycling-api#sl-rail-ieee802154-config-2p4-ghz-radio-rx-duty-cycling)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Config2p4GHzRadioRxDutyCycling()|
|[sl_rail_ieee802154_config_cca_mode(sl_rail_handle_t rail_handle, sl_rail_ieee802154_cca_mode_t cca_mode)](ieee802-15-4#sl-rail-ieee802154-config-cca-mode)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigCcaMode()](ieee802-15-4#rail-ieee802154-config-cca-mode)|
|[sl_rail_ieee802154_config_channels(sl_rail_handle_t rail_handle, const sl_rail_channel_config_t *p_channel_config, sl_rail_ieee802154_phy_t phy_id)](ieee802-15-4#sl-rail-ieee802154-config-channels)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_ConfigChannels()|
|[sl_rail_ieee802154_config_e_options(sl_rail_handle_t rail_handle, sl_rail_ieee802154_e_options_t mask, sl_rail_ieee802154_e_options_t options)](ieee802-15-4#sl-rail-ieee802154-config-e-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigEOptions()](ieee802-15-4#rail-ieee802154-config-e-options)|
|[sl_rail_ieee802154_config_g_options(sl_rail_handle_t rail_handle, sl_rail_ieee802154_g_options_t mask, sl_rail_ieee802154_g_options_t options)](ieee802-15-4#sl-rail-ieee802154-config-g-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigGOptions()](ieee802-15-4#rail-ieee802154-config-g-options)|
|[sl_rail_ieee802154_config_gb863_mhz_radio(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-gb863-mhz-radio)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigGB863MHzRadio()](ieee802-15-4#rail-ieee802154-config-gb863-m-hz-radio)|
|[sl_rail_ieee802154_config_gb915_mhz_radio(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-config-gb915-mhz-radio)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigGB915MHzRadio()](ieee802-15-4#rail-ieee802154-config-gb915-m-hz-radio)|
|[sl_rail_ieee802154_config_rx_channel_switching(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_rx_channel_switching_cfg_t *p_config)](ieee802-15-4#sl-rail-ieee802154-config-rx-channel-switching)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigRxChannelSwitching()](ieee802-15-4#rail-ieee802154-config-rx-channel-switching)|
|[sl_rail_ieee802154_config_signal_identifier(sl_rail_handle_t rail_handle, sl_rail_ieee802154_signal_identifier_mode_t signal_identifier_mode)](ieee802-15-4#sl-rail-ieee802154-config-signal-identifier)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConfigSignalIdentifier()](ieee802-15-4#rail-ieee802154-config-signal-identifier)|
|[sl_rail_ieee802154_convert_rssi_to_ed(int8_t rssi_dbm)](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-ed)|uint8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConvertRssiToEd()](ieee802-15-4#rail-ieee802154-convert-rssi-to-ed)|
|[sl_rail_ieee802154_convert_rssi_to_lqi(uint8_t orig_lqi, int8_t rssi_dbm)](ieee802-15-4#sl-rail-ieee802154-convert-rssi-to-lqi)|uint8_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ConvertRssiToLqi()](ieee802-15-4#rail-ieee802154-convert-rssi-to-lqi)|
|[sl_rail_ieee802154_deinit(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-deinit)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Deinit()](ieee802-15-4#rail-ieee802154-deinit)|
|[sl_rail_ieee802154_enable_data_frame_pending(sl_rail_handle_t rail_handle, bool enable)](ieee802-15-4#sl-rail-ieee802154-enable-data-frame-pending)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_EnableDataFramePending()](ieee802-15-4#rail-ieee802154-enable-data-frame-pending)|
|[sl_rail_ieee802154_enable_early_frame_pending(sl_rail_handle_t rail_handle, bool enable)](ieee802-15-4#sl-rail-ieee802154-enable-early-frame-pending)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_EnableEarlyFramePending()](ieee802-15-4#rail-ieee802154-enable-early-frame-pending)|
|[sl_rail_ieee802154_enable_signal_detection(sl_rail_handle_t rail_handle, bool enable)](ieee802-15-4#sl-rail-ieee802154-enable-signal-detection)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_EnableSignalDetection()](ieee802-15-4#rail-ieee802154-enable-signal-detection)|
|[sl_rail_ieee802154_get_address(sl_rail_handle_t rail_handle, sl_rail_ieee802154_address_t *p_address)](ieee802-15-4#sl-rail-ieee802154-get-address)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_GetAddress()](ieee802-15-4#rail-ieee802154-get-address)|
|[sl_rail_ieee802154_get_phy_id(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-get-phy-id)|sl_rail_ieee802154_phy_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_GetPhyId()|
|[sl_rail_ieee802154_init(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_config_t *p_config)](ieee802-15-4#sl-rail-ieee802154-init)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_Init()](ieee802-15-4#rail-ieee802154-init)|
|[sl_rail_ieee802154_is_enabled(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-is-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_IsEnabled()](ieee802-15-4#rail-ieee802154-is-enabled)|
|[sl_rail_ieee802154_set_addresses(sl_rail_handle_t rail_handle, const sl_rail_ieee802154_addr_config_t *p_addresses)](ieee802-15-4#sl-rail-ieee802154-set-addresses)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetAddresses()](ieee802-15-4#rail-ieee802154-set-addresses)|
|[sl_rail_ieee802154_set_long_address(sl_rail_handle_t rail_handle, const uint8_t *p_long_addr, uint8_t index)](ieee802-15-4#sl-rail-ieee802154-set-long-address)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetLongAddress()](ieee802-15-4#rail-ieee802154-set-long-address)|
|[sl_rail_ieee802154_set_pan_coordinator(sl_rail_handle_t rail_handle, bool is_pan_coordinator)](ieee802-15-4#sl-rail-ieee802154-set-pan-coordinator)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetPanCoordinator()](ieee802-15-4#rail-ieee802154-set-pan-coordinator)|
|[sl_rail_ieee802154_set_pan_id(sl_rail_handle_t rail_handle, uint16_t pan_id, uint8_t index)](ieee802-15-4#sl-rail-ieee802154-set-pan-id)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetPanId()](ieee802-15-4#rail-ieee802154-set-pan-id)|
|[sl_rail_ieee802154_set_promiscuous_mode(sl_rail_handle_t rail_handle, bool enable)](ieee802-15-4#sl-rail-ieee802154-set-promiscuous-mode)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetPromiscuousMode()](ieee802-15-4#rail-ieee802154-set-promiscuous-mode)|
|[sl_rail_ieee802154_set_rx_to_enh_ack_tx(sl_rail_handle_t rail_handle, sl_rail_transition_time_t *p_rx_to_enh_ack_tx)](ieee802-15-4#sl-rail-ieee802154-set-rx-to-enh-ack-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetRxToEnhAckTx()](ieee802-15-4#rail-ieee802154-set-rx-to-enh-ack-tx)|
|[sl_rail_ieee802154_set_short_address(sl_rail_handle_t rail_handle, uint16_t short_addr, uint8_t index)](ieee802-15-4#sl-rail-ieee802154-set-short-address)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SetShortAddress()](ieee802-15-4#rail-ieee802154-set-short-address)|
|[sl_rail_ieee802154_supports_2p4_ghz_band(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-2p4-ghz-band)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_Supports2p4GHzBand()|
|[sl_rail_ieee802154_supports_cancel_frame_pending_lookup(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-cancel-frame-pending-lookup)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsCancelFramePendingLookup()](features#rail-ieee802154-supports-cancel-frame-pending-lookup)|
|[sl_rail_ieee802154_supports_coex_phy(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-coex-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsCoexPhy()](features#rail-ieee802154-supports-coex-phy)|
|[sl_rail_ieee802154_supports_dual_pa_config(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-dual-pa-config)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsDualPaConfig()](features#rail-ieee802154-supports-dual-pa-config)|
|[sl_rail_ieee802154_supports_e_enhanced_ack(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-e-enhanced-ack)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsEEnhancedAck()](features#rail-ieee802154-supports-e-enhanced-ack)|
|[sl_rail_ieee802154_supports_e_multipurpose_frames(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-e-multipurpose-frames)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsEMultipurposeFrames()](features#rail-ieee802154-supports-e-multipurpose-frames)|
|[sl_rail_ieee802154_supports_e_subset_gb868(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-e-subset-gb868)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_SupportsESubsetGb868()|
|[sl_rail_ieee802154_supports_early_frame_pending_lookup(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-early-frame-pending-lookup)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsEarlyFramePendingLookup()](features#rail-ieee802154-supports-early-frame-pending-lookup)|
|[sl_rail_ieee802154_supports_fem_phy(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-fem-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsFemPhy()](features#rail-ieee802154-supports-fem-phy)|
|[sl_rail_ieee802154_supports_g_4_byte_crc(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-4-byte-crc)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsG4ByteCrc()](features#rail-ieee802154-supports-g4-byte-crc)|
|[sl_rail_ieee802154_supports_g_dyn_fec(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-dyn-fec)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsGDynFec()](features#rail-ieee802154-supports-g-dyn-fec)|
|[sl_rail_ieee802154_supports_g_mode_switch(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-mode-switch)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsGModeSwitch()](features#rail-ieee802154-supports-g-mode-switch)|
|[sl_rail_ieee802154_supports_g_subset_gb868(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-subset-gb868)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_SupportsGSubsetGb868()|
|[sl_rail_ieee802154_supports_g_unwhitened_rx(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-unwhitened-rx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsGUnwhitenedRx()](features#rail-ieee802154-supports-g-unwhitened-rx)|
|[sl_rail_ieee802154_supports_g_unwhitened_tx(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-g-unwhitened-tx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsGUnwhitenedTx()](features#rail-ieee802154-supports-g-unwhitened-tx)|
|[sl_rail_ieee802154_supports_rx_channel_switching(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-rx-channel-switching)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsRxChannelSwitching()](features#rail-ieee802154-supports-rx-channel-switching)|
|[sl_rail_ieee802154_supports_signal_identifier(sl_rail_handle_t rail_handle)](features#sl-rail-ieee802154-supports-signal-identifier)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_SupportsSignalIdentifier()](features#rail-ieee802154-supports-signal-identifier)|
|[sl_rail_ieee802154_toggle_frame_pending(sl_rail_handle_t rail_handle)](ieee802-15-4#sl-rail-ieee802154-toggle-frame-pending)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_ToggleFramePending()](ieee802-15-4#rail-ieee802154-toggle-frame-pending)|
|[sl_rail_ieee802154_write_enh_ack(sl_rail_handle_t rail_handle, const uint8_t *p_ack_data, uint16_t ack_data_bytes)](ieee802-15-4#sl-rail-ieee802154-write-enh-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IEEE802154_WriteEnhAck()](ieee802-15-4#rail-ieee802154-write-enh-ack)|
|[sl_rail_include_frame_type_length(sl_rail_handle_t rail_handle)](receive#sl-rail-include-frame-type-length)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IncludeFrameTypeLength()](receive#rail-include-frame-type-length)|
|[sl_rail_init(sl_rail_handle_t *p_rail_handle, const sl_rail_config_t *p_rail_config, sl_rail_init_complete_callback_t init_complete_callback)](general#sl-rail-init)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Init()](general#rail-init)|
|[sl_rail_init_power_manager(void)](sleep#sl-rail-init-power-manager)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_InitPowerManager()](sleep#rail-init-power-manager)|
|[sl_rail_is_address_filter_enabled(sl_rail_handle_t rail_handle)](address-filtering#sl-rail-is-address-filter-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsAddressFilterEnabled()](address-filtering#rail-is-address-filter-enabled)|
|[sl_rail_is_auto_ack_enabled(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-is-auto-ack-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsAutoAckEnabled()](auto-ack#rail-is-auto-ack-enabled)|
|[sl_rail_is_auto_ack_waiting_for_ack(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-is-auto-ack-waiting-for-ack)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsAutoAckWaitingForAck()](auto-ack#rail-is-auto-ack-waiting-for-ack)|
|[sl_rail_is_average_rssi_ready(sl_rail_handle_t rail_handle)](receive#sl-rail-is-average-rssi-ready)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsAverageRssiReady()](receive#rail-is-average-rssi-ready)|
|[sl_rail_is_initialized(sl_rail_handle_t rail_handle)](general#sl-rail-is-initialized)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsInitialized()](general#rail-is-initialized)|
|[sl_rail_is_multi_timer_expired(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)](system-timing#sl-rail-is-multi-timer-expired)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsMultiTimerExpired()](system-timing#rail-is-multi-timer-expired)|
|[sl_rail_is_multi_timer_running(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr)](system-timing#sl-rail-is-multi-timer-running)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsMultiTimerRunning()](system-timing#rail-is-multi-timer-running)|
|[sl_rail_is_next_cca_now(sl_rail_handle_t rail_handle)](packet-tx#sl-rail-is-next-cca-now)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsNextCcaNow()](packet-tx#rail-is-next-cca-now)|
|[sl_rail_is_rf_sensed(sl_rail_handle_t rail_handle)](rf-sense#sl-rail-is-rf-sensed)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IsRFSensed()|
|[sl_rail_is_rx_auto_ack_paused(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-is-rx-auto-ack-paused)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsRxAutoAckPaused()](auto-ack#rail-is-rx-auto-ack-paused)|
|[sl_rail_is_timer_expired(sl_rail_handle_t rail_handle)](system-timing#sl-rail-is-timer-expired)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsTimerExpired()](system-timing#rail-is-timer-expired)|
|[sl_rail_is_timer_running(sl_rail_handle_t rail_handle)](system-timing#sl-rail-is-timer-running)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsTimerRunning()](system-timing#rail-is-timer-running)|
|[sl_rail_is_tx_auto_ack_paused(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-is-tx-auto-ack-paused)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsTxAutoAckPaused()](auto-ack#rail-is-tx-auto-ack-paused)|
|[sl_rail_is_tx_hold_off_enabled(sl_rail_handle_t rail_handle)](transmit#sl-rail-is-tx-hold-off-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsTxHoldOffEnabled()](transmit#rail-is-tx-hold-off-enabled)|
|[sl_rail_is_valid_channel(sl_rail_handle_t rail_handle, uint16_t channel)](radio-configuration#sl-rail-is-valid-channel)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsValidChannel()](radio-configuration#rail-is-valid-channel)|
|[sl_rail_is_vdet_enabled(sl_rail_handle_t radio_handle)](vdet#sl-rail-is-vdet-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_IsVdetEnabled()](vdet#rail-is-vdet-enabled)|
|[sl_rail_pause_rx_auto_ack(sl_rail_handle_t rail_handle, bool pause)](auto-ack#sl-rail-pause-rx-auto-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_PauseRxAutoAck()](auto-ack#rail-pause-rx-auto-ack)|
|[sl_rail_pause_tx_auto_ack(sl_rail_handle_t rail_handle, bool pause)](auto-ack#sl-rail-pause-tx-auto-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_PauseTxAutoAck()](auto-ack#rail-pause-tx-auto-ack)|
|[sl_rail_peek_rx_packet(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle, uint8_t *p_dest, uint16_t peek_bytes, uint16_t offset_bytes)](receive#sl-rail-peek-rx-packet)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_PeekRxPacket()](receive#rail-peek-rx-packet)|
|[sl_rail_prepare_channel(sl_rail_handle_t rail_handle, uint16_t channel)](radio-configuration#sl-rail-prepare-channel)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_PrepareChannel()](radio-configuration#rail-prepare-channel)|
|[sl_rail_read_rx_fifo(sl_rail_handle_t rail_handle, uint8_t *p_data, uint16_t read_bytes)](data-management#sl-rail-read-rx-fifo)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ReadRxFifo()](data-management#rail-read-rx-fifo)|
|[sl_rail_release_rx_packet(sl_rail_handle_t rail_handle, sl_rail_rx_packet_handle_t packet_handle)](receive#sl-rail-release-rx-packet)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ReleaseRxPacket()](receive#rail-release-rx-packet)|
|[sl_rail_reset_address_filter(sl_rail_handle_t rail_handle)](address-filtering#sl-rail-reset-address-filter)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ResetAddressFilter()](address-filtering#rail-reset-address-filter)|
|[sl_rail_reset_crc_init_val(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-reset-crc-init-val)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ResetCrcInitVal()](radio-configuration#rail-reset-crc-init-val)|
|[sl_rail_reset_fifo(sl_rail_handle_t rail_handle, bool tx_fifo, bool rx_fifo)](data-management#sl-rail-reset-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ResetFifo()](data-management#rail-reset-fifo)|
|[sl_rail_reset_whitening_init_val(sl_rail_handle_t rail_handle)](radio-configuration#sl-rail-reset-whitening-init-val)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_ResetWhiteningInitVal()](radio-configuration#rail-reset-whitening-init-val)|
|[sl_rail_set_address_filter_address(sl_rail_handle_t rail_handle, uint8_t field, uint8_t index, const uint8_t *p_value, bool enable)](address-filtering#sl-rail-set-address-filter-address)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetAddressFilterAddress()](address-filtering#rail-set-address-filter-address)|
|[sl_rail_set_address_filter_address_mask(sl_rail_handle_t rail_handle, uint8_t field, const uint8_t *p_bitmask)](address-filtering#sl-rail-set-address-filter-address-mask)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetAddressFilterAddressMask()](address-filtering#rail-set-address-filter-address-mask)|
|[sl_rail_set_auto_ack_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_ack_fifo, uint16_t size_bytes, uint16_t init_bytes)](auto-ack#sl-rail-set-auto-ack-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetAutoAckFifo()|
|[sl_rail_set_cca_threshold(sl_rail_handle_t rail_handle, int8_t cca_threshold_dbm)](transmit#sl-rail-set-cca-threshold)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetCcaThreshold()](transmit#rail-set-cca-threshold)|
|[sl_rail_set_crc_init_val(sl_rail_handle_t rail_handle, uint32_t crc_init)](radio-configuration#sl-rail-set-crc-init-val)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetCrcInitVal()](radio-configuration#rail-set-crc-init-val)|
|[sl_rail_set_fixed_length(sl_rail_handle_t rail_handle, uint16_t bytes)](radio-configuration#sl-rail-set-fixed-length)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetFixedLength()](radio-configuration#rail-set-fixed-length)|
|[sl_rail_set_freq_offset(sl_rail_handle_t rail_handle, sl_rail_frequency_offset_t freq_offset)](diagnostic#sl-rail-set-freq-offset)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetFreqOffset()](diagnostic#rail-set-freq-offset)|
|[sl_rail_set_mfm_ping_pong_fifo(sl_rail_handle_t rail_handle, const sl_rail_mfm_ping_pong_buffer_config_t *p_config)](mfm#sl-rail-set-mfm-ping-pong-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetMfmPingPongFifo()](mfm#rail-set-mfm-ping-pong-fifo)|
|[sl_rail_set_multi_timer(sl_rail_handle_t rail_handle, sl_rail_multi_timer_t *p_tmr, sl_rail_time_t expiration_time, sl_rail_time_mode_t expiration_mode, sl_rail_multi_timer_callback_t expiration_callback, void *cb_arg)](system-timing#sl-rail-set-multi-timer)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetMultiTimer()](system-timing#rail-set-multi-timer)|
|[sl_rail_set_next_tx_repeat(sl_rail_handle_t rail_handle, const sl_rail_tx_repeat_config_t *p_repeat_config)](state-transitions#sl-rail-set-next-tx-repeat)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetNextTxRepeat()](state-transitions#rail-set-next-tx-repeat)|
|[sl_rail_set_pti_protocol(sl_rail_handle_t rail_handle, sl_rail_pti_protocol_t protocol)](pti#sl-rail-set-pti-protocol)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetPtiProtocol()](pti#rail-set-pti-protocol)|
|[sl_rail_set_rf_sense_selective_ook_wakeup_payload(sl_rail_handle_t rail_handle, uint8_t sync_word_bytes, uint32_t sync_word)](rf-sense#sl-rail-set-rf-sense-selective-ook-wakeup-payload)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetRFSenseSelectiveOokWakeupPayload()|
|[sl_rail_set_rssi_detect_threshold(sl_rail_handle_t rail_handle, int8_t rssi_threshold_dbm)](receive#sl-rail-set-rssi-detect-threshold)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetRssiDetectThreshold()](receive#rail-set-rssi-detect-threshold)|
|[sl_rail_set_rssi_offset(sl_rail_handle_t rail_handle, int8_t rssi_offset_db)](receive#sl-rail-set-rssi-offset)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetRssiOffset()](receive#rail-set-rssi-offset)|
|[sl_rail_set_rx_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_addr, uint16_t *p_size_bytes)](data-management#sl-rail-set-rx-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetRxFifo()](data-management#rail-set-rx-fifo)|
|[sl_rail_set_rx_fifo_threshold(sl_rail_handle_t rail_handle, uint16_t rx_threshold_bytes)](data-management#sl-rail-set-rx-fifo-threshold)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetRxFifoThreshold()](data-management#rail-set-rx-fifo-threshold)|
|[sl_rail_set_rx_packet_queue(sl_rail_handle_t rail_handle, sl_rail_packet_queue_entry_t *p_rx_packet_queue, uint16_t *p_entries)](data-management#sl-rail-set-rx-packet-queue)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetRxPacketQueue()|
|[sl_rail_set_rx_transitions(sl_rail_handle_t rail_handle, const sl_rail_state_transitions_t *p_transitions)](state-transitions#sl-rail-set-rx-transitions)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetRxTransitions()](state-transitions#rail-set-rx-transitions)|
|[sl_rail_set_state_timing(sl_rail_handle_t rail_handle, sl_rail_state_timing_t *p_timings)](state-transitions#sl-rail-set-state-timing)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetStateTiming()](state-transitions#rail-set-state-timing)|
|[sl_rail_set_task_priority(sl_rail_handle_t rail_handle, uint8_t priority, sl_rail_task_type_t task_type)](multiprotocol#sl-rail-set-task-priority)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTaskPriority()](multiprotocol#rail-set-task-priority)|
|[sl_rail_set_time(sl_rail_handle_t rail_handle, sl_rail_time_t time)](system-timing#sl-rail-set-time)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTime()](system-timing#rail-set-time)|
|[sl_rail_set_timer(sl_rail_handle_t rail_handle, sl_rail_time_t time, sl_rail_time_mode_t mode, sl_rail_timer_callback_t expiration_callback)](system-timing#sl-rail-set-timer)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTimer()](system-timing#rail-set-timer)|
|[sl_rail_set_transition_time(sl_rail_handle_t radio_handle, sl_rail_time_t transition_time_us)](multiprotocol#sl-rail-set-transition-time)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTransitionTime()](multiprotocol#rail-set-transition-time)|
|[sl_rail_set_tune(sl_rail_handle_t rail_handle, uint32_t tune)](diagnostic#sl-rail-set-tune)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTune()](diagnostic#rail-set-tune)|
|[sl_rail_set_tune_delta(sl_rail_handle_t rail_handle, int32_t delta)](diagnostic#sl-rail-set-tune-delta)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTuneDelta()](diagnostic#rail-set-tune-delta)|
|[sl_rail_set_tx_alt_preamble_length(sl_rail_handle_t rail_handle, uint16_t bits)](transmit#sl-rail-set-tx-alt-preamble-length)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTxAltPreambleLength()](transmit#rail-set-tx-alt-preamble-length)|
|[sl_rail_set_tx_fifo(sl_rail_handle_t rail_handle, sl_rail_fifo_buffer_align_t *p_addr, uint16_t size_bytes, uint16_t init_bytes, uint16_t start_offset_bytes)](data-management#sl-rail-set-tx-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTxFifo()](data-management#rail-set-tx-fifo)|
|[sl_rail_set_tx_fifo_threshold(sl_rail_handle_t rail_handle, uint16_t tx_threshold_bytes)](data-management#sl-rail-set-tx-fifo-threshold)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTxFifoThreshold()](data-management#rail-set-tx-fifo-threshold)|
|[sl_rail_set_tx_pa_ramp_time(sl_rail_handle_t rail_handle, uint16_t ramp_time_us)](pa#sl-rail-set-tx-pa-ramp-time)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetTxPaRampTime()|
|[sl_rail_set_tx_pa_voltage(sl_rail_handle_t rail_handle, uint16_t voltage_mv)](pa#sl-rail-set-tx-pa-voltage)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetTxPaVoltage()|
|[sl_rail_set_tx_power_dbm(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm)](pa#sl-rail-set-tx-power-dbm)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTxPowerDbm()](pa#rail-set-tx-power-dbm)|
|[sl_rail_set_tx_power_dbm_with_pa_mode(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm, sl_rail_tx_pa_mode_t pa_mode)](pa#sl-rail-set-tx-power-dbm-with-pa-mode)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SetTxPowerDbmWithPaMode()|
|[sl_rail_set_tx_transitions(sl_rail_handle_t rail_handle, const sl_rail_state_transitions_t *p_transitions)](state-transitions#sl-rail-set-tx-transitions)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetTxTransitions()](state-transitions#rail-set-tx-transitions)|
|[sl_rail_set_whitening_init_val(sl_rail_handle_t rail_handle, uint16_t white_init)](radio-configuration#sl-rail-set-whitening-init-val)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SetWhiteningInitVal()](radio-configuration#rail-set-whitening-init-val)|
|[sl_rail_sidewalk_config_phy_2gfsk_50_kbps(sl_rail_handle_t rail_handle)](sidewalk-phy#sl-rail-sidewalk-config-phy-2gfsk-50-kbps)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Sidewalk_ConfigPhy2GFSK50kbps()](sidewalk-phy#rail-sidewalk-config-phy2-gfsk50kbps)|
|[sl_rail_sleep(uint16_t wakeup_process_time_us, bool *p_deep_sleep_allowed)](sleep#sl-rail-sleep)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Sleep()](sleep#rail-sleep)|
|[sl_rail_start_average_rssi(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_time_t averaging_time_us, const sl_rail_scheduler_info_t *p_scheduler_info)](receive#sl-rail-start-average-rssi)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartAverageRssi()](receive#rail-start-average-rssi)|
|[sl_rail_start_cca_csma_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_csma_config_t *p_csma_config, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-cca-csma-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartCcaCsmaTx()](packet-tx#rail-start-cca-csma-tx)|
|[sl_rail_start_cca_lbt_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_lbt_config_t *p_lbt_config, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-cca-lbt-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartCcaLbtTx()](packet-tx#rail-start-cca-lbt-tx)|
|[sl_rail_start_rf_sense(sl_rail_handle_t rail_handle, sl_rail_rf_sense_band_t band, sl_rail_time_t sense_time_us, sl_rail_rf_sense_callback_t cb)](rf-sense#sl-rail-start-rf-sense)|sl_rail_time_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_StartRFSense()|
|[sl_rail_start_rx(sl_rail_handle_t rail_handle, uint16_t channel, const sl_rail_scheduler_info_t *p_scheduler_info)](receive#sl-rail-start-rx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartRx()](receive#rail-start-rx)|
|[sl_rail_start_scheduled_cca_csma_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_csma_config_t *p_csma_config, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-scheduled-cca-csma-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartScheduledCcaCsmaTx()](packet-tx#rail-start-scheduled-cca-csma-tx)|
|[sl_rail_start_scheduled_cca_lbt_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_lbt_config_t *p_lbt_config, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-scheduled-cca-lbt-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartScheduledCcaLbtTx()](packet-tx#rail-start-scheduled-cca-lbt-tx)|
|[sl_rail_start_scheduled_rx(sl_rail_handle_t rail_handle, uint16_t channel, const sl_rail_scheduled_rx_config_t *p_scheduled_rx_config, const sl_rail_scheduler_info_t *p_scheduler_info)](receive#sl-rail-start-scheduled-rx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_StartScheduledRx()|
|[sl_rail_start_scheduled_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduled_tx_config_t *p_scheduled_tx_config, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-scheduled-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartScheduledTx()](packet-tx#rail-start-scheduled-tx)|
|[sl_rail_start_selective_ook_rf_sense(sl_rail_handle_t rail_handle, sl_rail_rf_sense_selective_ook_config_t *p_config)](rf-sense#sl-rail-start-selective-ook-rf-sense)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_StartSelectiveOokRFSense()|
|[sl_rail_start_thermistor_measurement(sl_rail_handle_t rail_handle)](external-thermistor#sl-rail-start-thermistor-measurement)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartThermistorMeasurement()](external-thermistor#rail-start-thermistor-measurement)|
|[sl_rail_start_tx(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_tx_options_t tx_options, const sl_rail_scheduler_info_t *p_scheduler_info)](packet-tx#sl-rail-start-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartTx()](packet-tx#rail-start-tx)|
|[sl_rail_start_tx_stream(sl_rail_handle_t rail_handle, uint16_t channel, sl_rail_stream_mode_t mode, sl_rail_tx_options_t tx_options)](diagnostic#sl-rail-start-tx-stream)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StartTxStream()](diagnostic#rail-start-tx-stream)|
|[sl_rail_stop_infinite_preamble_tx(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-stop-infinite-preamble-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StopInfinitePreambleTx()](diagnostic#rail-stop-infinite-preamble-tx)|
|[sl_rail_stop_tx(sl_rail_handle_t rail_handle, sl_rail_stop_mode_t mode)](transmit#sl-rail-stop-tx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StopTx()](transmit#rail-stop-tx)|
|[sl_rail_stop_tx_stream(sl_rail_handle_t rail_handle)](diagnostic#sl-rail-stop-tx-stream)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_StopTxStream()](diagnostic#rail-stop-tx-stream)|
|[sl_rail_supports_2p4_ghz_band(sl_rail_handle_t rail_handle)](features#sl-rail-supports-2p4-ghz-band)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Supports2p4GHzBand()](features#rail-supports2p4-g-hz-band)|
|[sl_rail_supports_addr_filter_address_bit_mask(sl_rail_handle_t rail_handle)](features#sl-rail-supports-addr-filter-address-bit-mask)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsAddrFilterAddressBitMask()](features#rail-supports-addr-filter-address-bit-mask)|
|[sl_rail_supports_addr_filter_mask(sl_rail_handle_t rail_handle)](features#sl-rail-supports-addr-filter-mask)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsAddrFilterMask()](features#rail-supports-addr-filter-mask)|
|[sl_rail_supports_alternate_tx_power(sl_rail_handle_t rail_handle)](features#sl-rail-supports-alternate-tx-power)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsAlternateTxPower()](features#rail-supports-alternate-tx-power)|
|[sl_rail_supports_antenna_diversity(sl_rail_handle_t rail_handle)](features#sl-rail-supports-antenna-diversity)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsAntennaDiversity()](features#rail-supports-antenna-diversity)|
|[sl_rail_supports_aux_adc(sl_rail_handle_t rail_handle)](features#sl-rail-supports-aux-adc)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsAuxAdc()](features#rail-supports-aux-adc)|
|[sl_rail_supports_channel_hopping(sl_rail_handle_t rail_handle)](features#sl-rail-supports-channel-hopping)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsChannelHopping()](features#rail-supports-channel-hopping)|
|[sl_rail_supports_collision_detection(sl_rail_handle_t rail_handle)](features#sl-rail-supports-collision-detection)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsCollisionDetection()](features#rail-supports-collision-detection)|
|[sl_rail_supports_direct_mode(sl_rail_handle_t rail_handle)](features#sl-rail-supports-direct-mode)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsDirectMode()](features#rail-supports-direct-mode)|
|[sl_rail_supports_dual_band(sl_rail_handle_t rail_handle)](features#sl-rail-supports-dual-band)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsDualBand()](features#rail-supports-dual-band)|
|[sl_rail_supports_dual_sync_words(sl_rail_handle_t rail_handle)](features#sl-rail-supports-dual-sync-words)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsDualSyncWords()](features#rail-supports-dual-sync-words)|
|[sl_rail_supports_external_thermistor(sl_rail_handle_t rail_handle)](features#sl-rail-supports-external-thermistor)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsExternalThermistor()](features#rail-supports-external-thermistor)|
|[sl_rail_supports_fast_rx_to_rx(sl_rail_handle_t rail_handle)](features#sl-rail-supports-fast-rx-to-rx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsFastRxToRx()|
|[sl_rail_supports_hfxo_compensation(sl_rail_handle_t rail_handle)](features#sl-rail-supports-hfxo-compensation)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsHfxoCompensation()|
|[sl_rail_supports_mfm(sl_rail_handle_t rail_handle)](features#sl-rail-supports-mfm)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsMfm()](features#rail-supports-mfm)|
|[sl_rail_supports_ofdm_pa(sl_rail_handle_t rail_handle)](features#sl-rail-supports-ofdm-pa)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsOfdmPa()|
|[sl_rail_supports_path_diversity(sl_rail_handle_t rail_handle)](features#sl-rail-supports-path-diversity)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsPathDiversity()](features#rail-supports-path-diversity)|
|[sl_rail_supports_precision_lfrco(sl_rail_handle_t rail_handle)](features#sl-rail-supports-precision-lfrco)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsPrecisionLfrco()|
|[sl_rail_supports_protocol_ble(sl_rail_handle_t rail_handle)](features#sl-rail-supports-protocol-ble)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsProtocolBle()|
|[sl_rail_supports_protocol_ieee802154(sl_rail_handle_t rail_handle)](features#sl-rail-supports-protocol-ieee802154)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsProtocolIeee802154()|
|[sl_rail_supports_protocol_sidewalk(sl_rail_handle_t rail_handle)](features#sl-rail-supports-protocol-sidewalk)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsProtocolSidewalk()](features#rail-supports-protocol-sidewalk)|
|[sl_rail_supports_protocol_wi_sun(sl_rail_handle_t rail_handle)](features#sl-rail-supports-protocol-wi-sun)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsProtocolWiSun()|
|[sl_rail_supports_protocol_zwave(sl_rail_handle_t rail_handle)](features#sl-rail-supports-protocol-zwave)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsProtocolZwave()|
|[sl_rail_supports_prs_lna_bypass(sl_rail_handle_t rail_handle)](features#sl-rail-supports-prs-lna-bypass)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsPrsLnaBypass()](features#rail-supports-prs-lna-bypass)|
|[sl_rail_supports_radio_entropy(sl_rail_handle_t rail_handle)](features#sl-rail-supports-radio-entropy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsRadioEntropy()](features#rail-supports-radio-entropy)|
|[sl_rail_supports_rf_sense_energy_detection(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rf-sense-energy-detection)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsRFSenseEnergyDetection()|
|[sl_rail_supports_rf_sense_selective_ook(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rf-sense-selective-ook)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsRFSenseSelectiveOok()|
|[sl_rail_supports_rssi_detect_threshold(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rssi-detect-threshold)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsRssiDetectThreshold()](features#rail-supports-rssi-detect-threshold)|
|[sl_rail_supports_rx_direct_mode_data_to_fifo(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rx-direct-mode-data-to-fifo)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsRxDirectModeDataToFifo()](features#rail-supports-rx-direct-mode-data-to-fifo)|
|[sl_rail_supports_rx_duty_cycling(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rx-duty-cycling)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsRxDutyCycling()|
|[sl_rail_supports_rx_raw_data(sl_rail_handle_t rail_handle)](features#sl-rail-supports-rx-raw-data)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsRxRawData()](features#rail-supports-rx-raw-data)|
|[sl_rail_supports_sq_phy(sl_rail_handle_t rail_handle)](features#sl-rail-supports-sq-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_SupportsSqPhy()|
|[sl_rail_supports_sub_ghz_band(sl_rail_handle_t rail_handle)](features#sl-rail-supports-sub-ghz-band)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsSubGHzBand()](features#rail-supports-sub-g-hz-band)|
|[sl_rail_supports_thermal_protection(sl_rail_handle_t rail_handle)](features#sl-rail-supports-thermal-protection)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsThermalProtection()](features#rail-supports-thermal-protection)|
|[sl_rail_supports_trustzone_secure_peripherals(sl_rail_handle_t rail_handle)](features#sl-rail-supports-trustzone-secure-peripherals)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsTrustZoneSecurePeripherals()](features#rail-supports-trust-zone-secure-peripherals)|
|[sl_rail_supports_tx_repeat_start_to_start(sl_rail_handle_t rail_handle)](features#sl-rail-supports-tx-repeat-start-to-start)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsTxRepeatStartToStart()](features#rail-supports-tx-repeat-start-to-start)|
|[sl_rail_supports_tx_to_tx(sl_rail_handle_t rail_handle)](features#sl-rail-supports-tx-to-tx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsTxToTx()](features#rail-supports-tx-to-tx)|
|[sl_rail_supports_vdet(sl_rail_handle_t rail_handle)](features#sl-rail-supports-vdet)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_SupportsVdet()](features#rail-supports-vdet)|
|[sl_rail_trigger_rx_channel_hop(sl_rail_handle_t rail_handle)](rx-channel-hopping#sl-rail-trigger-rx-channel-hop)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_TriggerRxChannelHop()](rx-channel-hopping#rail-trigger-rx-channel-hop)|
|[sl_rail_tz_check_peripherals_secure_states(void)](trust-zone#sl-rail-tz-check-peripherals-secure-states)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_CheckPeripheralsSecureStates()|
|[sl_rail_tz_config_antenna_gpio(const sl_rail_antenna_config_t *p_config)](trust-zone#sl-rail-tz-config-antenna-gpio)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_ConfigAntennaGpio()|
|[sl_rail_tz_configure_hfxo(void)](trust-zone#sl-rail-tz-configure-hfxo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_ConfigureHfxo()|
|[sl_rail_tz_disable_secure_radio_irqs(void)](trust-zone#sl-rail-tz-disable-secure-radio-irqs)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_DisableSecureRadioIrqs()|
|[sl_rail_tz_enable_secure_radio_irqs(void)](trust-zone#sl-rail-tz-enable-secure-radio-irqs)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_EnableSecureRadioIrqs()|
|[sl_rail_tz_init_non_secure(const sl_rail_tz_config_t *p_tz_config)](trust-zone#sl-rail-tz-init-non-secure)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_InitNonSecure()|
|[sl_rail_tz_init_secure(void)](trust-zone#sl-rail-tz-init-secure)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_InitSecure()|
|[sl_rail_tz_radio_clock_enable(void)](trust-zone#sl-rail-tz-radio-clock-enable)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_RadioClockEnable()|
|[sl_rail_tz_radio_perform_m2m_ldma(uint32_t *p_dest, const uint32_t *p_src, uint32_t num_words)](trust-zone#sl-rail-tz-radio-perform-m2m-ldma)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_RadioPerformM2mLdma()|
|[sl_rail_tz_read_internal_temperature(uint16_t *p_internal_temperature_kelvin, bool enable_temperature_interrupts)](trust-zone#sl-rail-tz-read-internal-temperature)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_ReadInternalTemperature()|
|[sl_rail_tz_rfeca_clock_enable(void)](trust-zone#sl-rail-tz-rfeca-clock-enable)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_RfecaClockEnable()|
|[sl_rail_tz_rfeca_is_clock_enabled(void)](trust-zone#sl-rail-tz-rfeca-is-clock-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Tz_RfecaIsClockEnabled()|
|[sl_rail_use_dma(sl_rail_handle_t rail_handle, uint8_t dma_channel)](general#sl-rail-use-dma)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_UseDma()](general#rail-use-dma)|
|[sl_rail_use_tx_fifo_for_auto_ack(sl_rail_handle_t rail_handle)](auto-ack#sl-rail-use-tx-fifo-for-auto-ack)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_UseTxFifoForAutoAck()](auto-ack#rail-use-tx-fifo-for-auto-ack)|
|[sl_rail_util_ieee802154_get_fast_channel_switching_phy_features(void)](ieee802154-fast-channel-switching-api#sl-rail-util-ieee802154-get-fast-channel-switching-phy-features)|sl_rail_ieee802154_phy_features_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_GetFastChannelSwitchingPhyFeatures()|
|[sl_rail_util_ieee802154_get_high_speed_phy_features(void)](ieee802154-high-speed-api#sl-rail-util-ieee802154-get-high-speed-phy-features)|sl_rail_ieee802154_phy_features_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_GetHighSpeedPhyFeatures()|
|[sl_rail_util_ieee802154_get_rx_duty_cycling_phy_features(void)](ieee802154-rx-duty-cycling-api#sl-rail-util-ieee802154-get-rx-duty-cycling-phy-features)|sl_rail_ieee802154_phy_features_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_IEEE802154_GetRxDutyCyclingPhyFeatures()|
|[sl_rail_util_pa_convert_power_to_actual(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_ddbm)](pa-power-conversions#sl-rail-util-pa-convert-power-to-actual)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Util_PaConvertPowerToActual()|
|sl_rail_util_pa_get_power_setting_table(sl_rail_handle_t rail_handle, sl_rail_tx_power_mode_t mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)|const sl_rail_pa_power_setting_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Util_PaGetPowerSettingTable()|
|[sl_rail_util_pa_get_tx_power_limits(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t *p_min_ddbm, sl_rail_tx_power_t *p_max_ddbm, sl_rail_tx_power_t *p_step_ddbm)](pa-power-conversions#sl-rail-util-pa-get-tx-power-limits)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Util_PaGetTxPowerLimits()|
|[sl_rail_util_pa_init_tx_power_table(sl_rail_handle_t radio_handle, const sl_rail_tx_power_table_config_t *p_tx_power_table_config)](pa-power-conversions#sl-rail-util-pa-init-tx-power-table)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Util_PaInitTxPowerTable()|
|[sl_rail_util_pa_post_init(sl_rail_handle_t rail_handle, sl_rail_tx_pa_mode_t pa_mode)](pa-power-conversions#sl-rail-util-pa-post-init)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Util_PaPostInit()|
|[sl_rail_verify_tx_power_conversion(const struct sl_rail_tx_power_table_config *p_config)](pa#sl-rail-verify-tx-power-conversion)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_VerifyTxPowerConversion()|
|[sl_rail_wake(sl_rail_time_t elapsed_time_us)](sleep#sl-rail-wake)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_Wake()](sleep#rail-wake)|
|[sl_rail_wmbus_config(sl_rail_handle_t rail_handle, bool enable_simultaneous_t_c_rx)](wmbus#sl-rail-wmbus-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_WMBus_Config()|
|[sl_rail_wmbus_supports_simultaneous_t_c_rx(sl_rail_handle_t rail_handle)](features#sl-rail-wmbus-supports-simultaneous-t-c-rx)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_WMBus_SupportsSimultaneousTC_RX()|
|[sl_rail_write_auto_ack_fifo(sl_rail_handle_t rail_handle, const uint8_t *p_ack_data, uint16_t ack_bytes)](auto-ack#sl-rail-write-auto-ack-fifo)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_WriteAutoAckFifo()](auto-ack#rail-write-auto-ack-fifo)|
|[sl_rail_write_tx_fifo(sl_rail_handle_t rail_handle, const uint8_t *p_data, uint16_t write_bytes, bool reset)](data-management#sl-rail-write-tx-fifo)|uint16_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_WriteTxFifo()](data-management#rail-write-tx-fifo)|
|[sl_rail_yield_radio(sl_rail_handle_t rail_handle)](multiprotocol#sl-rail-yield-radio)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAIL_YieldRadio()](multiprotocol#rail-yield-radio)|
|[sl_rail_zwave_config_beam_rx(sl_rail_handle_t rail_handle, const sl_rail_zwave_beam_rx_config_t *p_config)](z-wave#sl-rail-zwave-config-beam-rx)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_ConfigBeamRx()|
|[sl_rail_zwave_config_options(sl_rail_handle_t rail_handle, sl_rail_zwave_options_t mask, sl_rail_zwave_options_t options)](z-wave#sl-rail-zwave-config-options)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_ConfigOptions()|
|[sl_rail_zwave_config_region(sl_rail_handle_t rail_handle, const sl_rail_zwave_region_config_t *p_region_config)](z-wave#sl-rail-zwave-config-region)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_ConfigRegion()|
|[sl_rail_zwave_config_rx_channel_hopping(sl_rail_handle_t rail_handle, sl_rail_rx_channel_hopping_config_t *p_config)](z-wave#sl-rail-zwave-config-rx-channel-hopping)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_ConfigRxChannelHopping()|
|[sl_rail_zwave_deinit(sl_rail_handle_t rail_handle)](z-wave#sl-rail-zwave-deinit)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_Deinit()|
|[sl_rail_zwave_get_region(sl_rail_handle_t rail_handle)](z-wave#sl-rail-zwave-get-region)|sl_rail_zwave_region_id_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_GetRegion()|
|[sl_rail_zwave_get_rx_beam_config(sl_rail_handle_t rail_handle, sl_rail_zwave_beam_rx_config_t *p_config)](z-wave#sl-rail-zwave-get-rx-beam-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_GetRxBeamConfig()|
|[sl_rail_zwave_get_rx_beam_details(sl_rail_handle_t rail_handle, sl_rail_zwave_beam_details_t *p_beam_details)](z-wave#sl-rail-zwave-get-rx-beam-details)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_GetRxBeamDetails()|
|[sl_rail_zwave_get_tx_low_power_dbm(sl_rail_handle_t rail_handle)](z-wave#sl-rail-zwave-get-tx-low-power-dbm)|sl_rail_tx_power_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_GetTxLowPowerDbm()|
|[sl_rail_zwave_init(sl_rail_handle_t rail_handle, const sl_rail_zwave_config_t *p_config)](z-wave#sl-rail-zwave-init)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_Init()|
|[sl_rail_zwave_is_enabled(sl_rail_handle_t rail_handle)](z-wave#sl-rail-zwave-is-enabled)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_IsEnabled()|
|[sl_rail_zwave_perform_ir_cal(sl_rail_handle_t rail_handle, sl_rail_zwave_ir_cal_val_t *p_ir_cal_vals, bool force_ir_cal)](z-wave#sl-rail-zwave-perform-ir-cal)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_PerformIrCal()|
|[sl_rail_zwave_receive_beam(sl_rail_handle_t rail_handle, uint8_t *p_beam_detect_index, const sl_rail_scheduler_info_t *p_scheduler_info)](z-wave#sl-rail-zwave-receive-beam)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_ReceiveBeam()|
|[sl_rail_zwave_set_default_rx_beam_config(sl_rail_handle_t rail_handle)](z-wave#sl-rail-zwave-set-default-rx-beam-config)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SetDefaultRxBeamConfig()|
|[sl_rail_zwave_set_home_id(sl_rail_handle_t rail_handle, sl_rail_zwave_home_id_t home_id, sl_rail_zwave_home_id_hash_t home_id_hash)](z-wave#sl-rail-zwave-set-home-id)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SetHomeId()|
|[sl_rail_zwave_set_lr_ack_data(sl_rail_handle_t rail_handle, const sl_rail_zwave_lr_ack_data_t *p_lr_ack_data)](z-wave#sl-rail-zwave-set-lr-ack-data)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SetLRAckData()|
|[sl_rail_zwave_set_node_id(sl_rail_handle_t rail_handle, sl_rail_zwave_node_id_t node_id)](z-wave#sl-rail-zwave-set-node-id)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SetNodeId()|
|[sl_rail_zwave_set_tx_low_power_dbm(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm)](z-wave#sl-rail-zwave-set-tx-low-power-dbm)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SetTxLowPowerDbm()|
|[sl_rail_zwave_supports_conc_phy(sl_rail_handle_t rail_handle)](features#sl-rail-zwave-supports-conc-phy)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SupportsConcPhy()|
|[sl_rail_zwave_supports_region_pti(sl_rail_handle_t rail_handle)](features#sl-rail-zwave-supports-region-pti)|bool|this is a new RAIL 3.0 API deprecating RAIL 2.x RAIL_Zwave_SupportsRegionPti()|
|[sl_railcb_assert_failed(sl_rail_handle_t rail_handle, sl_rail_assert_error_codes_t error_code, int line)](assertions#sl-railcb-assert-failed)|void|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAILCb_AssertFailed()](assertions#rail-cb-assert-failed)|
|[sl_railcb_compute_hfxo_error_ppm(sl_rail_handle_t rail_handle, int16_t crystal_temperature_c, int8_t *p_crystal_error_ppm)](external-thermistor#sl-railcb-compute-hfxo-error-ppm)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAILCb_ComputeHfxoErrorPpm()|
|[sl_railcb_convert_ddbm_to_power_setting_entry(sl_rail_handle_t rail_handle, sl_rail_tx_power_t power_ddbm, sl_rail_tx_pa_mode_t pa_mode, sl_rail_tx_power_t channel_restr_max_power_ddbm, sl_rail_tx_power_setting_entry_t *p_power_setting_info)](pa#sl-railcb-convert-ddbm-to-power-setting-entry)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAILCb_ConvertDdbmToPowerSettingEntry()|
|[sl_railcb_convert_thermistor_impedance(sl_rail_handle_t rail_handle, uint32_t thermistor_impedance_ohms, int16_t *p_thermistor_temperature_8c)](external-thermistor#sl-railcb-convert-thermistor-impedance)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x RAILCb_ConvertThermistorImpedance()|
|[sl_railcb_ieee802154_is_mode_switch_new_channel_valid(sl_rail_handle_t rail_handle, uint32_t current_base_freq_hz, uint8_t new_phy_mode_id, const sl_rail_channel_config_entry_t *p_config_entry_new_phy_mode_id, uint16_t *p_channel)](ieee802-15-4#sl-railcb-ieee802154-is-mode-switch-new-channel-valid)|sl_rail_status_t|this is a new RAIL 3.0 API deprecating RAIL 2.x [RAILCb_IEEE802154_IsModeSwitchNewChannelValid()](ieee802-15-4#rail-cb-ieee802154-is-mode-switch-new-channel-valid)|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|[sl_rail_util_pa_on_channel_config_change(RAIL_Handle_t rail_handle, const RAIL_ChannelConfigEntry_t *entry)](pa-curve-conversions#sl-rail-util-pa-on-channel-config-change)|void|[sl_rail_util_pa_on_channel_config_change(sl_rail_handle_t rail_handle, const sl_rail_channel_config_entry_t *p_entry)](pa-power-conversions#sl-rail-util-pa-on-channel-config-change)|void|this API has been modified per RAIL 3.0 specifications|

##### RAIL Library 2.19.2

No changes

##### RAIL Library 2.19.1

No changes

##### RAIL Library 2.19.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[sl_rail_util_pa_nvm_read_config(sl_rail_nvm_pa_config_t *p_pa_config)](pa#sl-rail-util-pa-nvm-read-config)|sl_status_t|new API that reads stored [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) from NVM|
|[sl_rail_util_pa_nvm_read_mode(void)](pa#sl-rail-util-pa-nvm-read-mode)|RAIL_TxPowerMode_t|new API that reads stored|

[RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) from NVM | | [sl_rail_util_pa_nvm_write_config(const sl_rail_nvm_pa_config_t *p_pa_config)](pa#sl-rail-util-pa-nvm-write-config) | sl_status_t | new API that stores a [sl_rail_nvm_pa_config_t](sl-rail-nvm-pa-config-t) into NVM | | [sl_rail_util_pa_nvm_write_mode(RAIL_TxPowerMode_t pa_mode)](pa#sl-rail-util-pa-nvm-write-mode) | sl_status_t | new API that stores a [RAIL_TxPowerMode_t](pa#rail-tx-power-mode-t) into NVM |

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|RAIL_ZWAVE_ConfigBeamRx(RAIL_Handle_t railHandle, RAIL_ZWAVE_BeamRxConfig_t *config)|RAIL_Status_t|[RAIL_ZWAVE_ConfigBeamRx(RAIL_Handle_t railHandle, const RAIL_ZWAVE_BeamRxConfig_t *config)](z-wave#rail-zwave-config-beam-rx)|RAIL_Status_t|API modified|
|[RAIL_ZWAVE_SetTxLowPowerDbm(RAIL_Handle_t railHandle, RAIL_TxPower_t powerLevel)](z-wave#rail-zwave-set-tx-low-power-dbm)|RAIL_Status_t|[RAIL_ZWAVE_SetTxLowPowerDbm(RAIL_Handle_t railHandle, RAIL_TxPower_t power)](z-wave#rail-zwave-set-tx-low-power-dbm)|RAIL_Status_t|API modified|

##### RAIL Library 2.18.2

No changes

##### RAIL Library 2.18.1

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ConvertDbmToPowerSettingEntry(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t power, RAIL_TxPowerSettingEntry_t *pPowerSettingInfo)](pa#rail-convert-dbm-to-power-setting-entry)|RAIL_Status_t|API to convert desired decibel value to a [RAIL_TxPowerSettingEntry_t](rail-tx-power-setting-entry-t)|
|[RAIL_TriggerRxChannelHop(RAIL_Handle_t railHandle)](rx-channel-hopping#rail-trigger-rx-channel-hop)|RAIL_Status_t|API to trigger RX channel hopping manually|

##### RAIL Library 2.18.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ConfigChannelsAlt(RAIL_Handle_t railHandle, const RAIL_ChannelConfig_t *config, RAIL_RadioConfigChangedCallback_t cb)](radio-configuration#rail-config-channels-alt)|RAIL_Status_t|new API to just configure the channels but not tune the radio to the first channel|
|[RAIL_GetRxIncomingPacketRssi(RAIL_Handle_t railHandle)](receive#rail-get-rx-incoming-packet-rssi)|int8_t|new API to return the RSSI associated with the incoming packet|
|[RAIL_SupportsTrustZoneSecurePeripherals(RAIL_Handle_t railHandle)](features#rail-supports-trust-zone-secure-peripherals)|bool|new API to be used by trustzone secured application to indicate whether the chip supports TrustZone secure configuration of peripherals used by RAIL|
|[RAIL_TZ_CheckPeripheralsSecureStates(void)](trust-zone#rail-tz-check-peripherals-secure-states)|RAIL_Status_t|new API to be used by trustzone secured application to check the secure state of peripherals used by RAIL|
|[RAIL_TZ_ConfigAntennaGpio(const RAIL_AntennaConfig_t *config)](trust-zone#rail-tz-config-antenna-gpio)|RAIL_Status_t|new API to be used by trustzone secured application to set GPIO for antenna config|
|[RAIL_TZ_ConfigureHfxo(void)](trust-zone#rail-tz-configure-hfxo)|RAIL_Status_t|new API to be used by trustzone secured application to configure HFXO|
|[RAIL_TZ_DisableSecureRadioIrqs(void)](trust-zone#rail-tz-disable-secure-radio-irqs)|RAIL_Status_t|new API to be used by trustzone secured application to disable secure peripheral interrupts needed by the radio|
|[RAIL_TZ_EnableSecureRadioIrqs(void)](trust-zone#rail-tz-enable-secure-radio-irqs)|RAIL_Status_t|new API to be used by trustzone secured application to enable secure peripheral interrupts needed by the radio|
|[RAIL_TZ_InitNonSecure(const RAIL_TZ_Config_t *pTzConfig)](trust-zone#rail-tz-init-non-secure)|RAIL_Status_t|new API to be used by trustzone secured application to initialize RAIL TrustZone feature for non-secure world|
|[RAIL_TZ_InitSecure(void)](trust-zone#rail-tz-init-secure)|RAIL_Status_t|new API to be used by trustzone secured application to initialize RAIL TrustZone feature for secure world|
|[RAIL_TZ_RadioClockEnable(void)](trust-zone#rail-tz-radio-clock-enable)|RAIL_Status_t|new API to be used by trustzone secured application to enable radio clocks|
|[RAIL_TZ_RadioPerformM2mLdma(uint32_t *pDest, const uint32_t *pSrc, uint32_t numWords)](trust-zone#rail-tz-radio-perform-m2m-ldma)|RAIL_Status_t|new API to be used by trustzone secured application to perform LDMA transfer for the radio|
|[RAIL_TZ_ReadInternalTemperature(uint16_t *internalTemperatureKelvin, bool enableTemperatureInterrupts)](trust-zone#rail-tz-read-internal-temperature)|RAIL_Status_t|new API to be used by trustzone secured application to read the internal temperature|
|[RAIL_TZ_RfecaClockEnable(void)](trust-zone#rail-tz-rfeca-clock-enable)|RAIL_Status_t|new API to be used by trustzone secured application to enable RFECA clocks|
|[RAIL_TZ_RfecaIsClockEnabled(void)](trust-zone#rail-tz-rfeca-is-clock-enabled)|bool|new API to be used by trustzone secured application to tell whether RFECA clocks are enabled|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|RAIL_EnableAutoLnaBypass(RAIL_Handle_t railHandle, bool enable, const RAIL_AutoLnaBypassConfig_t *pAutoLnaBypassConfig)|RAIL_Status_t|[RAIL_EnablePrsLnaBypass(RAIL_Handle_t railHandle, bool enable, const RAIL_PrsLnaBypassConfig_t *pPrsLnaBypassConfig)](receive#rail-enable-prs-lna-bypass)|RAIL_Status_t|API RAIL_EnableAutoLnaBypass() is replaced by [RAIL_EnablePrsLnaBypass()](receive#rail-enable-prs-lna-bypass)|
|RAIL_SupportsAutoLnaBypass(RAIL_Handle_t railHandle)|bool|[RAIL_SupportsPrsLnaBypass(RAIL_Handle_t railHandle)](features#rail-supports-prs-lna-bypass)|bool|API RAIL_SupportsAutoLnaBypass() is replaced by [RAIL_SupportsPrsLnaBypass()](features#rail-supports-prs-lna-bypass)|

##### RAIL Library 2.17.2

No changes

##### RAIL Library 2.17.1

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|RAIL_EnableAutoLnaBypass(RAIL_Handle_t railHandle, bool enable, const RAIL_AutoLnaBypassConfig_t *pAutoLnaBypassConfig)|RAIL_Status_t|API to enable automatic LNA bypass for external FEM|
|RAIL_SupportsAutoLnaBypass(RAIL_Handle_t railHandle)|bool|API to indicate whether this chip supports automatic LNA bypass for external FEM.|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|[RAIL_BLE_PhySwitchToRx(RAIL_Handle_t railHandle, RAIL_BLE_Phy_t phy, uint16_t railChannel, uint32_t startRxTime, uint32_t crcInit, uint32_t accessAddress, uint16_t logicalChannel, bool disableWhitening)](ble#rail-ble-phy-switch-to-rx)|RAIL_Status_t|[RAIL_BLE_PhySwitchToRx(RAIL_Handle_t railHandle, RAIL_BLE_Phy_t phy, uint16_t railChannel, RAIL_Time_t startRxTime, uint32_t crcInit, uint32_t accessAddress, uint16_t logicalChannel, bool disableWhitening)](ble#rail-ble-phy-switch-to-rx)|RAIL_Status_t|Changed the data type of the startRxTime from uint32_t to RAIL_Time_t|
|RAIL_ConfigSleepAlt(RAIL_Handle_t railHandle, RAIL_TimerSyncConfig_t *syncConfig)|RAIL_Status_t|[RAIL_ConfigSleepAlt(RAIL_Handle_t railHandle, const RAIL_TimerSyncConfig_t *syncConfig)](sleep#rail-config-sleep-alt)|RAIL_Status_t|Added const to [RAIL_TimerSyncConfig_t](rail-timer-sync-config-t) *syncConfig|
|RAIL_Init(RAIL_Config_t *railCfg, RAIL_InitCompleteCallbackPtr_t cb)|RAIL_Handle_t|[RAIL_Init(const RAIL_Config_t *railCfg, RAIL_InitCompleteCallbackPtr_t cb)](general#rail-init)|RAIL_Handle_t|Added const to [RAIL_Config_t](rail-config-t) *railCfg|

##### RAIL Library 2.17.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ConfigVdet(RAIL_Handle_t genericRailHandle, const RAIL_VdetConfig_t *config)](vdet#rail-config-vdet)|RAIL_Status_t|API to configure VDET plugin|
|[RAIL_EnableVdet(RAIL_Handle_t genericRailHandle, bool enable)](vdet#rail-enable-vdet)|RAIL_Status_t|API to enable VDET plugin|
|[RAIL_GetVdet(RAIL_Handle_t genericRailHandle, uint32_t *pVdetMv)](vdet#rail-get-vdet)|RAIL_Status_t|API to get the VDET measurement|
|[RAIL_GetVdetConfig(RAIL_Handle_t genericRailHandle, RAIL_VdetConfig_t *config)](vdet#rail-get-vdet-config)|RAIL_Status_t|API to get the VDET plugin configuration|
|[RAIL_IsVdetEnabled(RAIL_Handle_t genericRailHandle)](vdet#rail-is-vdet-enabled)|bool|API to check if VDET is enabled|
|[RAIL_SupportsPathDiversity(RAIL_Handle_t railHandle)](features#rail-supports-path-diversity)|bool|API to indicate if the chip supports internal RF path diversity|
|[RAIL_SupportsVdet(RAIL_Handle_t railHandle)](features#rail-supports-vdet)|bool|API to indicate if the chip supports VDET|

##### Removed

|Old API Name|Return Value|Comment|
|---|---|---|
|RAIL_ConfigEff(RAIL_Handle_t genericRailHandle, const RAIL_EffConfig_t *config)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcControl(RAIL_Handle_t railHandle, uint16_t tempBuffer[(52U)/sizeof(uint16_t)], bool reset)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcEnable(RAIL_Handle_t railHandle, uint8_t *newClpcEnable, bool changeClpcEnable)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcFastLoop(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, uint16_t *newTargetMv, uint16_t *newSlopeMvPerPaLevel, bool changeValues)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcFastLoopCal(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, RAIL_EffCalConfig_t *calibrationEntry, bool changeValues)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcFastLoopCalSlp(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, int16_t *newSlope1e1MvPerDdbm, int16_t *newoffset290Ddbm, bool changeValues)|RAIL_Status_t|API removed|
|RAIL_GetSetEffClpcFemdata(RAIL_Handle_t railHandle, uint8_t *newMode, bool changeMode)|RAIL_Status_t|API removed|
|RAIL_GetSetEffLnaBypassDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|API removed|
|RAIL_GetSetEffLnaRuralUrbanMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|API removed|
|RAIL_GetSetEffLnaUrbanBypassMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|API removed|
|RAIL_GetSetEffLnaUrbanDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|API removed|
|RAIL_GetSetEffTempThreshold(RAIL_Handle_t railHandle, uint16_t *newThresholdK, bool changeThreshold)|RAIL_Status_t|API removed|
|RAIL_SupportsEff(RAIL_Handle_t railHandle)|bool|API removed|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|[RAIL_BLE_Deinit(RAIL_Handle_t railHandle)](ble#rail-ble-deinit)|void|[RAIL_BLE_Deinit(RAIL_Handle_t railHandle)](ble#rail-ble-deinit)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_BLE_Init(RAIL_Handle_t railHandle)](ble#rail-ble-init)|void|[RAIL_BLE_Init(RAIL_Handle_t railHandle)](ble#rail-ble-init)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_CancelTimer(RAIL_Handle_t railHandle)](system-timing#rail-cancel-timer)|void|[RAIL_CancelTimer(RAIL_Handle_t railHandle)](system-timing#rail-cancel-timer)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_EnableTxHoldOff(RAIL_Handle_t railHandle, bool enable)](transmit#rail-enable-tx-hold-off)|void|[RAIL_EnableTxHoldOff(RAIL_Handle_t railHandle, bool enable)](transmit#rail-enable-tx-hold-off)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_GetRxIncomingPacketInfo(RAIL_Handle_t railHandle, RAIL_RxPacketInfo_t *pPacketInfo)](packet-information#rail-get-rx-incoming-packet-info)|void|[RAIL_GetRxIncomingPacketInfo(RAIL_Handle_t railHandle, RAIL_RxPacketInfo_t *pPacketInfo)](packet-information#rail-get-rx-incoming-packet-info)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|RAIL_GetTemperature(RAIL_Handle_t railHandle, int16_t tempBuffer[((3U)+(6U)+(2U)+(1U))], bool reset)|RAIL_Status_t|RAIL_GetTemperature(RAIL_Handle_t railHandle, int16_t tempBuffer[((3U)+(1U))], bool reset)|RAIL_Status_t|Updated the size of the array int16_t tempBuffer|
|[RAIL_GetVersion(RAIL_Version_t *version, bool verbose)](general#rail-get-version)|void|[RAIL_GetVersion(RAIL_Version_t *version, bool verbose)](general#rail-get-version)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|RAIL_IEEE802154_WriteEnhAck(RAIL_Handle_t railHandle, const uint8_t *ackData, uint8_t ackDataLen)|RAIL_Status_t|[RAIL_IEEE802154_WriteEnhAck(RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)](ieee802-15-4#rail-ieee802154-write-enh-ack)|RAIL_Status_t|Updated this API to take uint16_t ackDataLen parameter instead of uint8_t ackDataLen parameter|
|[RAIL_Idle(RAIL_Handle_t railHandle, RAIL_IdleMode_t mode, bool wait)](state-transitions#rail-idle-1)|void|[RAIL_Idle(RAIL_Handle_t railHandle, RAIL_IdleMode_t mode, bool wait)](state-transitions#rail-idle-1)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_IncludeFrameTypeLength(RAIL_Handle_t railHandle)](receive#rail-include-frame-type-length)|void|[RAIL_IncludeFrameTypeLength(RAIL_Handle_t railHandle)](receive#rail-include-frame-type-length)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_PauseRxAutoAck(RAIL_Handle_t railHandle, bool pause)](auto-ack#rail-pause-rx-auto-ack)|void|[RAIL_PauseRxAutoAck(RAIL_Handle_t railHandle, bool pause)](auto-ack#rail-pause-rx-auto-ack)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_PauseTxAutoAck(RAIL_Handle_t railHandle, bool pause)](auto-ack#rail-pause-tx-auto-ack)|void|[RAIL_PauseTxAutoAck(RAIL_Handle_t railHandle, bool pause)](auto-ack#rail-pause-tx-auto-ack)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_ResetAddressFilter(RAIL_Handle_t railHandle)](address-filtering#rail-reset-address-filter)|void|[RAIL_ResetAddressFilter(RAIL_Handle_t railHandle)](address-filtering#rail-reset-address-filter)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_ResetFifo(RAIL_Handle_t railHandle, bool txFifo, bool rxFifo)](data-management#rail-reset-fifo)|void|[RAIL_ResetFifo(RAIL_Handle_t railHandle, bool txFifo, bool rxFifo)](data-management#rail-reset-fifo)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|[RAIL_VerifyTxPowerCurves(const struct RAIL_TxPowerCurvesConfigAlt *config)](pa#rail-verify-tx-power-curves)|void|[RAIL_VerifyTxPowerCurves(const struct RAIL_TxPowerCurvesConfigAlt *config)](pa#rail-verify-tx-power-curves)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|
|RAIL_WriteAutoAckFifo(RAIL_Handle_t railHandle, const uint8_t *ackData, uint8_t ackDataLen)|RAIL_Status_t|[RAIL_WriteAutoAckFifo(RAIL_Handle_t railHandle, const uint8_t *ackData, uint16_t ackDataLen)](auto-ack#rail-write-auto-ack-fifo)|RAIL_Status_t|Updated this API to take uint16_t ackDataLen parameter instead of uint8_t ackDataLen parameter|
|[RAIL_YieldRadio(RAIL_Handle_t railHandle)](multiprotocol#rail-yield-radio)|void|[RAIL_YieldRadio(RAIL_Handle_t railHandle)](multiprotocol#rail-yield-radio)|RAIL_Status_t|Modified this API to return RAIL_Status_t instead of void|

##### RAIL Library 2.16.2

No changes

##### RAIL Library 2.16.1

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetCrcInitVal(RAIL_Handle_t railHandle)](radio-configuration#rail-get-crc-init-val)|uint32_t|A new API to get the CRC initialization value|
|[RAIL_GetWhiteningInitVal(RAIL_Handle_t railHandle)](radio-configuration#rail-get-whitening-init-val)|uint16_t|A new API to get the whitening initialization value|
|[RAIL_ResetCrcInitVal(RAIL_Handle_t railHandle)](radio-configuration#rail-reset-crc-init-val)|RAIL_Status_t|A new API to restore the CRC initialization value to its initial setting from the Radio Configurator|
|[RAIL_ResetWhiteningInitVal(RAIL_Handle_t railHandle)](radio-configuration#rail-reset-whitening-init-val)|RAIL_Status_t|A new API to restore the whitening initialization value to its intial setting from the Radio Configurator|
|[RAIL_SetCrcInitVal(RAIL_Handle_t railHandle, uint32_t crcInit)](radio-configuration#rail-set-crc-init-val)|RAIL_Status_t|A new API to set the CRC initialization value|
|[RAIL_SetWhiteningInitVal(RAIL_Handle_t railHandle, uint16_t whiteInit)](radio-configuration#rail-set-whitening-init-val)|RAIL_Status_t|A new API to set the whitening initialization value|

##### RAIL Library 2.16.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAILCb_IEEE802154_IsModeSwitchNewChannelValid(uint32_t currentBaseFreq, uint8_t newPhyModeId, const RAIL_ChannelConfigEntry_t *configEntryNewPhyModeId, uint16_t *pChannel)](ieee802-15-4#rail-cb-ieee802154-is-mode-switch-new-channel-valid)|RAIL_Status_t|A new API to check if the mode switch channel is valid|
|[RAIL_SupportsCollisionDetection(RAIL_Handle_t railHandle)](features#rail-supports-collision-detection)|bool|A new API to indicate if the chip supports Collision detection feature|

##### RAIL Library 2.15.2

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_SupportsTxRepeatStartToStart(RAIL_Handle_t railHandle)](features#rail-supports-tx-repeat-start-to-start)|bool|See [RAIL Changelist](changelist) 1131398|

##### RAIL Library 2.15.1

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetAutoAckFifo(RAIL_Handle_t railHandle, uint8_t **ackBuffer, uint16_t *ackBufferBytes)](auto-ack#rail-get-auto-ack-fifo)|RAIL_Status_t|See [RAIL Changelist](changelist) 748817|
|[RAIL_Sidewalk_ConfigPhy2GFSK50kbps(RAIL_Handle_t railHandle)](sidewalk-phy#rail-sidewalk-config-phy2-gfsk50kbps)|RAIL_Status_t|Function to load the Sidewalk 2GFSK 50kbps PHY|
|[RAIL_SupportsProtocolSidewalk(RAIL_Handle_t railHandle)](features#rail-supports-protocol-sidewalk)|bool|API to determine at runtime when Sidewalk PHYs are supported|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|[RAIL_ConfigVerification(RAIL_Handle_t railHandle, RAIL_VerifyConfig_t *configVerify, const uint32_t *radioConfig, RAIL_VerifyCallbackPtr_t cb)](diagnostic#rail-config-verification)|RAIL_Status_t|[RAIL_ConfigVerification(RAIL_Handle_t railHandle, RAIL_VerifyConfig_t *configVerify, RAIL_RadioConfig_t radioConfig, RAIL_VerifyCallbackPtr_t cb)](diagnostic#rail-config-verification)|RAIL_Status_t||

##### RAIL Library 2.15.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_EnableCacheSynthCal(RAIL_Handle_t railHandle, bool enable)](state-transitions#rail-enable-cache-synth-cal)|RAIL_Status_t|See [RAIL Changelist](changelist) item 1061665.|
|RAIL_GetSetEffClpcFemdata(RAIL_Handle_t railHandle, uint8_t *newMode, bool changeMode)|RAIL_Status_t|New alpha API.|
|[RAIL_IEEE802154_SetRxToEnhAckTx(RAIL_Handle_t railHandle, RAIL_TransitionTime_t *pRxToEnhAckTx)](ieee802-15-4#rail-ieee802154-set-rx-to-enh-ack-tx)|RAIL_Status_t|See [RAIL Changelist](changelist) item 1117127.|
|[RAIL_SetTxFifoAlt(RAIL_Handle_t railHandle, uint8_t *addr, uint16_t startOffset, uint16_t initLength, uint16_t size)](data-management#rail-set-tx-fifo-alt)|uint16_t|See [RAIL Changelist](changelist) item 1103587.|
|[RAIL_SupportsFastRx2Rx(RAIL_Handle_t railHandle)](features#rail-supports-fast-rx2-rx)|bool|Added to help determine Fast RX2RX support at runtime.|
|[RAIL_SupportsProtocolWiSUN(RAIL_Handle_t railHandle)](features#rail-supports-protocol-wi-sun)|bool|Added to help determine WiSUN support at runtime.|
|[RAIL_WMBUS_Config(RAIL_Handle_t railHandle, bool enableSimultaneousTCRx)](wmbus#rail-wmbus-config)|RAIL_Status_t|See [RAIL Changelist](changelist) item 1099829.|
|[RAIL_WMBUS_SupportsSimultaneousTCRx(RAIL_Handle_t railHandle)](features#rail-wmbus-supports-simultaneous-tc-rx)|bool|See [RAIL Changelist](changelist) item 1099829.|

##### Removed

|Old API Name|Return Value|Comment|
|---|---|---|
|RAIL_GetSetEffMode(RAIL_Handle_t railHandle, uint8_t *newMode, bool changeMode)|RAIL_Status_t|Removed alpha API.|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|RAIL_GetSetClpcEnable(RAIL_Handle_t railHandle, uint8_t *newClpcEnable, bool changeClpcEnable)|RAIL_Status_t|RAIL_GetSetEffClpcEnable(RAIL_Handle_t railHandle, uint8_t *newClpcEnable, bool changeClpcEnable)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetClpcFastLoop(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, uint16_t *newTargetMv, uint16_t *newSlopeMvPerPaLevel, bool changeValues)|RAIL_Status_t|RAIL_GetSetEffClpcFastLoop(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, uint16_t *newTargetMv, uint16_t *newSlopeMvPerPaLevel, bool changeValues)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetClpcFastLoopCal(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, RAIL_EffCalConfig_t *calibrationEntry, bool changeValues)|RAIL_Status_t|RAIL_GetSetEffClpcFastLoopCal(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, RAIL_EffCalConfig_t *calibrationEntry, bool changeValues)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetClpcFastLoopCalSlp(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, int16_t *newSlope1e1MvPerDdbm, int16_t *newoffset290Ddbm, bool changeValues)|RAIL_Status_t|RAIL_GetSetEffClpcFastLoopCalSlp(RAIL_Handle_t railHandle, RAIL_EffModeSensor_t modeSensorIndex, int16_t *newSlope1e1MvPerDdbm, int16_t *newoffset290Ddbm, bool changeValues)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetEffBypassDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|RAIL_GetSetEffLnaBypassDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetEffControl(RAIL_Handle_t railHandle, uint16_t tempBuffer[(52U)/sizeof(uint16_t)], bool reset)|RAIL_Status_t|RAIL_GetSetEffClpcControl(RAIL_Handle_t railHandle, uint16_t tempBuffer[(52U)/sizeof(uint16_t)], bool reset)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetEffRuralUrbanMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|RAIL_GetSetEffLnaRuralUrbanMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetEffUrbanBypassMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|RAIL_GetSetEffLnaUrbanBypassMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t|Renamed alpha API.|
|RAIL_GetSetEffUrbanDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|RAIL_GetSetEffLnaUrbanDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t|Renamed alpha API.|

##### RAIL Library 2.14.3

No changes

##### RAIL Library 2.14.2

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetPowerSettingTable(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t mode, RAIL_TxPower_t *minPower, RAIL_TxPower_t *maxPower, RAIL_TxPowerLevel_t *step)](pa#rail-get-power-setting-table)|const RAIL_PaPowerSetting_t||
|[RAIL_ZWAVE_GetBeamHomeIdHash(RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeIdHash_t *pBeamHomeIdHash)](z-wave#rail-zwave-get-beam-home-id-hash)|RAIL_Status_t||

##### Removed

|Old API Name|Return Value|Comment|
|---|---|---|
|RAIL_GetFemProtectionConfig(RAIL_Handle_t railHandle, RAIL_FemProtectionConfig_t *femConfig)|RAIL_Status_t|Removed alpha API for EFR32xG25+EFF01 support|
|RAIL_SetFemProtectionConfig(RAIL_Handle_t railHandle, const RAIL_FemProtectionConfig_t *newFemConfig)|RAIL_Status_t|Removed alpha API for EFR32xG25+EFF01 support|

##### RAIL Library 2.14.1

No changes

##### RAIL Library 2.14.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_CalibrateHFXO(RAIL_Handle_t railHandle, int8_t *crystalPPMError)](calibration#rail-calibrate-hfxo)|RAIL_Status_t|See [RAIL Changelist](changelist) item 751910|
|[RAIL_CompensateHFXO(RAIL_Handle_t railHandle, int8_t crystalPPMError)](external-thermistor#rail-compensate-hfxo)|RAIL_Status_t|See [RAIL Changelist](changelist) item 751910|
|[RAIL_ConfigHFXOCompensation(RAIL_Handle_t railHandle, const RAIL_HFXOCompensationConfig_t *pHfxoCompensationConfig)](external-thermistor#rail-config-hfxo-compensation)|RAIL_Status_t|See [RAIL Changelist](changelist) item 751910|
|[RAIL_ConfigThermalProtection(RAIL_Handle_t genericRailHandle, const RAIL_ChipTempConfig_t *chipTempConfig)](thermal-protection#rail-config-thermal-protection)|RAIL_Status_t|See [RAIL Changelist](changelist) item 1022182|
|[RAIL_GetHFXOCompensationConfig(RAIL_Handle_t railHandle, RAIL_HFXOCompensationConfig_t *pHfxoCompensationConfig)](external-thermistor#rail-get-hfxo-compensation-config)|RAIL_Status_t|See [RAIL Changelist](changelist) item 751910|
|[RAIL_GetPaPowerSetting(RAIL_Handle_t railHandle)](pa#rail-get-pa-power-setting)|RAIL_PaPowerSetting_t||
|RAIL_GetSetClpcFastLoopCal(RAIL_Handle_t railHandle, RAIL_EffCalConfigEnum_t calibrationIndex, RAIL_EffCalConfig_t *calibrationEntry, bool changeValues)|RAIL_Status_t||
|RAIL_GetSetClpcFastLoopCalSlp(RAIL_Handle_t railHandle, RAIL_EffCalConfigEnum_t calibrationIndex, int16_t *newSlope1e1, int16_t *newoffset290Ddbm, bool changeValues)|RAIL_Status_t||
|[RAIL_GetThermalProtection(RAIL_Handle_t genericRailHandle, RAIL_ChipTempConfig_t *chipTempConfig)](thermal-protection#rail-get-thermal-protection)|RAIL_Status_t|See [RAIL Changelist](changelist) item 1022182|
|[RAIL_IEEE802154_ConfigRxChannelSwitching(RAIL_Handle_t railHandle, const RAIL_IEEE802154_RxChannelSwitchingCfg_t *pConfig)](ieee802-15-4#rail-ieee802154-config-rx-channel-switching)|RAIL_Status_t|See [RAIL Changelist](changelist) item 858567|
|[RAIL_IEEE802154_SupportsRxChannelSwitching(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-rx-channel-switching)|bool|See [RAIL Changelist](changelist) item 858567|
|[RAIL_SetPaPowerSetting(RAIL_Handle_t railHandle, RAIL_PaPowerSetting_t paPowerSetting, RAIL_TxPower_t minPowerDbm, RAIL_TxPower_t maxPowerDbm, RAIL_TxPower_t currentPowerDbm)](pa#rail-set-pa-power-setting)|RAIL_Status_t||
|[RAIL_SupportsHFXOCompensation(RAIL_Handle_t railHandle)](features#rail-supports-hfxo-compensation)|bool|See [RAIL Changelist](changelist) item 751910|
|[RAIL_SupportsIEEE802154Band2P4(RAIL_Handle_t railHandle)](features#rail-supports-ieee802154-band2-p4)|bool||
|[RAIL_SupportsThermalProtection(RAIL_Handle_t railHandle)](features#rail-supports-thermal-protection)|bool|See [RAIL Changelist](changelist) item 1022182|
|[RAIL_ZWAVE_PerformIrcal(RAIL_Handle_t railHandle, RAIL_ZWAVE_IrcalVal_t *pIrCalVals, bool forceIrcal)](z-wave#rail-zwave-perform-ircal)|RAIL_Status_t|See [RAIL Changelist](changelist) item 846240|

##### Removed

|Old API Name|Return Value|Comment|
|---|---|---|
|RAIL_GetSetClpcSlowLoop(RAIL_Handle_t railHandle, uint16_t *newTarget, uint16_t *newSlope, bool changeValues)|RAIL_Status_t|Removed alpha API for EFR32xG25+EFF01 support|
|RAIL_GetSetInternalTempThreshold(RAIL_Handle_t railHandle, uint16_t *newThreshold, bool changeThreshold)|RAIL_Status_t|Removed alpha API for EFR32xG25 support|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|RAIL_GetSetClpcFastLoop(RAIL_Handle_t railHandle, uint16_t *newTarget, uint16_t *newSlope, bool changeValues)|RAIL_Status_t|RAIL_GetSetClpcFastLoop(RAIL_Handle_t railHandle, uint16_t *newTargetFsk, uint16_t *newSlopeFsk, uint16_t *newTargetOfdm, uint16_t *newSlopeOfdm, bool changeValues)|RAIL_Status_t|Modified alpha API|

##### RAIL Library 2.13.3

No changes

##### RAIL Library 2.13.2

No changes

##### RAIL Library 2.13.1

No changes

##### RAIL Library 2.13.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ChangedDcdc(void)](retiming#rail-changed-dcdc)|RAIL_Status_t||
|[RAIL_ComputeHFXOPPMError(RAIL_Handle_t railHandle, int16_t crystalTemperatureC, int8_t *crystalPPMError)](external-thermistor#rail-compute-hfxoppm-error)|RAIL_Status_t||
|RAIL_ConfigEff(RAIL_Handle_t railHandle, const RAIL_EffConfig_t *config)|RAIL_Status_t||
|[RAIL_ConfigHFXOThermistor(RAIL_Handle_t railHandle, const RAIL_HFXOThermistorConfig_t *hfxoThermistorConfig)](external-thermistor#rail-config-hfxo-thermistor)|RAIL_Status_t||
|[RAIL_ConfigPaAutoEntry(RAIL_Handle_t railHandle, const RAIL_PaAutoModeConfigEntry_t *paAutoModeEntry)](pa#rail-config-pa-auto-entry)|RAIL_Status_t||
|[RAIL_ConvertThermistorImpedance(RAIL_Handle_t railHandle, uint32_t thermistorImpedance, int16_t *thermistorTemperatureC)](external-thermistor#rail-convert-thermistor-impedance)|RAIL_Status_t||
|[RAIL_GetChannelAlt(RAIL_Handle_t railHandle, uint16_t *channel)](radio-configuration#rail-get-channel-alt)|RAIL_Status_t||
|RAIL_GetFemProtectionConfig(RAIL_Handle_t railHandle, RAIL_FemProtectionConfig_t *femConfig)|RAIL_Status_t||
|[RAIL_GetRssiDetectThreshold(RAIL_Handle_t railHandle)](receive#rail-get-rssi-detect-threshold)|int8_t||
|RAIL_GetSetClpcEnable(RAIL_Handle_t railHandle, uint8_t *newClpcEnable, bool changeClpcEnable)|RAIL_Status_t||
|RAIL_GetSetClpcFastLoop(RAIL_Handle_t railHandle, uint16_t *newTarget, uint16_t *newSlope, bool changeValues)|RAIL_Status_t||
|RAIL_GetSetClpcSlowLoop(RAIL_Handle_t railHandle, uint16_t *newTarget, uint16_t *newSlope, bool changeValues)|RAIL_Status_t||
|RAIL_GetSetEffBypassDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t||
|RAIL_GetSetEffControl(RAIL_Handle_t railHandle, uint16_t tempBuffer[(52U)/sizeof(uint16_t)], bool reset)|RAIL_Status_t||
|RAIL_GetSetEffMode(RAIL_Handle_t railHandle, uint8_t *newMode, bool changeMode)|RAIL_Status_t||
|RAIL_GetSetEffRuralUrbanMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t||
|RAIL_GetSetEffTempThreshold(RAIL_Handle_t railHandle, uint16_t *newThreshold, bool changeThreshold)|RAIL_Status_t||
|RAIL_GetSetEffUrbanBypassMv(RAIL_Handle_t railHandle, uint16_t *newTrip, bool changeTrip)|RAIL_Status_t||
|RAIL_GetSetEffUrbanDwellTimeMs(RAIL_Handle_t railHandle, uint32_t *newDwellTime, bool changeDwellTime)|RAIL_Status_t||
|RAIL_GetSetInternalTempThreshold(RAIL_Handle_t railHandle, uint16_t *newThreshold, bool changeThreshold)|RAIL_Status_t||
|RAIL_GetTemperature(RAIL_Handle_t railHandle, int16_t tempBuffer[(13U)], bool reset)|RAIL_Status_t||
|RAIL_SetFemProtectionConfig(RAIL_Handle_t railHandle, const RAIL_FemProtectionConfig_t *newFemConfig)|RAIL_Status_t||
|[RAIL_SetRssiDetectThreshold(RAIL_Handle_t railHandle, int8_t rssiThresholdDbm)](receive#rail-set-rssi-detect-threshold)|RAIL_Status_t||
|[RAIL_SupportsAuxAdc(RAIL_Handle_t railHandle)](features#rail-supports-aux-adc)|bool||
|RAIL_SupportsEff(RAIL_Handle_t railHandle)|bool||
|[RAIL_SupportsRssiDetectThreshold(RAIL_Handle_t railHandle)](features#rail-supports-rssi-detect-threshold)|bool||

##### Removed

|Old API Name|Return Value|Comment|
|---|---|---|
|RAIL_IEEE802154_Config863MHzSUNOFDMOptRadio(RAIL_Handle_t railHandle, RAIL_IEEE802154_OFDMOption_t ofdmOption)|RAIL_Status_t|Removed unnecessary alpha API.|
|RAIL_IEEE802154_Config902MHzSUNOFDMOptRadio(RAIL_Handle_t railHandle, RAIL_IEEE802154_OFDMOption_t ofdmOption)|RAIL_Status_t|Removed unnecessary alpha API.|

##### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|[RAIL_BLE_ConfigSignalIdentifier(RAIL_Handle_t railHandle, const RAIL_BLE_SignalIdentifierMode_t signalIdentifierMode)](ble#rail-ble-config-signal-identifier)|RAIL_Status_t|[RAIL_BLE_ConfigSignalIdentifier(RAIL_Handle_t railHandle, RAIL_BLE_SignalIdentifierMode_t signalIdentifierMode)](ble#rail-ble-config-signal-identifier)|RAIL_Status_t|Removed unnecessary const usage.|
|[RAIL_BLE_EnableSignalIdentifier(RAIL_Handle_t railHandle, bool enable)](ble#rail-ble-enable-signal-identifier)|RAIL_Status_t|[RAIL_BLE_EnableSignalDetection(RAIL_Handle_t railHandle, bool enable)](ble#rail-ble-enable-signal-detection)|RAIL_Status_t|The old API is available through a define for compatibility.|
|[RAIL_IEEE802154_ConfigCcaMode(RAIL_Handle_t railHandle, const RAIL_IEEE802154_CcaMode_t ccaMode)](ieee802-15-4#rail-ieee802154-config-cca-mode)|RAIL_Status_t|[RAIL_IEEE802154_ConfigCcaMode(RAIL_Handle_t railHandle, RAIL_IEEE802154_CcaMode_t ccaMode)](ieee802-15-4#rail-ieee802154-config-cca-mode)|RAIL_Status_t|Removed unnecessary const usage.|
|RAIL_IEEE802154_ConfigSignalIdentifier(RAIL_Handle_t railHandle)|RAIL_Status_t|[RAIL_IEEE802154_ConfigSignalIdentifier(RAIL_Handle_t railHandle, RAIL_IEEE802154_SignalIdentifierMode_t signalIdentifierMode)](ieee802-15-4#rail-ieee802154-config-signal-identifier)|RAIL_Status_t|Added an additional parameter to allow disabling the signal identifier. This breaks backwards compatibility but was important due to underlying changes to the signal identifier implementation.|
|[RAIL_IEEE802154_EnableSignalIdentifier(RAIL_Handle_t railHandle, bool enable)](ieee802-15-4#rail-ieee802154-enable-signal-identifier)|RAIL_Status_t|[RAIL_IEEE802154_EnableSignalDetection(RAIL_Handle_t railHandle, bool enable)](ieee802-15-4#rail-ieee802154-enable-signal-detection)|RAIL_Status_t|The old API is available through a define for compatibility.|

##### RAIL Library 2.12.2

No changes

##### RAIL Library 2.12.1

No changes

##### RAIL Library 2.12.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_AddStateBuffer3(RAIL_Handle_t genericRailHandle)](general#rail-add-state-buffer3)|RAIL_Status_t|See [RAIL Changelist](changelist) item 721163|
|[RAIL_AddStateBuffer4(RAIL_Handle_t genericRailHandle)](general#rail-add-state-buffer4)|RAIL_Status_t|See [RAIL Changelist](changelist) item 721163|
|[RAIL_BLE_ConfigSignalIdentifier(RAIL_Handle_t railHandle, const RAIL_BLE_SignalIdentifierMode_t signalIdentifierMode)](ble#rail-ble-config-signal-identifier)|RAIL_Status_t||
|[RAIL_BLE_EnableSignalIdentifier(RAIL_Handle_t railHandle, bool enable)](ble#rail-ble-enable-signal-identifier)|RAIL_Status_t||
|[RAIL_BLE_GetCteSampleOffset(RAIL_Handle_t railHandle)](ao-x#rail-ble-get-cte-sample-offset)|uint8_t||
|[RAIL_BLE_SupportsSignalIdentifier(RAIL_Handle_t railHandle)](features#rail-ble-supports-signal-identifier)|bool||
|[RAIL_GetSchedulerStatusAlt(RAIL_Handle_t railHandle, RAIL_SchedulerStatus_t *pSchedulerStatus, RAIL_Status_t *pRailStatus)](multiprotocol#rail-get-scheduler-status-alt)|RAIL_Status_t|See [RAIL Changelist](changelist) item 726491|
|[RAIL_GetTxPacketsRemaining(RAIL_Handle_t railHandle)](state-transitions#rail-get-tx-packets-remaining)|uint16_t|See [RAIL Changelist](changelist) item 708206|
|[RAIL_IEEE802154_ComputeChannelFromPhyModeId(RAIL_Handle_t railHandle, uint8_t newPhyModeId, uint16_t *pChannel)](ieee802-15-4#rail-ieee802154-compute-channel-from-phy-mode-id)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioCustom1(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-custom1)|RAIL_Status_t|See [RAIL Changelist](changelist) item 727728|
|RAIL_IEEE802154_Config863MHzSUNOFDMOptRadio(RAIL_Handle_t railHandle, RAIL_IEEE802154_OFDMOption_t ofdmOption)|RAIL_Status_t||
|RAIL_IEEE802154_Config902MHzSUNOFDMOptRadio(RAIL_Handle_t railHandle, RAIL_IEEE802154_OFDMOption_t ofdmOption)|RAIL_Status_t||
|[RAIL_IEEE802154_ConfigCcaMode(RAIL_Handle_t railHandle, const RAIL_IEEE802154_CcaMode_t ccaMode)](ieee802-15-4#rail-ieee802154-config-cca-mode)|RAIL_Status_t||
|RAIL_IEEE802154_ConfigSignalIdentifier(RAIL_Handle_t railHandle)|RAIL_Status_t||
|[RAIL_IEEE802154_EnableSignalIdentifier(RAIL_Handle_t railHandle, bool enable)](ieee802-15-4#rail-ieee802154-enable-signal-identifier)|RAIL_Status_t||
|[RAIL_IEEE802154_SupportsCustom1Phy(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-custom1-phy)|bool||
|[RAIL_IEEE802154_SupportsDualPaConfig(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-dual-pa-config)|bool||
|[RAIL_IEEE802154_SupportsGDynFec(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g-dyn-fec)|bool||
|[RAIL_IEEE802154_SupportsGModeSwitch(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g-mode-switch)|bool||
|[RAIL_IEEE802154_SupportsSignalIdentifier(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-signal-identifier)|bool||
|[RAIL_SupportsOFDMPA(RAIL_Handle_t railHandle)](features#rail-supports-ofdmpa)|bool||

##### RAIL Library 2.11.3

No changes

##### RAIL Library 2.11.2

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ConfigDirectMode(RAIL_Handle_t railHandle, const RAIL_DirectModeConfig_t *directModeConfig)](diagnostic#rail-config-direct-mode)|RAIL_Status_t||
|[RAIL_EnableDirectModeAlt(RAIL_Handle_t railHandle, bool enableDirectTx, bool enableDirectRx)](diagnostic#rail-enable-direct-mode-alt)|RAIL_Status_t||
|[RAIL_GetDefaultRxDutyCycleConfig(RAIL_Handle_t railHandle, RAIL_RxDutyCycleConfig_t *config)](rx-channel-hopping#rail-get-default-rx-duty-cycle-config)|RAIL_Status_t||
|[RAIL_SetMfmPingPongFifo(RAIL_Handle_t railHandle, const RAIL_MFM_PingPongBufferConfig_t *config)](mfm#rail-set-mfm-ping-pong-fifo)|RAIL_Status_t||
|[RAIL_SupportsMfm(RAIL_Handle_t railHandle)](features#rail-supports-mfm)|bool||
|[RAIL_SupportsRxDirectModeDataToFifo(RAIL_Handle_t railHandle)](features#rail-supports-rx-direct-mode-data-to-fifo)|bool||

##### RAIL Library 2.11.1

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetPtiProtocol(RAIL_Handle_t railHandle)](pti#rail-get-pti-protocol)|RAIL_PtiProtocol_t||
|[RAIL_GetRadioClockFreqHz(RAIL_Handle_t railHandle)](diagnostic#rail-get-radio-clock-freq-hz)|uint32_t||

##### RAIL Library 2.11.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_BLE_SetNextTxRepeat(RAIL_Handle_t railHandle, const RAIL_BLE_TxRepeatConfig_t *repeatConfig)](bletx2-tx#rail-ble-set-next-tx-repeat)|RAIL_Status_t||
|[RAIL_SetNextTxRepeat(RAIL_Handle_t railHandle, const RAIL_TxRepeatConfig_t *repeatConfig)](state-transitions#rail-set-next-tx-repeat)|RAIL_Status_t||
|[RAIL_StartScheduledCcaCsmaTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_ScheduleTxConfig_t *scheduleTxConfig, const RAIL_CsmaConfig_t *csmaConfig, const RAIL_SchedulerInfo_t *schedulerInfo)](packet-tx#rail-start-scheduled-cca-csma-tx)|RAIL_Status_t||
|[RAIL_StartScheduledCcaLbtTx(RAIL_Handle_t railHandle, uint16_t channel, RAIL_TxOptions_t options, const RAIL_ScheduleTxConfig_t *scheduleTxConfig, const RAIL_LbtConfig_t *lbtConfig, const RAIL_SchedulerInfo_t *schedulerInfo)](packet-tx#rail-start-scheduled-cca-lbt-tx)|RAIL_Status_t||
|[RAIL_SupportsTxToTx(RAIL_Handle_t railHandle)](features#rail-supports-tx-to-tx)|bool||
|[RAIL_ZWAVE_GetBeamRssi(RAIL_Handle_t railHandle, int8_t *pBeamRssi)](z-wave#rail-zwave-get-beam-rssi)|RAIL_Status_t||
|[RAIL_ZWAVE_GetRxBeamConfig(RAIL_ZWAVE_BeamRxConfig_t *pConfig)](z-wave#rail-zwave-get-rx-beam-config)|RAIL_Status_t||
|[RAIL_ZWAVE_SetDefaultRxBeamConfig(RAIL_Handle_t railHandle)](z-wave#rail-zwave-set-default-rx-beam-config)|RAIL_Status_t||
|[RAIL_ZWAVE_SetLrAckData(RAIL_Handle_t railHandle, const RAIL_ZWAVE_LrAckData_t *pLrAckData)](z-wave#rail-zwave-set-lr-ack-data)|RAIL_Status_t||

##### RAIL Library 2.10.2

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_IEEE802154_GetPtiRadioConfig(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-get-pti-radio-config)|RAIL_IEEE802154_PtiRadioConfig_t||

##### RAIL Library 2.10.1

No changes

##### RAIL Library 2.10.0

##### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ApplyIrCalibrationAlt(RAIL_Handle_t railHandle, RAIL_IrCalValues_t *imageRejection, RAIL_AntennaSel_t rfPath)](calibration#rail-apply-ir-calibration-alt)|RAIL_Status_t||
|[RAIL_BLE_ConfigPhySimulscan(RAIL_Handle_t railHandle)](ble#rail-ble-config-phy-simulscan)|RAIL_Status_t||
|[RAIL_BLE_SupportsSimulscanPhy(RAIL_Handle_t railHandle)](features#rail-ble-supports-simulscan-phy)|bool||
|[RAIL_CalibrateIrAlt(RAIL_Handle_t railHandle, RAIL_IrCalValues_t *imageRejection, RAIL_AntennaSel_t rfPath)](calibration#rail-calibrate-ir-alt)|RAIL_Status_t||
|[RAIL_ConfigRetimeOptions(RAIL_Handle_t railHandle, RAIL_RetimeOptions_t mask, RAIL_RetimeOptions_t options)](retiming#rail-config-retime-options)|RAIL_Status_t||
|RAIL_ConfigSleepAlt(RAIL_Handle_t railHandle, RAIL_TimerSyncConfig_t *syncConfig)|RAIL_Status_t||
|[RAIL_GetRadioStateDetail(RAIL_Handle_t railHandle)](state-transitions#rail-get-radio-state-detail)|RAIL_RadioStateDetail_t||
|[RAIL_GetRetimeOptions(RAIL_Handle_t railHandle, RAIL_RetimeOptions_t *pOptions)](retiming#rail-get-retime-options)|RAIL_Status_t||
|[RAIL_GetRfPath(RAIL_Handle_t railHandle, RAIL_AntennaSel_t *rfPath)](antenna-control#rail-get-rf-path)|RAIL_Status_t||
|[RAIL_GetRssiAlt(RAIL_Handle_t railHandle, RAIL_Time_t waitTimeout)](receive#rail-get-rssi-alt)|int16_t||
|[RAIL_GetTuneDelta(RAIL_Handle_t railHandle)](diagnostic#rail-get-tune-delta)|int32_t||
|[RAIL_IEEE802154_Config2p4GHzRadioAntDivCoexFem(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-coex-fem)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioAntDivFem(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-fem)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioCoexFem(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-coex-fem)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioFem(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-fem)|RAIL_Status_t||
|[RAIL_IEEE802154_SupportsFemPhy(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-fem-phy)|bool||
|[RAIL_SetAddressFilterAddressMask(RAIL_Handle_t railHandle, uint8_t field, const uint8_t *bitMask)](address-filtering#rail-set-address-filter-address-mask)|RAIL_Status_t||
|[RAIL_SetTuneDelta(RAIL_Handle_t railHandle, int32_t delta)](diagnostic#rail-set-tune-delta)|RAIL_Status_t||
|[RAIL_SupportsAddrFilterAddressBitMask(RAIL_Handle_t railHandle)](features#rail-supports-addr-filter-address-bit-mask)|bool||
|[RAIL_SupportsAddrFilterMask(RAIL_Handle_t railHandle)](features#rail-supports-addr-filter-mask)|bool||
|[RAIL_SupportsDirectMode(RAIL_Handle_t railHandle)](features#rail-supports-direct-mode)|bool||
|[RAIL_SupportsRfSenseEnergyDetection(RAIL_Handle_t railHandle)](features#rail-supports-rf-sense-energy-detection)|bool||
|[RAIL_SupportsSQPhy(RAIL_Handle_t railHandle)](features#rail-supports-sq-phy)|bool||
|[RAIL_SupportsTxPowerModeAlt(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t *powerMode, RAIL_TxPowerLevel_t *maxPowerLevel, RAIL_TxPowerLevel_t *minPowerLevel)](features#rail-supports-tx-power-mode-alt)|bool||
|[RAIL_ZWAVE_ConfigRxChannelHopping(RAIL_Handle_t railHandle, RAIL_RxChannelHoppingConfig_t *config)](z-wave#rail-zwave-config-rx-channel-hopping)|RAIL_Status_t||
|[RAIL_ZWAVE_GetLrBeamTxPower(RAIL_Handle_t railHandle, uint8_t *pLrBeamTxPower)](z-wave#rail-zwave-get-lr-beam-tx-power)|RAIL_Status_t||
|[RAIL_ZWAVE_GetRegion(RAIL_Handle_t railHandle)](z-wave#rail-zwave-get-region)|RAIL_ZWAVE_RegionId_t||
|[RAIL_ZWAVE_SupportsConcPhy(RAIL_Handle_t railHandle)](features#rail-zwave-supports-conc-phy)|bool||
|[RAIL_ZWAVE_SupportsEnergyDetectPhy(RAIL_Handle_t railHandle)](features#rail-zwave-supports-energy-detect-phy)|bool||

##### RAIL Library 2.9.2

No changes

##### RAIL Library 2.9.1

No changes

##### RAIL Library 2.9.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAILCb_ConfigSleepTimerSync(RAIL_TimerSyncConfig_t *timerSyncConfig)](sleep#rail-cb-config-sleep-timer-sync)|void||
|[RAIL_BLE_ConfigPhyQuuppa(RAIL_Handle_t railHandle)](ble#rail-ble-config-phy-quuppa)|RAIL_Status_t||
|[RAIL_BLE_SupportsQuuppa(RAIL_Handle_t railHandle)](features#rail-ble-supports-quuppa)|bool||
|[RAIL_DeinitPowerManager(void)](sleep#rail-deinit-power-manager)|RAIL_Status_t||
|[RAIL_GetTxPacketDetailsAlt2(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)](transmit#rail-get-tx-packet-details-alt2)|RAIL_Status_t||
|[RAIL_GetTxTimeFrameEndAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)](transmit#rail-get-tx-time-frame-end-alt)|RAIL_Status_t||
|[RAIL_GetTxTimePreambleStartAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)](transmit#rail-get-tx-time-preamble-start-alt)|RAIL_Status_t||
|[RAIL_GetTxTimeSyncWordEndAlt(RAIL_Handle_t railHandle, RAIL_TxPacketDetails_t *pPacketDetails)](transmit#rail-get-tx-time-sync-word-end-alt)|RAIL_Status_t||
|[RAIL_InitPowerManager(void)](sleep#rail-init-power-manager)|RAIL_Status_t||

##### RAIL Library 2.8.10

No changes

##### RAIL Library 2.8.9

No changes

##### RAIL Library 2.8.8

No changes

##### RAIL Library 2.8.7

No changes

##### RAIL Library 2.8.6

No changes

##### RAIL Library 2.8.4

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|RAIL_BLE_ConfigAoxAntenna(RAIL_Handle_t railHandle, RAIL_BLE_AoxAntennaConfig_t *antennaConfig)|RAIL_Status_t||
|[RAIL_BLE_InitCte(RAIL_Handle_t railHandle)](ao-x#rail-ble-init-cte)|RAIL_Status_t||

##### RAIL Library 2.8.3

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_BLE_Supports1Mbps(RAIL_Handle_t railHandle)](features#rail-ble-supports1-mbps)|bool||
|[RAIL_BLE_Supports1MbpsNonViterbi(RAIL_Handle_t railHandle)](features#rail-ble-supports1-mbps-non-viterbi)|bool||
|[RAIL_BLE_Supports1MbpsViterbi(RAIL_Handle_t railHandle)](features#rail-ble-supports1-mbps-viterbi)|bool||
|[RAIL_BLE_Supports2Mbps(RAIL_Handle_t railHandle)](features#rail-ble-supports2-mbps)|bool||
|[RAIL_BLE_Supports2MbpsNonViterbi(RAIL_Handle_t railHandle)](features#rail-ble-supports2-mbps-non-viterbi)|bool||
|[RAIL_BLE_Supports2MbpsViterbi(RAIL_Handle_t railHandle)](features#rail-ble-supports2-mbps-viterbi)|bool||
|[RAIL_BLE_SupportsAntennaSwitching(RAIL_Handle_t railHandle)](features#rail-ble-supports-antenna-switching)|bool||
|[RAIL_BLE_SupportsCodedPhy(RAIL_Handle_t railHandle)](features#rail-ble-supports-coded-phy)|bool||
|[RAIL_BLE_SupportsCte(RAIL_Handle_t railHandle)](features#rail-ble-supports-cte)|bool||
|[RAIL_BLE_SupportsIQSampling(RAIL_Handle_t railHandle)](features#rail-ble-supports-iq-sampling)|bool||
|[RAIL_BLE_SupportsPhySwitchToRx(RAIL_Handle_t railHandle)](features#rail-ble-supports-phy-switch-to-rx)|bool||
|[RAIL_IEEE802154_SupportsCancelFramePendingLookup(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-cancel-frame-pending-lookup)|bool||
|[RAIL_IEEE802154_SupportsCoexPhy(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-coex-phy)|bool||
|[RAIL_IEEE802154_SupportsEEnhancedAck(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-e-enhanced-ack)|bool||
|[RAIL_IEEE802154_SupportsEMultipurposeFrames(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-e-multipurpose-frames)|bool||
|[RAIL_IEEE802154_SupportsESubsetGB868(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-e-subset-gb868)|bool||
|[RAIL_IEEE802154_SupportsEarlyFramePendingLookup(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-early-frame-pending-lookup)|bool||
|[RAIL_IEEE802154_SupportsG4ByteCrc(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g4-byte-crc)|bool||
|[RAIL_IEEE802154_SupportsGSubsetGB868(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g-subset-gb868)|bool||
|[RAIL_IEEE802154_SupportsGUnwhitenedRx(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g-unwhitened-rx)|bool||
|[RAIL_IEEE802154_SupportsGUnwhitenedTx(RAIL_Handle_t railHandle)](features#rail-ieee802154-supports-g-unwhitened-tx)|bool||
|[RAIL_Supports2p4GHzBand(RAIL_Handle_t railHandle)](features#rail-supports2p4-g-hz-band)|bool||
|[RAIL_SupportsAlternateTxPower(RAIL_Handle_t railHandle)](features#rail-supports-alternate-tx-power)|bool||
|[RAIL_SupportsAntennaDiversity(RAIL_Handle_t railHandle)](features#rail-supports-antenna-diversity)|bool||
|[RAIL_SupportsChannelHopping(RAIL_Handle_t railHandle)](features#rail-supports-channel-hopping)|bool||
|[RAIL_SupportsDualBand(RAIL_Handle_t railHandle)](features#rail-supports-dual-band)|bool||
|[RAIL_SupportsDualSyncWords(RAIL_Handle_t railHandle)](features#rail-supports-dual-sync-words)|bool||
|[RAIL_SupportsExternalThermistor(RAIL_Handle_t railHandle)](features#rail-supports-external-thermistor)|bool||
|[RAIL_SupportsPrecisionLFRCO(RAIL_Handle_t railHandle)](features#rail-supports-precision-lfrco)|bool||
|[RAIL_SupportsProtocolBLE(RAIL_Handle_t railHandle)](features#rail-supports-protocol-ble)|bool||
|[RAIL_SupportsProtocolIEEE802154(RAIL_Handle_t railHandle)](features#rail-supports-protocol-ieee802154)|bool||
|[RAIL_SupportsProtocolZWave(RAIL_Handle_t railHandle)](features#rail-supports-protocol-z-wave)|bool||
|[RAIL_SupportsRadioEntropy(RAIL_Handle_t railHandle)](features#rail-supports-radio-entropy)|bool||
|[RAIL_SupportsRfSenseSelectiveOok(RAIL_Handle_t railHandle)](features#rail-supports-rf-sense-selective-ook)|bool||
|[RAIL_SupportsSubGHzBand(RAIL_Handle_t railHandle)](features#rail-supports-sub-g-hz-band)|bool||
|[RAIL_SupportsTxPowerMode(RAIL_Handle_t railHandle, RAIL_TxPowerMode_t powerMode, RAIL_TxPowerLevel_t *pMaxPowerLevel)](features#rail-supports-tx-power-mode)|bool||
|[RAIL_ZWAVE_SupportsRegionPti(RAIL_Handle_t railHandle)](features#rail-zwave-supports-region-pti)|bool||

##### RAIL Library 2.8.2

No changes

##### RAIL Library 2.8.1

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAILCb_PaAutoModeDecision(RAIL_Handle_t railHandle, RAIL_TxPower_t *power, RAIL_TxPowerMode_t *mode, const RAIL_ChannelConfigEntry_t *chCfgEntry)](pa#rail-cb-pa-auto-mode-decision)|RAIL_Status_t||
|[RAIL_GetThermistorImpedance(RAIL_Handle_t railHandle, uint32_t *thermistorImpedance)](external-thermistor#rail-get-thermistor-impedance)|RAIL_Status_t||
|[RAIL_IEEE802154_ConvertRssiToEd(int8_t rssiDbm)](ieee802-15-4#rail-ieee802154-convert-rssi-to-ed)|uint8_t||
|[RAIL_IEEE802154_ConvertRssiToLqi(uint8_t origLqi, int8_t rssiDbm)](ieee802-15-4#rail-ieee802154-convert-rssi-to-lqi)|uint8_t||
|[RAIL_StartThermistorMeasurement(RAIL_Handle_t railHandle)](external-thermistor#rail-start-thermistor-measurement)|RAIL_Status_t||
|[RAIL_StartTxStreamAlt(RAIL_Handle_t railHandle, uint16_t channel, RAIL_StreamMode_t mode, RAIL_TxOptions_t options)](diagnostic#rail-start-tx-stream-alt)|RAIL_Status_t||

##### RAIL Library 2.8.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_BLE_GetCteSampleRate(RAIL_Handle_t railHandle)](ao-x#rail-ble-get-cte-sample-rate)|uint32_t||
|[RAIL_ConfigRfSenseSelectiveOokWakeupPhy(RAIL_Handle_t railHandle)](rf-sense#rail-config-rf-sense-selective-ook-wakeup-phy)|RAIL_Status_t||
|[RAIL_ConfigSyncWords(RAIL_Handle_t railHandle, const RAIL_SyncWordConfig_t *syncWordConfig)](radio-configuration#rail-config-sync-words)|RAIL_Status_t||
|[RAIL_EnablePaAutoMode(RAIL_Handle_t railHandle, bool enable)](pa#rail-enable-pa-auto-mode)|RAIL_Status_t||
|[RAIL_GetChannelMetadata(RAIL_Handle_t railHandle, RAIL_ChannelMetadata_t *channelMetadata, uint16_t *length, uint16_t minChannel, uint16_t maxChannel)](radio-configuration#rail-get-channel-metadata)|RAIL_Status_t||
|[RAIL_GetRxTransitions(RAIL_Handle_t railHandle, RAIL_StateTransitions_t *transitions)](state-transitions#rail-get-rx-transitions)|RAIL_Status_t||
|[RAIL_GetSyncWords(RAIL_Handle_t railHandle, RAIL_SyncWordConfig_t *syncWordConfig)](radio-configuration#rail-get-sync-words)|RAIL_Status_t||
|[RAIL_GetTxTransitions(RAIL_Handle_t railHandle, RAIL_StateTransitions_t *transitions)](state-transitions#rail-get-tx-transitions)|RAIL_Status_t||
|[RAIL_IsPaAutoModeEnabled(RAIL_Handle_t railHandle)](pa#rail-is-pa-auto-mode-enabled)|bool||
|RAIL_SetRfSenseSelectiveOokWakeupPayload(RAIL_Handle_t railHandle, uint8_t preamble, uint8_t numSyncwordBytes, uint32_t syncword)|RAIL_Status_t||
|[RAIL_StartSelectiveOokRfSense(RAIL_Handle_t railHandle, RAIL_RfSenseSelectiveOokConfig_t *config)](rf-sense#rail-start-selective-ook-rf-sense)|RAIL_Status_t||
|[RAIL_StopInfinitePreambleTx(RAIL_Handle_t railHandle)](diagnostic#rail-stop-infinite-preamble-tx)|RAIL_Status_t||
|RAIL_ZWAVE_ConfigBeamRx(RAIL_Handle_t railHandle, RAIL_ZWAVE_BeamRxConfig_t *config)|RAIL_Status_t||
|[RAIL_ZWAVE_ReceiveBeam(RAIL_Handle_t railHandle, uint8_t *beamDetectIndex, const RAIL_SchedulerInfo_t *schedulerInfo)](z-wave#rail-zwave-receive-beam)|RAIL_Status_t||

###### Modified

|Old API Name|Return Value|New API Name|Return Value|Comment|
|---|---|---|---|---|
|RAIL_ZWAVE_ConfigRegion(RAIL_Handle_t railHandle, const RAIL_ZWAVE_RegionConfig_t regionCfg)|RAIL_Status_t|[RAIL_ZWAVE_ConfigRegion(RAIL_Handle_t railHandle, const RAIL_ZWAVE_RegionConfig_t *regionCfg)](z-wave#rail-zwave-config-region)|RAIL_Status_t||

##### RAIL Library 2.7.4

No changes

##### RAIL Library 2.7.3

No changes

##### RAIL Library 2.7.2

No changes

##### RAIL Library 2.7.1

No changes

##### RAIL Library 2.7.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetRxIncomingPacketInfo(RAIL_Handle_t railHandle, RAIL_RxPacketInfo_t *pPacketInfo)](packet-information#rail-get-rx-incoming-packet-info)|void||
|[RAIL_IEEE802154_ConfigEOptions(RAIL_Handle_t railHandle, RAIL_IEEE802154_EOptions_t mask, RAIL_IEEE802154_EOptions_t options)](ieee802-15-4#rail-ieee802154-config-e-options)|RAIL_Status_t||
|[RAIL_IEEE802154_ConfigGOptions(RAIL_Handle_t railHandle, RAIL_IEEE802154_GOptions_t mask, RAIL_IEEE802154_GOptions_t options)](ieee802-15-4#rail-ieee802154-config-g-options)|RAIL_Status_t||
|[RAIL_IEEE802154_EnableDataFramePending(RAIL_Handle_t railHandle, bool enable)](ieee802-15-4#rail-ieee802154-enable-data-frame-pending)|RAIL_Status_t||
|[RAIL_IEEE802154_EnableEarlyFramePending(RAIL_Handle_t railHandle, bool enable)](ieee802-15-4#rail-ieee802154-enable-early-frame-pending)|RAIL_Status_t||
|RAIL_IEEE802154_WriteEnhAck(RAIL_Handle_t railHandle, const uint8_t *ackData, uint8_t ackDataLen)|RAIL_Status_t||
|[RAIL_UseDma(uint8_t channel)](general#rail-use-dma)|RAIL_Status_t||
|[RAIL_ZWAVE_GetTxLowPower(RAIL_Handle_t railHandle)](z-wave#rail-zwave-get-tx-low-power)|RAIL_TxPowerLevel_t||
|[RAIL_ZWAVE_GetTxLowPowerDbm(RAIL_Handle_t railHandle)](z-wave#rail-zwave-get-tx-low-power-dbm)|RAIL_TxPower_t||
|[RAIL_ZWAVE_SetTxLowPower(RAIL_Handle_t railHandle, uint8_t powerLevel)](z-wave#rail-zwave-set-tx-low-power)|RAIL_Status_t||
|[RAIL_ZWAVE_SetTxLowPowerDbm(RAIL_Handle_t railHandle, RAIL_TxPower_t powerLevel)](z-wave#rail-zwave-set-tx-low-power-dbm)|RAIL_Status_t||

##### RAIL Library 2.6.5

No changes

##### RAIL Library 2.6.4

No changes

##### RAIL Library 2.6.3

No changes

##### RAIL Library 2.6.2

No changes

##### RAIL Library 2.6.1

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_GetChannelHoppingRssi(RAIL_Handle_t railHandle, uint8_t channelIndex)](rx-channel-hopping#rail-get-channel-hopping-rssi)|int16_t||

##### RAIL Library 2.6.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAILCb_ConfigFrameTypeLength(RAIL_Handle_t railHandle, const RAIL_FrameType_t *frameType)](receive#rail-cb-config-frame-type-length)|void||
|[RAIL_BLE_ConfigAox(RAIL_Handle_t railHandle, const RAIL_BLE_AoxConfig_t *aoxConfig)](ao-x#rail-ble-config-aox)|RAIL_Status_t||
|[RAIL_BLE_CteBufferIsLocked(RAIL_Handle_t railHandle)](ao-x#rail-ble-cte-buffer-is-locked)|bool||
|[RAIL_BLE_LockCteBuffer(RAIL_Handle_t railHandle, bool lock)](ao-x#rail-ble-lock-cte-buffer)|bool||
|[RAIL_BLE_PhySwitchToRx(RAIL_Handle_t railHandle, RAIL_BLE_Phy_t phy, uint16_t railChannel, uint32_t startRxTime, uint32_t crcInit, uint32_t accessAddress, uint16_t logicalChannel, bool disableWhitening)](ble#rail-ble-phy-switch-to-rx)|RAIL_Status_t||
|[RAIL_ConfigRxDutyCycle(RAIL_Handle_t railHandle, const RAIL_RxDutyCycleConfig_t *config)](rx-channel-hopping#rail-config-rx-duty-cycle)|RAIL_Status_t||
|[RAIL_DelayUs(RAIL_Time_t microseconds)](system-timing#rail-delay-us)|RAIL_Status_t||
|[RAIL_EnableRxDutyCycle(RAIL_Handle_t railHandle, bool enable)](rx-channel-hopping#rail-enable-rx-duty-cycle)|RAIL_Status_t||
|[RAIL_GetRxTimeFrameEndAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)](packet-information#rail-get-rx-time-frame-end-alt)|RAIL_Status_t||
|[RAIL_GetRxTimePreambleStartAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)](packet-information#rail-get-rx-time-preamble-start-alt)|RAIL_Status_t||
|[RAIL_GetRxTimeSyncWordEndAlt(RAIL_Handle_t railHandle, RAIL_RxPacketDetails_t *pPacketDetails)](packet-information#rail-get-rx-time-sync-word-end-alt)|RAIL_Status_t||
|[RAIL_GetTransitionTime(void)](multiprotocol#rail-get-transition-time)|RAIL_Time_t||
|[RAIL_IEEE802154_Config2p4GHzRadioAntDivCoex(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div-coex)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioCoex(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-coex)|RAIL_Status_t||
|[RAIL_IncludeFrameTypeLength(RAIL_Handle_t railHandle)](receive#rail-include-frame-type-length)|void||
|[RAIL_IsInitialized(void)](general#rail-is-initialized)|bool||
|[RAIL_SetTransitionTime(RAIL_Time_t transitionTime)](multiprotocol#rail-set-transition-time)|void||
|[RAIL_ZWAVE_GetBeamChannelIndex(RAIL_Handle_t railHandle, uint8_t *pChannelIndex)](z-wave#rail-zwave-get-beam-channel-index)|RAIL_Status_t||

##### RAIL Library 2.5.1

No changes

##### RAIL Library 2.5.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|[RAIL_ConfigRxChannelHopping(RAIL_Handle_t railHandle, RAIL_RxChannelHoppingConfig_t *config)](rx-channel-hopping#rail-config-rx-channel-hopping)|RAIL_Status_t||
|[RAIL_ConvertLqi(RAIL_Handle_t railHandle, RAIL_ConvertLqiCallback_t cb)](receive#rail-convert-lqi)|RAIL_Status_t||
|[RAIL_EnableRxChannelHopping(RAIL_Handle_t railHandle, bool enable, bool reset)](rx-channel-hopping#rail-enable-rx-channel-hopping)|RAIL_Status_t||
|[RAIL_IEEE802154_Config2p4GHzRadioAntDiv(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config2p4-g-hz-radio-ant-div)|RAIL_Status_t||
|[RAIL_SetTxAltPreambleLength(RAIL_Handle_t railHandle, uint16_t length)](transmit#rail-set-tx-alt-preamble-length)|RAIL_Status_t||
|[RAIL_VerifyTxPowerCurves(const struct RAIL_TxPowerCurvesConfigAlt *config)](pa#rail-verify-tx-power-curves)|void||
|[RAIL_ZWAVE_ConfigOptions(RAIL_Handle_t railHandle, RAIL_ZWAVE_Options_t mask, RAIL_ZWAVE_Options_t options)](z-wave#rail-zwave-config-options)|RAIL_Status_t||
|RAIL_ZWAVE_ConfigRegion(RAIL_Handle_t railHandle, const RAIL_ZWAVE_RegionConfig_t regionCfg)|RAIL_Status_t||
|[RAIL_ZWAVE_Deinit(RAIL_Handle_t railHandle)](z-wave#rail-zwave-deinit)|RAIL_Status_t||
|[RAIL_ZWAVE_GetBeamNodeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t *pNodeId)](z-wave#rail-zwave-get-beam-node-id)|RAIL_Status_t||
|[RAIL_ZWAVE_Init(RAIL_Handle_t railHandle, const RAIL_ZWAVE_Config_t *config)](z-wave#rail-zwave-init)|RAIL_Status_t||
|[RAIL_ZWAVE_IsEnabled(RAIL_Handle_t railHandle)](z-wave#rail-zwave-is-enabled)|bool||
|[RAIL_ZWAVE_SetHomeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_HomeId_t homeId, RAIL_ZWAVE_HomeIdHash_t homeIdHash)](z-wave#rail-zwave-set-home-id)|RAIL_Status_t||
|[RAIL_ZWAVE_SetNodeId(RAIL_Handle_t railHandle, RAIL_ZWAVE_NodeId_t nodeId)](z-wave#rail-zwave-set-node-id)|RAIL_Status_t||

##### RAIL Library 2.4.1

No changes

##### RAIL Library 2.4.0

###### Added

|New API Name|Return Value|Comment|
|---|---|---|
|PRORTC_IRQHandler(void)|void||
|[RAILCb_SetupRxFifo(RAIL_Handle_t railHandle)](data-management#rail-cb-setup-rx-fifo)|RAIL_Status_t||
|[RAIL_BLE_CalibrateIr(RAIL_Handle_t railHandle, uint32_t *imageRejection)](calibration#rail-ble-calibrate-ir)|RAIL_Status_t||
|[RAIL_GetChannel(RAIL_Handle_t railHandle, uint16_t *channel)](radio-configuration#rail-get-channel)|RAIL_Status_t||
|[RAIL_GetRssiOffset(RAIL_Handle_t railHandle)](receive#rail-get-rssi-offset)|int8_t||
|[RAIL_GetRxPacketDetailsAlt(RAIL_Handle_t railHandle, RAIL_RxPacketHandle_t packetHandle, RAIL_RxPacketDetails_t *pPacketDetails)](packet-information#rail-get-rx-packet-details-alt)|RAIL_Status_t||
|[RAIL_GetRxTimeFrameEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](packet-information#rail-get-rx-time-frame-end)|RAIL_Status_t||
|[RAIL_GetRxTimePreambleStart(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](packet-information#rail-get-rx-time-preamble-start)|RAIL_Status_t||
|[RAIL_GetRxTimeSyncWordEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](packet-information#rail-get-rx-time-sync-word-end)|RAIL_Status_t||
|[RAIL_GetTxPacketDetailsAlt(RAIL_Handle_t railHandle, bool isAck, RAIL_Time_t *pPacketTime)](transmit#rail-get-tx-packet-details-alt)|RAIL_Status_t||
|[RAIL_GetTxTimeFrameEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](transmit#rail-get-tx-time-frame-end)|RAIL_Status_t||
|[RAIL_GetTxTimePreambleStart(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](transmit#rail-get-tx-time-preamble-start)|RAIL_Status_t||
|[RAIL_GetTxTimeSyncWordEnd(RAIL_Handle_t railHandle, uint16_t totalPacketBytes, RAIL_Time_t *pPacketTime)](transmit#rail-get-tx-time-sync-word-end)|RAIL_Status_t||
|[RAIL_IEEE802154_CalibrateIr2p4Ghz(RAIL_Handle_t railHandle, uint32_t *imageRejection)](calibration#rail-ieee802154-calibrate-ir2p4-ghz)|RAIL_Status_t||
|[RAIL_IEEE802154_CalibrateIrSubGhz(RAIL_Handle_t railHandle, uint32_t *imageRejection)](calibration#rail-ieee802154-calibrate-ir-sub-ghz)|RAIL_Status_t||
|[RAIL_IEEE802154_ConfigGB863MHzRadio(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config-gb863-m-hz-radio)|RAIL_Status_t||
|[RAIL_IEEE802154_ConfigGB915MHzRadio(RAIL_Handle_t railHandle)](ieee802-15-4#rail-ieee802154-config-gb915-m-hz-radio)|RAIL_Status_t||
|[RAIL_PrepareChannel(RAIL_Handle_t railHandle, uint16_t channel)](radio-configuration#rail-prepare-channel)|RAIL_Status_t||
|[RAIL_SetRssiOffset(RAIL_Handle_t railHandle, int8_t rssiOffset)](receive#rail-set-rssi-offset)|RAIL_Status_t||
|[RAIL_SetRxFifo(RAIL_Handle_t railHandle, uint8_t *addr, uint16_t *size)](data-management#rail-set-rx-fifo)|RAIL_Status_t||
|[RAIL_SetTaskPriority(RAIL_Handle_t railHandle, uint8_t priority, RAIL_TaskType_t taskType)](multiprotocol#rail-set-task-priority)|RAIL_Status_t||
|[RAIL_StopTx(RAIL_Handle_t railHandle, RAIL_StopMode_t mode)](transmit#rail-stop-tx)|RAIL_Status_t||

## Examples

### RAIL Examples

A number of examples are provided with Simplicity Studio and the Proprietary RAIL SDK. Each example has an associated README that explains the purpose of the example and how to use it. Some of the examples have more extensive documentation, and that is included in this section. Because new examples are always being added, the SiSDK may contain other examples not documented here.

Many of these examples are intended only to test specific aspects of the radio. They are not intended as a starting point for your own application, although they may contain code for some features you want to use. **RAIL - SoC Empty** is a recommended starting point.

**RAIL - SoC Empty**: The Empty Example application initializes RAIL to support a Single PHY radio configuration and defines an empty radio event handler. These are the necessary parts for every RAIL-based application.

**RAIL - SoC Burst Duty Cycle**: The Burst Duty Cycle example is a complete duty cycle solution implemented on top of RAIL. It implements both the Master (sender) and the Slave (listener) nodes. In receive mode the device spends most of the time in sleep state (EM1 or EM2) and wakes up periodically for short periods. In transmit mode the device transmits multiple packets in quick succession. This application can be used to optimize radio configuration and designing LDC (Low Duty-cycle) periods on the receiver in order to save as much energy as possible without PER (Packet Error Rate) reduction.

**RAIL - SoC Long Preamble Duty Cycle**: The Long Preamble Duty Cycle example is a complete duty cycle solution implemented on top of RAIL. This example supports both receive and transmit modes. In receive mode the device spends most of the time in a sleep state (EM1 or EM2) and wakes up periodically for a short periods. In transmit mode the device transmits one packet using long preamble. The low duty cycle mode of the EFR32 radios is a simple and effective way to reduce the current consumption of the system by autonomously waking up the receiver to look for transmitted packets, while the MCU remains in its lowest power mode.

**RAIL - SoC Energy Mode**: The Energy Mode example application serves as a complete, ready-to-use program with which you can accelerate the evaluation of the of energy consumption on your custom radio design by iterating over the available energy modes or using Tx/Rx radio operations.

**RAIL - SoC Simple TRX**: The Simple TRX example demonstrates the simplest exchange of transmit and receive operations between two nodes implemented in RAIL. It can be used to set up a simple link test, where the nodes are listening except for the short periods where packet transmission takes place.

**RAIL - SoC Simple TRX with Auto-ACK**: The Simple TRX with Auto-ACK example demonstrates how RAIL's Auto-ACK feature works. It can be used to set up a simple link test that requires Auto-ACK functionality.

**RAIL - SoC Simple TRX Standards**: The Simple TRX Standards example demonstrates the simplest packet exchange of transmit and receive operations between two nodes implemented in RAIL compatible with Bluetooth LE, IEEE 802.15.4 (2.4 GHz only) and IEEE 802.15.4g (subGHz only) standards. It can be used to set up a simple link test, where the nodes are listening except for the short periods where packet transmission takes place.

**RAIL - SoC RAILtest**: The RAILtest application (RAILtest) is a simple tool for testing the radio and the functionality of the RAIL library. It is fully documented in the [**RAILtest User's Guide**](/rail/3.1.0/railtest-users-guide).

**RAIL - SoC Range Test**: Range Test is a standalone test application that creates a radio link between devices and sends a predefined number of packets from the transmitter side to the receiver. The Range Test demo implements packet error rate (PER) measurement. PER is a commonly-used technique for measuring the quality of RF links in wireless systems under particular conditions. Range Test applications are documented in [**Flex SDK v3.x Range Test Demo User's Guide**](/rail/3.1.0/flex-v3x-range-test-demo).

**RAIL - SoC Wireless M-bus Meter and Collector**: Wireless M-bus applications are documented in [**Using RAIL for Wireless M-Bus Applications with EFR32**](/rail/3.1.0/rail-wmbus-apps-with-efr32).

Further example applications are available in the [SiliconLabs/proprietary_rail](https://github.com/SiliconLabs/proprietary_rail/) GitHub repository. This repository includes several example applications that illustrate the use of the RAIL library in various specific scenarios. These examples are compatible with Series 2 devices exclusively.

[**RAIL Proprietary - Tutorial Transmit**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_transmit): Application demonstrating the [Transmitting a Packet](https://docs.silabs.com/rail/latest/rail-training-tx/) tutorial.

[**RAIL Proprietary - Tutorial Event Handling**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_event_handling): Application demonstrating the [Event Handling and Automatic State Transitions](https://docs.silabs.com/rail/latest/rail-training-event/) tutorial.

[**RAIL Proprietary - Tutorial Downloading Messages**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_downloading_messages): Application demonstrating the [Downloading Received Messages](https://docs.silabs.com/rail/latest/rail-training-trx/) tutorial.

[**RAIL Proprietary - Address Filtering**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_address_filtering): Application designed to demonstrate the [RAIL Address Filtering APIs](https://docs.silabs.com/rail/latest/rail-api/address-filtering).

[**RAIL Proprietary - Improved RF Sense Transmitter**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_improved_rfsense_transmitter): Application illustrating how to enhance the Selective RF Sense range by transmitting across multiple frequencies.

[**RAIL Proprietary - Time Synchronization**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_time_synchronization): Application demonstrating how to synchronize local time within RAIL's timebase across multiple devices.

[**RAIL Proprietary - Direct Mode Packet Detector**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_direct_mode_detector): Application demonstrating how to utilize [Direct-to-PRS](https://docs.silabs.com/rail/latest/rail-developers-guide-direct-mode/) mode for detecting packets in software.

[**RAIL Proprietary - Direct to Buffer**](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_direct_to_buffer): Application demonstrating how to use [Direct-to-Buffer](https://docs.silabs.com/rail/latest/rail-developers-guide-direct-mode/) mode.

### RAIL SDK Services

#### Migration Guide

##### RAIL SDK 3.0.0

> **Highlights:**
> 
> - Uses RAIL LIB 3.0.0
> - PA configuration APIs updated to use RAIL handle parameter
> - Protocol enum `BTC` renamed to `BPSK`

###### Breaking Changes in Version 3.0.0

###### PA Configuration API Changes (heading level 7)

The mode switch PA configuration functions now require or have modified parameters:

```c
// Version 2.19.0 (OLD)
void init_rail_pa_settings(void);
void update_rail_pa_settings(sl_rail_handle_t rail_handle, uint16_t channel);

// Version 3.0.0 (NEW)
void init_rail_pa_settings(sl_rail_handle_t rail_handle);
void update_rail_pa_settings(sl_rail_handle_t rail_handle);

```

**Migration Steps:**

- Update calls to `init_rail_pa_settings()` to pass the RAIL handle
- Remove the `channel` parameter from calls to `update_rail_pa_settings()`

###### Protocol Enum Rename (heading level 7)

The protocol enum value `BTC` has been renamed to `BPSK`:

```c
// Version 2.19.0 (OLD)
RAIL_SDK_Protocol_t protocol = BTC;

// Version 3.0.0 (NEW)
RAIL_SDK_Protocol_t protocol = BPSK;

```

###### Removed Function (heading level 7)

The function `sl_rail_sdk_wmbus_phy_software()` has been removed as software-based PHY processing is no longer required.

---

##### RAIL SDK 2.19.0

> **Highlights:**
> 
> - Uses RAIL LIB 2.19.0
> - Examples now use `sl_main` instead of `sl_system`

###### Detailed API Change

- **API Naming:**  
  - Switched from `CamelCase` to `snake_case` for most APIs and typedefs.  
  - All public APIs now use `sl_rail_handle_t`, `sl_rail_status_t`, etc., instead of the old `RAIL_Handle_t`, `RAIL_Status_t`, etc.

###### Breaking Changes in Version 2.19.0

**Example of API Change:**

```c
// Version 2.18.2 (OLD)
uint16_t unpack_packet(
    uint8_t *rx_destination,
    const RAIL_RxPacketInfo_t *packet_information,
    uint8_t **start_of_payload,
    phy_modulation_e modulation
);

// Version 2.19.0 (NEW)
uint16_t unpack_packet(
    sl_rail_handle_t rail_handle,     // New first parameter
    uint8_t *rx_destination,
    const sl_rail_rx_packet_info_t *packet_information,  // Renamed type
    uint8_t **start_of_payload,
    phy_modulation_e modulation
);

```

**Manual Update for Range Test Projects:**

- If your project directory name contains `range_test`, you should manually:  
  - Remove any lines declaring `static RAIL_Handle_t rail_handle;` from all `.c` and `.h` files.  
  - Remove `rail_handle` from function parameter lists, regardless of its position (beginning, middle, or end).  
  - Remove any assignments to `rail_handle` and any standalone usages of `rail_handle` in your code, to ensure no obsolete references remain.

---

##### RAIL SDK 2.18.0

###### Directory and SDK Structure Changes

- **SiSDK-2024.12 Release:**  
  - RAIL and Connect SDKs are now separated.  
  - The former `FLEX SDK` is split into:    
    - `RAIL SDK`    
    - `Connect SDK`  
  - Directory changes: files moved from `app/flex` to `app/rail` and `app/connect`.

###### Component and API Renames

- **Component file names and APIs updated:**  
  - Any occurrence of `flex` in APIs or definitions updated to match the new structure.

###### Table of Changes

|Old File|New File|Changes|Details|
|---|---|---|---|
|simple_rail_assistance.h|sl_rail_sdk_simple_assistance.h|-||
|simple_rail_heartbeat.h|Deleted|-||
|simple_rail_rx.h|Deleted|-||
|simple_rail_rx_cli.h|Deleted|-||
|simple_rail_tx.h|Deleted|-||
|sl_flex_mode_switch.h|sl_rail_sdk_mode_switch.h|Rename API: prepare_package -> prepare_packet||
|sl_flex_ieee802154_support.h|sl_rail_sdk_ieee802154_support.h|Change part of names: FLEX -> RAIL_SDK , flex -> rail_sdk||
|sl_flex_rail_package_assistant.h|[sl_rail_sdk_packet_assistant.h](sl-rail-sdk-packet-assistant-h)|Rename API: prepare_package -> prepare_packet||
|sl_flex_packet_asm.h|sl_rail_sdk_packet_asm.h|Change part of names: FLEX -> RAIL_SDK, flex -> rail_sdk||
|sl_flex_rail_sleep.h|[sl_rail_sdk_sleep.h](sl-rail-sdk-sleep-h)|Rename API: sl_flex_rail_sleep_init -> sl_rail_sdk_sleep_init||
|sl_flex_util_802154_init.h|sl_rail_sdk_util_802154_init.h|Change part of names: sl_flex_util_init -> sl_rail_sdk_util_init, sl_flex_util_get_handle -> sl_rail_sdk_util_get_handle||
|sl_flex_util_ble_init.h|sl_rail_sdk_util_ble_init.h|Change part of names: sl_flex_util_init -> sl_rail_sdk_util_init, sl_flex_util_get_handle -> sl_rail_sdk_util_get_handle||
|sl_flex_util_ble_protocol.h|sl_rail_sdk_util_ble_protocol.h|Rename include sl_flex_util_ble_protocol_config -> sl_rail_sdk_util_ble_protocol_config||
|sl_rail_simple_cpc.h|sl_rail_sdk_simple_cpc.h|Change part of names: rail -> rail_sdk||
|sl_wmbus_packet_assembler.h|[sl_rail_sdk_wmbus_packet_assembler.h](sl-rail-sdk-wmbus-packet-assembler-h)|Change part of names: wmbus -> rail_sdk_wmbus||
|sl_wmbus_sensor_pulse_counter.h|[sl_rail_sdk_wmbus_sensor_core.h](sl-rail-sdk-wmbus-sensor-core-h)|Change part of names: wmbus -> rail_sdk_wmbus||
|sl_wmbus_sensor_pulse_counter.h|[sl_rail_sdk_wmbus_sensor_pulse_counter.h](sl-rail-sdk-wmbus-sensor-pulse-counter-h)|Change part of names: wmbus -> rail_sdk_wmbus||
|sl_wmbus_sensor_thermometer.h|[sl_rail_sdk_wmbus_sensor_thermometer.h](sl-rail-sdk-wmbus-sensor-thermometer-h)|Change part of names: wmbus -> rail_sdk_wmbus||
|sl_wmbus_sensor_virtual_water_meter.h|[sl_rail_sdk_wmbus_sensor_virtual_water_meter.h](sl-rail-sdk-wmbus-sensor-virtual-water-meter-h)|Change part of names: wmbus -> rail_sdk_wmbus||

#### Services

##### Introduction

The RAIL SDK components offer a practical framework for building wireless communication applications. These components help developers create applications that can adapt to various communication needs and manage power consumption effectively. Whether you're working on a simple project or a complex multi-protocol system, the RAIL SDK provides the necessary tools and features to support your development.

#### Extension

##### Extension

Extensions for the RAIL SDK are components that enhance existing sample applications or custom sample applications with new features without modifying the existing code. One such extension is the [Simple OS](rail-sdk-simple-os) extension. 

##### Modules

[Simple OS](rail-sdk-simple-os)

##### Simple OS

The [Simple OS](rail-sdk-simple-os) component in the RAIL SDK provides a basic structure for RAIL SDK users to update a baremetal application to an OS-based application. It supports FreeRTOS and Micrium OS, offering a seamless transition for developers who need to integrate OS functionalities into their applications.

###### Key Features

- **Task Initialization**: The [app_task_init()](rail-sdk-simple-os#app-task-init) function initializes the proprietary application task without using any dynamic memory allocation. This ensures that the task is created with a predefined stack and task buffer, making it suitable for memory-constrained environments.
- **Task Notification**: The [app_task_notify](rail-sdk-simple-os#app-task-notify) function is used to notify the kernel to allow the proprietary task to run. This function ensures that the task is only notified if it has been successfully created.
- **Static Task Allocation**: The component uses static task allocation to avoid dynamic memory allocation, which is crucial for systems with limited memory resources. The task stack and buffer are statically allocated, ensuring predictable memory usage.
- **Max Blocking Time**: The component defines a maximum blocking time for the proprietary application task, ensuring that the task does not block indefinitely.

###### Functions

###### app_task_init (heading level 7)

`void app_task_init(void)`

**Description:** Initialize the task that will run the proprietary task than includes, the proprietary routines including app_init and app_process functions.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### app_task_notify (heading level 7)

`void app_task_notify(void)`

**Description:** Notify the kernel to allow the proprietary task to run, as it is designed to wait for notifications or flags.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### print_sample_app_name (heading level 7)

`void print_sample_app_name(const char *app_name)`

**Description:** Print the sample app name with the OS which it is running on.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const char *|[in]|app_name|Sample app name to be printed.|

#### Utility

##### Utility

The Utility components in the RAIL SDK provide a toolbox of essential tools and functions that enhance the development and management of wireless communication applications. These utilities leverage various RAIL library features to offer additional capabilities, such as channel and PHY (Physical Layer) selection, power management integration, and packet handling. Below is a detailed description of the key components and their functionalities: 

##### Modules

[Channel Selector](rail-sdk-channel-selector)

[PHY Selector](rail-sdk-phy-selector)

[Packet Assistant](rail-sdk-packet-assistant)

[Power Manager Integration](sl-rail-sdk-sleep)

##### PHY Selector

The RAIL PHY Selector component allows the application to select the PHY configuration for communication. This component is useful for applications that need to switch between different PHY settings to optimize performance or comply with different communication standards. The component provides functions to set and get the selected PHY, ensuring that the application can easily switch PHY configurations as needed.

**Key functions include:**

- [set_selected_phy()](rail-sdk-phy-selector#set-selected-phy): Sets the PHY configuration for communication.
- [get_selected_phy()](rail-sdk-phy-selector#get-selected-phy): Retrieves the current PHY configuration.

###### Functions

###### set_selected_phy (heading level 7)

`uint8_t set_selected_phy(uint16_t new_phy)`

**Description:** Set the PHY the app will use.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t|[in]|new_phy|The requested new PHY number.|

**Returns**

- 1 if the PHY number is valid, otherwise 0.

###### get_selected_phy (heading level 7)

`uint16_t get_selected_phy(void)`

**Description:** Get the currently selected PHY number.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- The selected PHY number.

##### Power Manager Integration

The Power Manager Integration component integrates RAIL with the Power Manager to enable efficient power management. This integration ensures that the RAIL and Power Manager work together in a synchronized mode, allowing the application to manage power consumption effectively. The component provides functions to initialize the power management integration, ensuring that the application can enter and exit low-power states as needed.

**Key functions include:**

- [sl_rail_sdk_sleep_init()](sl-rail-sdk-sleep#sl-rail-sdk-sleep-init): Prepares the RAIL and Power Manager to work together in a synchronized mode.

###### Functions

###### sl_rail_sdk_sleep_init (heading level 7)

`sl_rail_status_t sl_rail_sdk_sleep_init(void)`

**Description:** Initializes RAIL and Power Manager to work together in SYNC mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This function sets up the necessary configurations and prepares the RAIL SDK sleep module for operation. It should be called before using any other functions in the sleep module.

**Returns**

- sl_rail_status_t  
  - SL_RAIL_STATUS_NO_ERROR if initialization was successful.  
  - An appropriate error code otherwise.

##### Channel Selector

The RAIL Channel Selector component allows the application to dynamically select the communication channel at both compile-time and runtime. This flexibility is crucial for applications that need to operate on different channels based on environmental conditions or regulatory requirements. The component provides functions to set and get the selected channel, ensuring that the application can easily switch channels as needed.

**Key functions include:**

- [set_selected_channel()](rail-sdk-channel-selector#set-selected-channel): Sets the communication channel.
- [get_selected_channel()](rail-sdk-channel-selector#get-selected-channel): Retrieves the current communication channel.
- [restart_rx_channel()](rail-sdk-channel-selector#restart-rx-channel): Restarts the RX operation on the selected channel.

###### Modules

[Configurations](rail-sdk-channel-selector-defines)

###### Functions

###### set_configured_channel (heading level 7)

`void set_configured_channel(void)`

**Description:** Sets the configured channel using the [DEFAULT_CHANNEL](rail-sdk-channel-selector-defines#default-channel) define.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Sets the configured channel to [DEFAULT_CHANNEL](rail-sdk-channel-selector-defines#default-channel)

###### set_selected_channel (heading level 7)

`uint8_t set_selected_channel(uint16_t new_channel)`

**Description:** Sets which channel the app will communicate on.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint16_t|[in]|new_channel|requested new channel number|

Tests the channel number with configured channel limits from radio configurator, if it is invalid first valid channel will be used. Also restarts the receiving by calling [restart_rx_channel()](rail-sdk-channel-selector#restart-rx-channel)

**Returns**

- 1 if channel number is valid else 0

###### get_selected_channel (heading level 7)

`uint16_t get_selected_channel(void)`

**Description:** Get which channel the app will communicate on.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- current channel number used for communication

###### restart_rx_channel (heading level 7)

`sl_rail_status_t restart_rx_channel(void)`

**Description:** Restarts the RX operation on the selected channel.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- status of the sl_rail_start_rx() function

###### Configurations

###### Macros (heading level 7)

`#define DEFAULT_CHANNEL 0`

**Description**: Default channel number to start the app.

##### Packet Assistant

The RAIL Packet Assistant component provides functions to prepare and unpack packets for various protocols such as Wi-SUN FSK, Wi-SUN OFDM, SUN OQPSK, and Sidewalk. This component ensures that the application can generate the appropriate packet headers for any selected PHY, allowing RAIL to send out the proper packet with the user payload. The component provides functions to prepare and unpack packets, ensuring that the application can handle different packet formats as needed.

**Key functions include:**

- [prepare_packet()](rail-sdk-packet-assistant#prepare-packet): Prepares the packet for sending and loads it into the RAIL TX FIFO.
- [unpack_packet()](rail-sdk-packet-assistant#unpack-packet): Unpacks the received packet, points to the payload, and returns the length.

###### Modules

[Configurations](rail-sdk-packet-assistant-defines)

[Type definitions](rail-sdk-packet-assistant-types)

###### Functions

###### validation_check (heading level 7)

`void validation_check(void)`

**Description:** Checks PHY setting to avoid errors at packet sending.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### update_assistant_pointers (heading level 7)

`void update_assistant_pointers(uint8_t new_phy_index)`

**Description:** Updates assistant pointers with a new PHY index.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_phy_index|The new PHY index to update.|

###### unpack_packet (heading level 7)

`uint16_t unpack_packet(sl_rail_handle_t rail_handle, uint8_t *rx_destination, const sl_rail_rx_packet_info_t *packet_information, uint8_t **start_of_payload)`

**Description:** Unpacks the received packet, points to the payload, and returns the length.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|sl_rail_handle_t|[in]|rail_handle|The RAIL handle used for unpacking the packet.|
|uint8_t *|[out]|rx_destination|Where should the full packet be unpacked.|
|const sl_rail_rx_packet_info_t *|[out]|packet_information|Where should all the information of the packet stored.|
|uint8_t **|[out]|start_of_payload|Pointer where the payload starts.|

**Returns**

- The length of the received payload.

###### prepare_packet (heading level 7)

`void prepare_packet(sl_rail_handle_t rail_handle, uint8_t *out_data, uint16_t length)`

**Description:** Prepares the packet for sending and load it in the RAIL TX FIFO.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|sl_rail_handle_t|[in]|rail_handle|Which rail handlers should be used for the TX FIFO writing|
|uint8_t *|[in]|out_data|The payload buffer|
|uint16_t|[in]|length|The length of the payload|

###### get_print_packet_info (heading level 7)

`uint8_t get_print_packet_info(void)`

**Description:** Get the print packet information.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This function retrieves the current print packet information setting. **Returns**

- The current print packet information setting.

###### set_print_packet_info (heading level 7)

`void set_print_packet_info(uint8_t new_print_packet_info)`

**Description:** Set the print packet information.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_print_packet_info|The new print packet information setting to be applied.|

This function sets a new value for the print packet information setting. 

###### printf_rx_packet (heading level 7)

`void printf_rx_packet(const uint8_t *const rx_buffer, uint16_t length)`

**Description:** Prints out the received packet.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const uint8_t *const|[in]|rx_buffer|The buffer where the packet is stored.|
|uint16_t|[in]|length|The length of the packet.|

This function prints the contents of the received packet. 

###### get_wisun_ofdm_rate (heading level 7)

`uint8_t get_wisun_ofdm_rate(void)`

**Description:** Get the Wi-SUN OFDM rate.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns the current Wi-SUN OFDM rate. **Returns**

- The Wi-SUN OFDM rate.

###### set_wisun_ofdm_rate (heading level 7)

`uint8_t set_wisun_ofdm_rate(uint8_t new_rate)`

**Description:** Set the Wi-SUN OFDM rate.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_rate|The new Wi-SUN OFDM rate to set.|

Sets the Wi-SUN OFDM rate to the specified value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_wisun_ofdm_scrambler (heading level 7)

`uint8_t get_wisun_ofdm_scrambler(void)`

**Description:** Get the Wi-SUN OFDM scrambler.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns the current Wi-SUN OFDM scrambler. **Returns**

- The Wi-SUN OFDM scrambler.

###### set_wisun_ofdm_scrambler (heading level 7)

`uint8_t set_wisun_ofdm_scrambler(uint8_t new_scrambler)`

**Description:** Set the Wi-SUN OFDM scrambler.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_scrambler|The new Wi-SUN OFDM scrambler to set, 2 bits wide (0-3)|

Sets the Wi-SUN OFDM scrambler to the specified value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_wisun_fsk_fcs (heading level 7)

`uint8_t get_wisun_fsk_fcs(void)`

**Description:** Get the Wi-SUN FSK FCS value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns the current Wi-SUN FSK FCS value. **Returns**

- The Wi-SUN FSK FCS value.

###### set_wisun_fsk_fcs (heading level 7)

`uint8_t set_wisun_fsk_fcs(uint8_t new_fcs)`

**Description:** Set the Wi-SUN FSK FCS value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_fcs|The new Wi-SUN FSK FCS value to set.|

Sets the Wi-SUN FSK FCS value to the specified new value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_wisun_fsk_whitening (heading level 7)

`uint8_t get_wisun_fsk_whitening(void)`

**Description:** Get the Wi-SUN FSK Whitening value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns the current Wi-SUN FSK Whitening value. **Returns**

- The Wi-SUN FSK Whitening value.

###### set_wisun_fsk_whitening (heading level 7)

`uint8_t set_wisun_fsk_whitening(uint8_t new_whitening)`

**Description:** Set the Wi-SUN FSK Whitening value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_whitening|The new Wi-SUN FSK Whitening value to set.|

Sets the Wi-SUN FSK Whitening value to the specified new value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_sun_oqpsk_spreading_mode (heading level 7)

`uint8_t get_sun_oqpsk_spreading_mode(void)`

**Description:** Get the Sun OQPSK Spreading Mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Retrieves the current Sun OQPSK Spreading Mode. **Returns**

- The current Sun OQPSK Spreading Mode.

###### set_sun_oqpsk_spreading_mode (heading level 7)

`uint8_t set_sun_oqpsk_spreading_mode(uint8_t new_spreading_mode)`

**Description:** Set the Sun OQPSK Spreading Mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_spreading_mode|The new Sun OQPSK Spreading Mode to set.|

Sets the Sun OQPSK Spreading Mode to the specified new mode. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_sun_oqpsk_rate_mode (heading level 7)

`uint8_t get_sun_oqpsk_rate_mode(void)`

**Description:** Get the Sun OQPSK Rate Mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Retrieves the current Sun OQPSK Rate Mode. **Returns**

- The current Sun OQPSK Rate Mode.

###### set_sun_oqpsk_rate_mode (heading level 7)

`uint8_t set_sun_oqpsk_rate_mode(uint8_t new_rate_mode)`

**Description:** Set the Sun OQPSK Rate Mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_rate_mode|The new Sun OQPSK Rate Mode to set, 2 bits wide (0-3)|

Sets the Sun OQPSK Rate Mode to the specified new mode. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_sidewalk_fcs_type (heading level 7)

`uint8_t get_sidewalk_fcs_type(void)`

**Description:** Get the Sidewalk FSK FCS value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Retrieves the current Sidewalk FSK FCS value. **Returns**

- The current Sidewalk FSK FCS value.

###### set_sidewalk_fcs_type (heading level 7)

`uint8_t set_sidewalk_fcs_type(uint8_t new_fcs)`

**Description:** Set the Sidewalk FSK FCS value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_fcs|The new Sidewalk FSK FCS value to set.|

Sets the Sidewalk FSK FCS value to the specified new value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### get_sidewalk_whitening (heading level 7)

`uint8_t get_sidewalk_whitening(void)`

**Description:** Get the Sidewalk Whitening value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Retrieves the current Sidewalk Whitening value. **Returns**

- The current Sidewalk Whitening value.

###### set_sidewalk_whitening (heading level 7)

`uint8_t set_sidewalk_whitening(uint8_t new_whitening)`

**Description:** Set the Sidewalk Whitening value.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|new_whitening|The new Sidewalk Whitening value to set.|

Sets the Sidewalk Whitening value to the specified new value. **Returns**

- 1 if the value was set successfully, 0 otherwise.

###### Configurations

###### Macros (heading level 7)

`#define PRINT_PACKET_INFO (0)`

**Description**: Enable assistant log prints.

`#define WISUN_FSK_FCS_TYPE (0)`

**Description**: Wi-SUN FCS is on/off.

`#define WISUN_FSK_WHITENING (1)`

**Description**: Wi-SUN Whitening is on/off.

`#define WISUN_OFDM_RATE (6)`

**Description**: Wi-SUN OFDM rate Configuration.

`#define WISUN_OFDM_SCRAMBLER (0)`

**Description**: Wi-SUN OFDM Scrambler Configuration.

`#define SUN_OQPSK_SPREADINGMODE (0)`

**Description**: SUN OQPSK spreading mode Configuration.

`#define SUN_OQPSK_RATEMODE (0)`

**Description**: SUN OQPSK rate mode Configuration.

`#define SIDEWALK_FSK_FCS_TYPE (1)`

**Description**: SideWalk FSK FCS is on/off.

`#define SIDEWALK_FSK_WHITENING (1)`

**Description**: SideWalk FSK Whitening is on/off.

###### Type definitions

###### Enumerations (heading level 7)

###### RAIL_SDK_Protocol_t (heading level 8)

```
enum RAIL_SDK_Protocol_t {
    CUSTOM_AND_SUN_OQPSK = 0
    EMBER_PHY = 1
    THREAD = 2
    BLE = 3
    CONNECT = 4
    ZIGBEE = 5
    ZWAVE = 6
    WISUN = 7
    BPSK = 8
    SIDEWALK = 9
    LONGRANGE = 10
    MBUS = 11
    SIGFOX = 12
    UNDEFINED = 13
}
```

**Description:**

Enumeration of different radio protocols.

**Details:**

This enumeration defines the various radio protocols that can be used.

**Enumerator:**

|   |   |
|---|---|
|CUSTOM_AND_SUN_OQPSK|Custom and SUN OQPSK protocol|
|EMBER_PHY|Ember PHY protocol|
|THREAD|Thread protocol|
|BLE|Bluetooth Low Energy protocol|
|CONNECT|Connect protocol, original, SUN-FSK and OFDM|
|ZIGBEE|Zigbee protocol|
|ZWAVE|Z-Wave protocol|
|WISUN|Wi-SUN protocol, FAN 1.0 and FAN 1.1 with OFDM|
|BPSK|BPSK protocol|
|SIDEWALK|Sidewalk protocol|
|LONGRANGE|Long-range protocol|
|MBUS|Wireless M-Bus protocol|
|SIGFOX|Sigfox protocol|
|UNDEFINED|Undefined protocol|

#### Wireless M-Bus

##### Wireless M-Bus Support

The Wireless M-Bus components in the RAIL SDK provide a comprehensive suite of tools and functionalities for developing and managing wireless communication applications that adhere to the Wireless M-Bus standard. These components are designed to facilitate the implementation of Wireless M-Bus communication in various types of devices, such as meters and sensors, by offering support for packet handling, encryption, channel and PHY selection, and power management. Below is a detailed description of the key components and their functionalities. 

##### Modules

[Wireless M-Bus Button Pulse Counter](rail-sdk-wmbus-sensor-pulse-counter)

[Wireless M-Bus Sensor Core](rail-sdk-wmbus-sensor-core)

[Wireless M-Bus Support](rail-sdk-wmbus-support)

[Wireless M-Bus Thermometer Sensor](rail-sdk-wmbus-sensor-thermometer)

[Wireless M-Bus Virtual Water Meter Sensor](rail-sdk-wmbus-sensor-virtual-water-meter)

##### Wireless M-Bus Button Pulse Counter

The Wireless M-Bus Pulse Counter component is part of the RAIL SDK's Wireless M-Bus suite, designed to count and send button presses between transmission frames. This component is specifically tailored for Wireless M-Bus meters, providing a solution for integrating pulse counter data into the Wireless M-Bus communication framework.

**Key Features:**

- **Pulse Counting**: Making button as a virtual pulse counter.

###### Modules

[Configurations](rail-sdk-wmbus-sensor-pulse-counter-defines)

###### Functions

###### sl_rail_sdk_wmbus_sensor_pulse_counter_init (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_pulse_counter_init(void)`

**Description:** Wireless M-Bus Pulse counter initialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_pulse_counter_deinit (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_pulse_counter_deinit(void)`

**Description:** Wireless M-Bus Pulse counter deinitialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_pulse_counter_measure (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_pulse_counter_measure(void)`

**Description:** Wireless M-Bus Pulse counter measure function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if measure was successful SL_STATUS_FAIL if measure failed

###### sl_rail_sdk_wmbus_sensor_pulse_counter_get_data (heading level 7)

`sl_rail_sdk_wmbus_sensor_data_t * sl_rail_sdk_wmbus_sensor_pulse_counter_get_data(void)`

**Description:** Retrieves the sensor data for the Wireless M-Bus pulse counter sensor.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns a pointer to the [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) structure that contains the sensor data for the Wireless M-Bus pulse counter sensor.

**Returns**

- Pointer to a [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t), the sensor data for the Wireless M-Bus pulse counter sensor

###### sl_rail_sdk_wmbus_sensor_pulse_counter_print (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_pulse_counter_print(void)`

**Description:** Wireless M-Bus Pulse counter 7 segment LCD print function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if 7 segment LCD print was successfully SL_STATUS_FAIL if 7 segment LCD print failed

###### sl_rail_sdk_wmbus_sensor_pulse_counter_button_pressed (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_pulse_counter_button_pressed(void)`

**Description:** Wireless M-Bus Pulse counter button pressed function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This function handles the button press event for the Wireless M-Bus pulse counter, in this case, it increments the counter value.

**Returns**

- sl_status_t: SL_STATUS_OK if button press was successfully SL_STATUS_FAIL if button press failed

###### Configurations

###### Macros (heading level 7)

`#define SL_RAIL_SDK_WMBUS_SENSOR_PULSE_COUNTER_SLEEPTIMER_PRIORITY 10`

**Description**: Priority of the sleeptimer used to periodically read the pulse counter.

`#define SL_RAIL_SDK_WMBUS_SENSOR_PULSE_COUNTER_SLEEPTIMER_TIMEOUT 1000`

**Description**: Timeout of the sleeptimer used to periodically read the pulse counter.

##### Wireless M-Bus Sensor Core

The Wireless M-Bus Sensor Core component is designed for use with Wireless M-Bus meters, providing the necessary tools to integrate various sensors into the Wireless M-Bus communication framework. This component simplifies the process of adding sensor data to Wireless M-Bus packets and ensures that the data is correctly formatted and transmitted.

**Key Features:**

- **Sensor Initialization**: Functions to initialize Wireless M-Bus sensors, ensuring they are correctly configured for communication.
- **Data Handling**: Functions to retrieve and format sensor data for inclusion in Wireless M-Bus packets.
- **Packet Assembly**: Tools to assemble packets with sensor data, ensuring that the data is correctly formatted and transmitted.

###### Modules

[Configurations](rail-sdk-wmbus-sensor-core-defines)

[Type definitions](rail-sdk-wmbus-sensor-core-types)

###### Functions

###### sl_rail_sdk_wmbus_sensor_core_get_active_sensor (heading level 7)

`sl_rail_sdk_wmbus_sensor_t * sl_rail_sdk_wmbus_sensor_core_get_active_sensor(void)`

**Description:** Get the active sensor.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- [sl_rail_sdk_wmbus_sensor_t](sl-rail-sdk-wmbus-sensor-t)* Pointer to the active sensor.

###### sl_rail_sdk_wmbus_sensor_core_set_active_sensor (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_core_set_active_sensor(uint8_t id)`

**Description:** Set the active sensor.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t|[in]|id|Sensor ID|

**Returns**

- sl_status_t: SL_STATUS_OK if successful, SL_STATUS_INVALID_PARAMETER if the sensor ID is invalid

###### sl_rail_sdk_wmbus_sensor_core_list_available_sensors (heading level 7)

`sl_rail_sdk_wmbus_sensor_t * sl_rail_sdk_wmbus_sensor_core_list_available_sensors(void)`

**Description:** Get the list of available sensors.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- [sl_rail_sdk_wmbus_sensor_t](sl-rail-sdk-wmbus-sensor-t)*: Pointer to the list of available sensors

###### sl_rail_sdk_wmbus_sensor_core_get_sensor_count (heading level 7)

`size_t sl_rail_sdk_wmbus_sensor_core_get_sensor_count(void)`

**Description:** Get the number of available sensors.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- size_t: Number of available sensors

###### sl_rail_sdk_wmbus_sensor_core_init (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_core_init(void)`

**Description:** Initialize the Wireless M-Bus sensor core.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Calls the initialization function of the active sensor.

**Returns**

- sl_status_t: SL_STATUS_OK if successful, SL_STATUS_FAILED if error

###### sl_rail_sdk_wmbus_sensor_core_lcd_init (heading level 7)

`void sl_rail_sdk_wmbus_sensor_core_lcd_init(void)`

**Description:** Initialize the Wireless M-Bus sensor core LCD.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### sl_rail_sdk_wmbus_sensor_core_process (heading level 7)

`uint16_t sl_rail_sdk_wmbus_sensor_core_process(uint8_t *tx_buffer, uint8_t *access_number)`

**Description:** Process the Wireless M-Bus sensor core.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|tx_buffer|The buffer to store the transmitted data.|
|uint8_t *|[out]|access_number|The access number for the Wireless M-Bus packet.|

Calls the packet assembler functions of the active sensor. It also passes the tx_buffer, access_number, and Wireless M-Bus accessibility to the packet assembler function.

**Returns**

- The result of the packet assembler function.

###### Configurations

###### Macros (heading level 7)

`#define SL_RAIL_SDK_WMBUS_SENSOR_ACTIVE_SENSOR_ID 0`

**Description**: Default active sensor index.

###### Type definitions

###### Modules (heading level 7)

[sl_rail_sdk_wmbus_sensor_t](sl-rail-sdk-wmbus-sensor-t)

###### Typedefs (heading level 7)

###### sl_rail_sdk_wmbus_sensor_init_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_init_t`

**Description:**

Typedef for a function pointer to initialize the Wireless M-Bus sensor.

**Details:**

Defines a function pointer type for a function that initializes the Wireless M-Bus sensor. Returns a status of type sl_status_t.

**Returns**

- sl_status_t Status code indicating the result of the initialization.

###### sl_rail_sdk_wmbus_sensor_deinit_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_deinit_t`

**Description:**

Typedef for a function pointer used to deinitialize the Wireless M-Bus sensor.

**Details:**

Defines a function pointer type for a function that deinitialize the Wireless M-Bus sensor. Returns a status of type sl_status_t.

**Returns**

- sl_status_t Status code indicating the result of the deinitialization.

###### sl_rail_sdk_wmbus_sensor_measure_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_measure_t`

**Description:**

Typedef for a function pointer that performs a sensor measurement.

**Details:**

Defines a function pointer type for a function that performs a sensor measurement and returns a status code of type sl_status_t.

**Returns**

- sl_status_t Status code indicating the result of the measurement.

###### sl_rail_sdk_wmbus_sensor_get_data_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_get_data_t`

**Description:**

Function pointer type for getting Wireless M-Bus sensor data.

**Details:**

Defines a function pointer type for a function that returns a pointer to a [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) structure.

**Returns**

- Pointer to a [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) structure.

###### sl_rail_sdk_wmbus_sensor_print_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_print_t`

**Description:**

Typedef for a function pointer used to print sensor information.

**Details:**

Defines a function pointer type for functions that print sensor information in the Wireless M-Bus sensor core SDK.

**Returns**

- A status code of type sl_status_t indicating the result of the print operation.

###### sl_rail_sdk_wmbus_sensor_button_pressed_t (heading level 8)

`sl_rail_sdk_wmbus_sensor_button_pressed_t`

**Description:**

Typedef for a function pointer that handles button press events.

**Details:**

Defines a function pointer type for a function that is called when a button is pressed in the Wireless M-Bus sensor application.

**Returns**

- A status code of type sl_status_t indicating the result of the button press handling.

Structure representing a Wireless M-Bus sensor. 

This structure contains function pointers to initialize the sensor, deinitialize the sensor, measure data, get data, print data on a 7 segment LCD display, and handle button press events. 

###### Public Attributes (heading level 8)

###### id (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_sensor_t::id
```

**Description:** Sensor ID.

###### name (heading level 9)

```
const char* sl_rail_sdk_wmbus_sensor_t::name
```

**Description:** Name of the sensor.

###### init_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_init_t sl_rail_sdk_wmbus_sensor_t::init_fnc_ptr
```

**Description:** Function pointer to initialize the sensor.

###### deinit_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_init_t sl_rail_sdk_wmbus_sensor_t::deinit_fnc_ptr
```

**Description:** Function pointer to deinitialize the sensor.

###### measure_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_measure_t sl_rail_sdk_wmbus_sensor_t::measure_fnc_ptr
```

**Description:** Function pointer to measure data.

###### get_data_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_get_data_t sl_rail_sdk_wmbus_sensor_t::get_data_fnc_ptr
```

**Description:** Function pointer to get data.

###### print_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_print_t sl_rail_sdk_wmbus_sensor_t::print_fnc_ptr
```

**Description:** Function pointer to print data on an 7 segment LCD display.

###### button_pressed_fnc_ptr (heading level 9)

```
sl_rail_sdk_wmbus_sensor_button_pressed_t sl_rail_sdk_wmbus_sensor_t::button_pressed_fnc_ptr
```

**Description:** Function pointer to handle button press.

##### Wireless M-Bus Support

The Wireless M-Bus Support component adds minimalist support for coding and decoding Wireless M-Bus packets. This component is essential for applications that need to communicate using the Wireless M-Bus protocol, providing the necessary tools to handle packet formatting and interpretation.

**Key Features:**

- **Packet Coding and Decoding**: Functions to encode and decode Wireless M-Bus packets, ensuring correct data formatting for transmission and reception.
- **Function Codes**: Defines a set of function codes used in the first block's C-field (see [sl_rail_sdk_wmbus_function_code_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-function-code-t)), such as WMBUS_FUNCTION_SND_NKE, WMBUS_FUNCTION_SND_UD, and WMBUS_FUNCTION_SND_NR.
- **Device Types**: Supports various device types used in address fields, including oil meters, electricity meters, gas meters, and more.
- **Manufacturer ID**: Functions to retrieve the manufacturer ID (M-field) for M-Bus addressing.
- **Encryption and Decryption**: Includes functions for encrypting and decrypting Wireless M-Bus frames using the Crypto5 algorithm.

###### Modules

[Configurations](rail-sdk-wmbus-support-defines)

[Type definitions](rail-sdk-wmbus-support-types)

###### Functions

###### sl_rail_sdk_wmbus_get_accessibility (heading level 7)

`sl_rail_sdk_wmbus_accessibility_t sl_rail_sdk_wmbus_get_accessibility(void)`

**Description:** Get the current Wireless M-Bus accessibility settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- the current value

###### sl_rail_sdk_wmbus_set_accessibility (heading level 7)

`void sl_rail_sdk_wmbus_set_accessibility(sl_rail_sdk_wmbus_accessibility_t new_wmbus_accessibility)`

**Description:** Set the current Wireless M-Bus accessibility settings.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_sdk_wmbus_accessibility_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-accessibility-t)|[in]|new_wmbus_accessibility|to be applied|

###### sl_rail_sdk_wmbus_init (heading level 7)

`void sl_rail_sdk_wmbus_init(void)`

**Description:** Initializes the MBUS and its mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### sl_rail_sdk_wmbus_set_mode (heading level 7)

`void sl_rail_sdk_wmbus_set_mode(sl_rail_sdk_wmbus_mode_t mode)`

**Description:** Sets the MBUS mode to use.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|[sl_rail_sdk_wmbus_mode_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-mode-t)|[in]|mode|is the desired mode of the Wireless M-Bus|

Currently only used to init and enable GPCRC for T mode Tx, and it also changes the time returned by [sl_rail_sdk_wmbus_get_meter_limited_acc_rx_start()](rail-sdk-wmbus-support#sl-rail-sdk-wmbus-get-meter-limited-acc-rx-start).

###### sl_rail_sdk_wmbus_get_selected_mode (heading level 7)

`sl_rail_sdk_wmbus_mode_t sl_rail_sdk_wmbus_get_selected_mode(void)`

**Description:** Gets the selected Wireless M-Bus mode.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- The selected mode of the Wireless M-Bus

###### sl_rail_sdk_wmbus_get_meter_limited_acc_rx_start (heading level 7)

`uint32_t sl_rail_sdk_wmbus_get_meter_limited_acc_rx_start(bool slowMode)`

**Description:** Returns the delay after TX when RX should start in limited accessibility sl_rail_sdk_wmbus_set_mode should be called before using this function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|bool|[in]|slowMode|True in case of slow mode. Only used in mode C and F|

**Returns**

- The delay in microseconds

###### sl_rail_sdk_wmbus_get_meter_limited_acc_rx_stop (heading level 7)

`uint32_t sl_rail_sdk_wmbus_get_meter_limited_acc_rx_stop(bool slowMode)`

**Description:** Returns the delay after TX when RX should stop in limited accessibility sl_rail_sdk_wmbus_set_mode should be called before using this function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|bool|[in]|slowMode|True in case of slow mode. Only used in mode C and F|

**Returns**

- The delay in microseconds

###### sl_rail_sdk_wmbus_frame_add_payload_int8 (heading level 7)

`uint8_t sl_rail_sdk_wmbus_frame_add_payload_int8(uint8_t *buffer, sl_rail_sdk_wmbus_frame_dib_function_t dibFunction, uint8_t vib, int8_t value)`

**Description:** Helper function for building the payload of a Wireless M-Bus frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|buffer|The buffer to write into. Should point at the first free byte|
|[sl_rail_sdk_wmbus_frame_dib_function_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-frame-dib-function-t)|[in]|dibFunction|Function field in the DIB (Data Information Block)|
|uint8_t|[in]|vib|Value information block containing the VIF (Value Information Field)|
|int8_t|[in]|value|The value of the data block.|

Adds an 8 bit integer (binary) data block to a buffer. **Returns**

- the number of bytes written into buffer

###### sl_rail_sdk_wmbus_frame_add_payload_int16 (heading level 7)

`uint8_t sl_rail_sdk_wmbus_frame_add_payload_int16(uint8_t *buffer, sl_rail_sdk_wmbus_frame_dib_function_t dibFunction, uint8_t vib, int16_t value)`

**Description:** Helper function for building the payload of a Wireless M-Bus frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|buffer|The buffer to write into. Should point at the first free byte|
|[sl_rail_sdk_wmbus_frame_dib_function_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-frame-dib-function-t)|[in]|dibFunction|Function field in the DIB (Data Information Block)|
|uint8_t|[in]|vib|Value information block containing the VIF (Value Information Field)|
|int16_t|[in]|value|The value of the data block.|

Adds a 16 bit integer (binary) data block to a buffer. **Returns**

- the number of bytes written into buffer

###### sl_rail_sdk_wmbus_frame_add_payload_int32 (heading level 7)

`uint8_t sl_rail_sdk_wmbus_frame_add_payload_int32(uint8_t *buffer, sl_rail_sdk_wmbus_frame_dib_function_t dibFunction, uint8_t vib, int32_t value)`

**Description:** Helper function for building the payload of a Wireless M-Bus frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|buffer|The buffer to write into. Should point at the first free byte|
|[sl_rail_sdk_wmbus_frame_dib_function_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-frame-dib-function-t)|[in]|dibFunction|Function field in the DIB (Data Information Block)|
|uint8_t|[in]|vib|Value information block containing the VIF (Value Information Field)|
|int32_t|[in]|value|The value of the data block.|

Adds a 32 bit integer (binary) data block to a buffer. **Returns**

- the number of bytes written into buffer

###### sl_rail_sdk_wmbus_frame_add_idle_filler (heading level 7)

`uint16_t sl_rail_sdk_wmbus_frame_add_idle_filler(uint8_t *buffer, uint16_t fillerLength)`

**Description:** Helper function for building the payload of a Wireless M-Bus frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|buffer|The buffer to write into. Should point at the first free byte|
|uint16_t|[in]|fillerLength|Number of bytes to fill.|

Adds filler bytes required before encryption **Returns**

- the number of bytes written into buffer

###### sl_rail_sdk_wmbus_frame_chars_to_mfield (heading level 7)

`uint16_t sl_rail_sdk_wmbus_frame_chars_to_mfield(const char *manuf)`

**Description:** Helper function for converting uppercase ASCII letters to 2B manufacturer ID.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const char *|[in]|manuf|Pointer to a 3 element char array, containing the uppercase letters of the manufacturer assigned by also known as DLMS FLAG ID|

**Returns**

- the manufacturer id (or M-field) for M-Bus addressing

###### sl_rail_sdk_wmbus_frame_mfield_to_chars (heading level 7)

`void sl_rail_sdk_wmbus_frame_mfield_to_chars(const uint16_t mfield, char *manuf)`

**Description:** Helper function for converting 2B manufacturer ID to 3 uppercase ASCII letter.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const uint16_t|[in]|mfield|mfield value|
|char *|[out]|manuf|pointer to a 3 element char array to write the 3 letters|

###### sl_rail_sdk_wmbus_frame_crypto5_init (heading level 7)

`void sl_rail_sdk_wmbus_frame_crypto5_init(void)`

**Description:** Initializes crypto engine.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

###### sl_rail_sdk_wmbus_frame_crypto5_set_key (heading level 7)

`void sl_rail_sdk_wmbus_frame_crypto5_set_key(const uint8_t *newKey)`

**Description:** Sets key for mode5 encryption/decryption (AES-CBC)

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|const uint8_t *|[in]|newKey|16B array containing the new key|

###### sl_rail_sdk_wmbus_frame_crypto5_get_key (heading level 7)

`void sl_rail_sdk_wmbus_frame_crypto5_get_key(uint8_t *key)`

**Description:** Returns key for mode5 encryption/decryption (AES-CBC)

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[out]|key|Copy of the current key|

###### sl_rail_sdk_wmbus_frame_crypto5_encrypt (heading level 7)

`uint8_t sl_rail_sdk_wmbus_frame_crypto5_encrypt(uint8_t *input, uint8_t *output, uint8_t *iv, uint16_t length, uint8_t encryptedBlocks)`

**Description:** Encrypts blocks using mode5 (AES-CBC) encryption.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|input|Input data. Should be at least 16B*encryptedBlocks long.|
|uint8_t *|[out]|output|Output data. Should be at least 16B*encryptedBlocks long. Can be the same as input.|
|uint8_t *|[inout]|iv|Initialization vector, 16B long|
|uint16_t|[in]|length|Length of the input data|
|uint8_t|[in]|encryptedBlocks|Number of blocks to encode. If 0, all data will be encoded based on length|

Also adds padding if needed, but the payload should include the 2B AES check (0x2f2f) in the beginning of the payload

**Returns**

- the number of blocks encoded. Output length is 16 times this value.

###### sl_rail_sdk_wmbus_frame_crypto5_decrypt (heading level 7)

`void sl_rail_sdk_wmbus_frame_crypto5_decrypt(uint8_t *input, uint8_t *output, uint8_t *iv, uint16_t length)`

**Description:** Decrypts blocks using mode5 (AES-CBC) encryption.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[in]|input|Input data. Should be at least length long.|
|uint8_t *|[out]|output|Output data. Should be at least length long. Can be the same as input.|
|uint8_t *|[inout]|iv|Initialization vector, 16B long|
|uint16_t|[in]|length|Length of the input data. Should be divisible by 16|

###### sl_rail_sdk_wmbus_setup_frame (heading level 7)

`uint16_t sl_rail_sdk_wmbus_setup_frame(uint8_t *buffer, uint8_t access_number, sl_rail_sdk_wmbus_accessibility_t accessibility, sl_rail_sdk_wmbus_device_type_t new_device_type, sl_rail_sdk_wmbus_sensor_data_t *sensors_data, bool periodic, bool encrypt)`

**Description:** Sets up a Wireless M-Bus frame.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|uint8_t *|[out]|buffer|The buffer to store the Wireless M-Bus frame.|
|uint8_t|[in]|access_number|The access number of the frame.|
|[sl_rail_sdk_wmbus_accessibility_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-accessibility-t)|[in]|accessibility|The accessibility of the frame.|
|[sl_rail_sdk_wmbus_device_type_t](rail-sdk-wmbus-support-types#sl-rail-sdk-wmbus-device-type-t)|[in]|new_device_type|The device type of the frame.|
|[sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) *|[in]|sensors_data|An array of data to be included in the frame.|
|bool|[in]|periodic|Indicates whether the frame is periodic or not.|
|bool|[in]|encrypt|Indicates whether the frame should be encrypted or not.|

Sets up a Wireless M-Bus frame by populating the provided buffer with the necessary information.

**Returns**

- The length of the assembled frame.

###### Configurations

###### Macros (heading level 7)

`#define SL_RAIL_SDK_WMBUS_TYPE WMBUS_MODE_T_METER`

**Description**: Default Wireless M-Bus mode.

`#define SL_RAIL_SDK_WMBUS_ACCESSIBILITY WMBUS_ACCESSIBILITY_LIMITED_ACCESS`

**Description**: Default Wireless M-Bus Accessibility.

###### Type definitions

###### Modules (heading level 7)

[sl_rail_sdk_wmbus_dll_header_t](sl-rail-sdk-wmbus-dll-header-t)

[sl_rail_sdk_wmbus_conf_word_t](sl-rail-sdk-wmbus-conf-word-t)

[sl_rail_sdk_wmbus_stl_header_t](sl-rail-sdk-wmbus-stl-header-t)

[sl_rail_sdk_wmbus_ltl_header_t](sl-rail-sdk-wmbus-ltl-header-t)

[sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t)

###### Enumerations (heading level 7)

###### sl_rail_sdk_wmbus_function_code_t (heading level 8)

```
enum sl_rail_sdk_wmbus_function_code_t {
    WMBUS_FUNCTION_SND_NKE = 0x0
    WMBUS_FUNCTION_SND_UD = 0x3
    WMBUS_FUNCTION_SND_NR = 0x4
    WMBUS_FUNCTION_SND_IR = 0x6
    WMBUS_FUNCTION_ACC_NR = 0x7
    WMBUS_FUNCTION_ACC_DMD = 0x8
    WMBUS_FUNCTION_REQ_UD1 = 0xA
    WMBUS_FUNCTION_REQ_UD2 = 0xB
}
```

**Description:**

Function code to use in the first block's C-field.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_FUNCTION_SND_NKE|SND-NKE.|
|WMBUS_FUNCTION_SND_UD|SND-UD/SND-UD2.|
|WMBUS_FUNCTION_SND_NR|SND-NR.|
|WMBUS_FUNCTION_SND_IR|SND-IR.|
|WMBUS_FUNCTION_ACC_NR|ACC-NR.|
|WMBUS_FUNCTION_ACC_DMD|ACC-DMD.|
|WMBUS_FUNCTION_REQ_UD1|REQ-UD1.|
|WMBUS_FUNCTION_REQ_UD2|REQ-UD2.|

###### sl_rail_sdk_wmbus_device_type_t (heading level 8)

```
enum sl_rail_sdk_wmbus_device_type_t {
    WMBUS_DEVICE_OTHER = 0x00
    WMBUS_DEVICE_OIL_METER
    WMBUS_DEVICE_ELECTRICITY_METER
    WMBUS_DEVICE_GAS_METER
    WMBUS_DEVICE_HEAT_METER
    WMBUS_DEVICE_STEAM_METER
    WMBUS_DEVICE_WARM_WATER_METER
    WMBUS_DEVICE_WATER_METER
    WMBUS_DEVICE_HEAT_COST_ALLOCATOR
    WMBUS_DEVICE_COMPRESSED_AIR
    WMBUS_DEVICE_COOLING_METER_OUTLET
    WMBUS_DEVICE_COOLING_METER_INLET
    WMBUS_DEVICE_HEAT_METER_INLET
    WMBUS_DEVICE_COMBINED_HEAT_COOLING_METER
    WMBUS_DEVICE_BUS_SYSTEM_COMPONENT
    WMBUS_DEVICE_CALORIFIC_VALUE = 0x14
    WMBUS_DEVICE_HOT_WATER_METER
    WMBUS_DEVICE_COLD_WATER_METER
    WMBUS_DEVICE_DUAL_WATER_METER
    WMBUS_DEVICE_PRESSURE_METER
    WMBUS_DEVICE_AD_CONVERTER
    WMBUS_DEVICE_SMOKE_DETECTOR
    WMBUS_DEVICE_ROOM_SENSOR
    WMBUS_DEVICE_GAS_DETECTOR
    WMBUS_DEVICE_BREAKER = 0x20
    WMBUS_DEVICE_VALVE
    WMBUS_DEVICE_CUSTOMER_UNIT = 0x25
    WMBUS_DEVICE_WASTE_WATER_METER = 0x28
    WMBUS_DEVICE_GARBAGE
    WMBUS_DEVICE_CARBON_DIOXIDE
    WMBUS_DEVICE_COMMUNICATION_CONTROLLER = 0x31
    WMBUS_DEVICE_UNIDIRECTIONAL_REPEATER
    WMBUS_DEVICE_BIDIRECTIONAL_REPEATER
    WMBUS_DEVICE_RADIO_CONVERTER_SYSTEM = 0x36
    WMBUS_DEVICE_RADIO_CONVERTER_METER
}
```

**Description:**

Device type to be used in the address field(s)

**Enumerator:**

|   |   |
|---|---|
|WMBUS_DEVICE_OTHER|Other.|
|WMBUS_DEVICE_OIL_METER|Oil meter.|
|WMBUS_DEVICE_ELECTRICITY_METER|Electricity meter.|
|WMBUS_DEVICE_GAS_METER|Gas meter.|
|WMBUS_DEVICE_HEAT_METER|Heat meter.|
|WMBUS_DEVICE_STEAM_METER|Steam meter.|
|WMBUS_DEVICE_WARM_WATER_METER|Warm water meter (30-90C)|
|WMBUS_DEVICE_WATER_METER|Water meter.|
|WMBUS_DEVICE_HEAT_COST_ALLOCATOR|Heat cost allocator.|
|WMBUS_DEVICE_COMPRESSED_AIR|Compressed air.|
|WMBUS_DEVICE_COOLING_METER_OUTLET|Cooling meter (volume measured at return temperature: outlet)|
|WMBUS_DEVICE_COOLING_METER_INLET|Cooling meter (volume measured at flow temperature: inlet)|
|WMBUS_DEVICE_HEAT_METER_INLET|Heat meter (volume measured at flow temperature: inlet)|
|WMBUS_DEVICE_COMBINED_HEAT_COOLING_METER|Combined heat/cooling meter.|
|WMBUS_DEVICE_BUS_SYSTEM_COMPONENT|Bus/system component.|
|WMBUS_DEVICE_CALORIFIC_VALUE|Calorific value.|
|WMBUS_DEVICE_HOT_WATER_METER|Hot water meter (>90C)|
|WMBUS_DEVICE_COLD_WATER_METER|Cold water meter.|
|WMBUS_DEVICE_DUAL_WATER_METER|Dual register (hot/cold) water meter.|
|WMBUS_DEVICE_PRESSURE_METER|Pressure meter.|
|WMBUS_DEVICE_AD_CONVERTER|A/D converter.|
|WMBUS_DEVICE_SMOKE_DETECTOR|Smoke detector.|
|WMBUS_DEVICE_ROOM_SENSOR|Room sensor (e.g.|
|WMBUS_DEVICE_GAS_DETECTOR|Gas detector.|
|WMBUS_DEVICE_BREAKER|Breaker (electricity)|
|WMBUS_DEVICE_VALVE|Valve (gas or water)|
|WMBUS_DEVICE_CUSTOMER_UNIT|Customer unit (display device)|
|WMBUS_DEVICE_WASTE_WATER_METER|Waste water meter.|
|WMBUS_DEVICE_GARBAGE|Garbage.|
|WMBUS_DEVICE_CARBON_DIOXIDE|Reserved for carbon dioxide.|
|WMBUS_DEVICE_COMMUNICATION_CONTROLLER|Communication controller (Gateway)|
|WMBUS_DEVICE_UNIDIRECTIONAL_REPEATER|Unidirectional repeater.|
|WMBUS_DEVICE_BIDIRECTIONAL_REPEATER|Bidirectional repeater.|
|WMBUS_DEVICE_RADIO_CONVERTER_SYSTEM|Radio converter (system side)|
|WMBUS_DEVICE_RADIO_CONVERTER_METER|Radio converter (meter side)|

###### sl_rail_sdk_wmbus_ci_field_t (heading level 8)

```
enum sl_rail_sdk_wmbus_ci_field_t {
    WMBUS_CI_DATA_TO_METER_NONE = 0x51
    WMBUS_CI_MBUS_DATA_TO_METER_SHORT = 0x5A
    WMBUS_CI_MBUS_DATA_TO_METER_LONG
    WMBUS_CI_COSEM_DATA_TO_METER_LONG = 0x60
    WMBUS_CI_COSEM_DATA_TO_METER_SHORT
    WMBUS_CI_OBIS_DATA_TO_METER_LONG = 0x64
    WMBUS_CI_OBIS_DATA_TO_METER_SHORT
    WMBUS_CI_EN13757_3_DATA_TO_METER_NONE = 0x69
    WMBUS_CI_EN13757_3_DATA_TO_METER_SHORT
    WMBUS_CI_EN13757_3_DATA_TO_METER_LONG
    WMBUS_CI_CLOCK_SYNC_ABSOLUTE
    WMBUS_CI_CLOCK_SYNC_RELATIVE
    WMBUS_CI_APPLICATION_ERROR_SHORT
    WMBUS_CI_APPLICATION_ERROR_LONG
    WMBUS_CI_APPLICATION_ERROR_NONE
    WMBUS_CI_ALARM_NONE
    WMBUS_CI_EN13757_3_APPLICATION_LONG
    WMBUS_CI_EN13757_3_APPLICATION_CF_LONG
    WMBUS_CI_ALARM_SHORT
    WMBUS_CI_ALARM_LONG
    WMBUS_CI_EN13757_3_APPLICATION_NONE = 0x78
    WMBUS_CI_EN13757_3_APPLICATION_CF_NONE
    WMBUS_CI_EN13757_3_APPLICATION_SHORT
    WMBUS_CI_EN13757_3_APPLICATION_CF_SHORT
    WMBUS_CI_COSEM_APPLICATION_LONG
    WMBUS_CI_COSEM_APPLICATION_SHORT
    WMBUS_CI_OBIS_APPLICATION_LONG
    WMBUS_CI_OBIS_APPLICATION_SHORT
    WMBUS_CI_EN13757_3_TRANSPORT_TO_METER_LONG
    WMBUS_CI_NETWORK_LAYER_DATA
    WMBUS_CI_FOR_FUTURE_USE
    WMBUS_CI_NETWORK_MANAGEMENT_APPLICATION
    WMBUS_CI_TRANSPORT_TO_METER_MBUS_COMPACT
    WMBUS_CI_NETWORK_MANAGEMENT_DATA = 0x89
    WMBUS_CI_EN13757_3_TRANSPORT_FROM_METER_SHORT
    WMBUS_CI_EN13757_3_TRANSPORT_FROM_METER_LONG
    WMBUS_CI_EXTENDED_LINK_LAYER1
    WMBUS_CI_EXTENDED_LINK_LAYER2
    WMBUS_CI_EXTENDED_LINK_LAYER3
    WMBUS_CI_EXTENDED_LINK_LAYER4
}
```

**Description:**

CI field codes.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_CI_DATA_TO_METER_NONE|Data sent by readout device to the Meter without transport layer.|
|WMBUS_CI_MBUS_DATA_TO_METER_SHORT|MBUS data sent by readout device to the Meter with short transport layer.|
|WMBUS_CI_MBUS_DATA_TO_METER_LONG|MBUS data sent by readout device to the Meter with long transport layer.|
|WMBUS_CI_COSEM_DATA_TO_METER_LONG|COSEM data sent by readout device to the Meter with long transport layer.|
|WMBUS_CI_COSEM_DATA_TO_METER_SHORT|COSEM data sent by readout device to the Meter with short transport layer.|
|WMBUS_CI_OBIS_DATA_TO_METER_LONG|OBIS based data sent by readout device to the Meter with long transport layer.|
|WMBUS_CI_OBIS_DATA_TO_METER_SHORT|OBIS based data sent by readout device to the Meter with short transport layer.|
|WMBUS_CI_EN13757_3_DATA_TO_METER_NONE|EN13757-3 application layer with Format frame and no transport layer.|
|WMBUS_CI_EN13757_3_DATA_TO_METER_SHORT|EN13757-3 application layer with Format frame and short transport layer.|
|WMBUS_CI_EN13757_3_DATA_TO_METER_LONG|EN13757-3 application layer with Format frame and long transport layer.|
|WMBUS_CI_CLOCK_SYNC_ABSOLUTE|Clock synchronisation (absolute)|
|WMBUS_CI_CLOCK_SYNC_RELATIVE|Clock synchronisation (relative)|
|WMBUS_CI_APPLICATION_ERROR_SHORT|Application error from Meter with short transport layer.|
|WMBUS_CI_APPLICATION_ERROR_LONG|Application error from Meter with long transport layer.|
|WMBUS_CI_APPLICATION_ERROR_NONE|Application error from Meter with no transport layer.|
|WMBUS_CI_ALARM_NONE|Alarm from Meter without transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_LONG|EN13757-3 application layer with long transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_CF_LONG|EN13757-3 application layer with compact frame and long transport layer.|
|WMBUS_CI_ALARM_SHORT|Alarm from Meter with short transport layer.|
|WMBUS_CI_ALARM_LONG|Alarm from Meter with long transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_NONE|EN13757-3 application layer with no transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_CF_NONE|EN13757-3 application layer with compact frame and no transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_SHORT|EN13757-3 application layer with short transport layer.|
|WMBUS_CI_EN13757_3_APPLICATION_CF_SHORT|EN13757-3 application layer with compact frame and short transport layer.|
|WMBUS_CI_COSEM_APPLICATION_LONG|COSEM application layer with long transport layer.|
|WMBUS_CI_COSEM_APPLICATION_SHORT|COSEM application layer with short transport layer.|
|WMBUS_CI_OBIS_APPLICATION_LONG|OBIS based application layer with long transport layer.|
|WMBUS_CI_OBIS_APPLICATION_SHORT|OBIS based application layer with short transport layer.|
|WMBUS_CI_EN13757_3_TRANSPORT_TO_METER_LONG|EN13757-3 Transport layer (long) from readout device to the meter.|
|WMBUS_CI_NETWORK_LAYER_DATA|Network layer data.|
|WMBUS_CI_FOR_FUTURE_USE|For future use.|
|WMBUS_CI_NETWORK_MANAGEMENT_APPLICATION|Network management application.|
|WMBUS_CI_TRANSPORT_TO_METER_MBUS_COMPACT|Transport layer to Meter (M Bus-Compact frame expected)|
|WMBUS_CI_NETWORK_MANAGEMENT_DATA|Reserved for Network management data (EN 13757-5)|
|WMBUS_CI_EN13757_3_TRANSPORT_FROM_METER_SHORT|EN13757-3 Transport layer (short) from the meter to the readout device.|
|WMBUS_CI_EN13757_3_TRANSPORT_FROM_METER_LONG|EN13757-3 Transport layer (long) from the meter to the readout device.|
|WMBUS_CI_EXTENDED_LINK_LAYER1|Extended Link Layer I (2B)|
|WMBUS_CI_EXTENDED_LINK_LAYER2|Extended Link Layer II (8B)|
|WMBUS_CI_EXTENDED_LINK_LAYER3|Extended Link Layer III (10B)|
|WMBUS_CI_EXTENDED_LINK_LAYER4|Extended Link Layer IV (16B)|

###### sl_rail_sdk_wmbus_status_t (heading level 8)

```
enum sl_rail_sdk_wmbus_status_t {
    WMBUS_STATUS_APPLICATION_BUSY = 0x1
    WMBUS_STATUS_APPLICATION_ERROR = 0x2
    WMBUS_STATUS_ABNORMAL_CONDITION = 0x3
    WMBUS_STATUS_POWER_LOW = 1 << 2
    WMBUS_STATUS_PERMANENT_ERROR = 1 << 3
    WMBUS_STATUS_TEMPORARY_ERROR = 1 << 4
}
```

**Description:**

Application errors coded into the status field.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_STATUS_APPLICATION_BUSY|Application busy.|
|WMBUS_STATUS_APPLICATION_ERROR|Any application error.|
|WMBUS_STATUS_ABNORMAL_CONDITION|Abnormal condition/alarm.|
|WMBUS_STATUS_POWER_LOW|Power low.|
|WMBUS_STATUS_PERMANENT_ERROR|Permanent error.|
|WMBUS_STATUS_TEMPORARY_ERROR|Temporary error.|

###### sl_rail_sdk_wmbus_accessibility_t (heading level 8)

```
enum sl_rail_sdk_wmbus_accessibility_t {
    WMBUS_ACCESSIBILITY_NO_ACCESS = 0
    WMBUS_ACCESSIBILITY_TEMPORARY_NO_ACCESS
    WMBUS_ACCESSIBILITY_LIMITED_ACCESS
    WMBUS_ACCESSIBILITY_UNLIMITED_ACCESS
}
```

**Description:**

Accessibility settings in the config word.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_ACCESSIBILITY_NO_ACCESS|No access (unidirectional)|
|WMBUS_ACCESSIBILITY_TEMPORARY_NO_ACCESS|Bidirectional, temporary no access.|
|WMBUS_ACCESSIBILITY_LIMITED_ACCESS|Bidirectional, limited access (short time after TX)|
|WMBUS_ACCESSIBILITY_UNLIMITED_ACCESS|Bidirectional, unlimited access.|

###### sl_rail_sdk_wmbus_frame_dib_function_t (heading level 8)

```
enum sl_rail_sdk_wmbus_frame_dib_function_t {
    WMBUS_DIB_FUNCTION_INSTANTANEOUS
    WMBUS_DIB_FUNCTION_MINIMUM
    WMBUS_DIB_FUNCTION_MAXIMUM
    WMBUS_DIB_FUNCTION_ERROR
}
```

**Description:**

Values for function field in DIB.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_DIB_FUNCTION_INSTANTANEOUS|Instantaneous value.|
|WMBUS_DIB_FUNCTION_MINIMUM|Minimum value.|
|WMBUS_DIB_FUNCTION_MAXIMUM|Maximum value.|
|WMBUS_DIB_FUNCTION_ERROR|Value during error state.|

###### sl_rail_sdk_wmbus_mode_t (heading level 8)

```
enum sl_rail_sdk_wmbus_mode_t {
    WMBUS_MODE_S
    WMBUS_MODE_T_METER
    WMBUS_MODE_T_COLLECTOR
    WMBUS_MODE_C
    WMBUS_MODE_F
    WMBUS_MODE_R2
    WMBUS_MODE_N_24
    WMBUS_MODE_N_48
    WMBUS_MODE_N_192
}
```

**Description:**

MBUS modes.

**Enumerator:**

|   |   |
|---|---|
|WMBUS_MODE_S|S mode.|
|WMBUS_MODE_T_METER|T mode, Meter to Other.|
|WMBUS_MODE_T_COLLECTOR|T mode, Other to Meter.|
|WMBUS_MODE_C|C mode.|
|WMBUS_MODE_F|F mode.|
|WMBUS_MODE_R2|R2 mode.|
|WMBUS_MODE_N_24|N mode, 2.4kbps (channel 2a and 2b)|
|WMBUS_MODE_N_48|N mode, 4.8kbps (channel 1a, 1b, 3a and 3b)|
|WMBUS_MODE_N_192|N mode, 19.2kbps (channel 0)|

Data link layer header (first block) 

###### Public Attributes (heading level 8)

###### lField (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_dll_header_t::lField
```

**Description:** Length field.

###### raw (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_dll_header_t::raw[8]
```

**Description:** Control field raw mode.

**Details:** Address field raw mode.

###### function_code (heading level 9)

```
sl_rail_sdk_wmbus_function_code_t sl_rail_sdk_wmbus_dll_header_t::function_code
```

**Description:** Control field function code.

###### fcv_dcf (heading level 9)

```
bool sl_rail_sdk_wmbus_dll_header_t::fcv_dcf
```

**Description:** Control field fcv/dcf.

###### fcb_acd (heading level 9)

```
bool sl_rail_sdk_wmbus_dll_header_t::fcb_acd
```

**Description:** Control field fcb/acd.

###### primary (heading level 9)

```
bool sl_rail_sdk_wmbus_dll_header_t::primary
```

**Description:** Control field, primary station bit.

###### detailed (heading level 9)

```
struct sl_rail_sdk_wmbus_dll_header_t::@0::@2 sl_rail_sdk_wmbus_dll_header_t::detailed
```

**Description:** Control field detailed mode.

###### c_field (heading level 9)

```
union sl_rail_sdk_wmbus_dll_header_t::@0 sl_rail_sdk_wmbus_dll_header_t::c_field
```

**Description:** Control field.

###### manufacturer (heading level 9)

```
uint16_t sl_rail_sdk_wmbus_dll_header_t::manufacturer
```

**Description:** Address, manufacturer ID.

###### id (heading level 9)

```
uint32_t sl_rail_sdk_wmbus_dll_header_t::id
```

**Description:** Address, device ID.

###### version (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_dll_header_t::version
```

**Description:** Address, version.

###### device_type (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_dll_header_t::device_type
```

**Description:** Address, device type.

###### detailed (heading level 9)

```
struct sl_rail_sdk_wmbus_dll_header_t::@1::@3 sl_rail_sdk_wmbus_dll_header_t::detailed
```

**Description:** Address field detailed mode.

###### address (heading level 9)

```
union sl_rail_sdk_wmbus_dll_header_t::@1 sl_rail_sdk_wmbus_dll_header_t::address
```

**Description:** Address field.

Data link layer header (first block) 

###### Public Attributes (heading level 8)

###### raw (heading level 9)

```
uint16_t sl_rail_sdk_wmbus_conf_word_t::raw
```

**Description:** Raw config word.

###### hop_counter (heading level 9)

```
bool sl_rail_sdk_wmbus_conf_word_t::hop_counter
```

**Description:** Hopcounter.

###### repeated_access (heading level 9)

```
bool sl_rail_sdk_wmbus_conf_word_t::repeated_access
```

**Description:** Repeated access.

###### content_of_message (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_conf_word_t::content_of_message
```

**Description:** Content of message.

###### num_of_enc_blocks (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_conf_word_t::num_of_enc_blocks
```

**Description:** Number of encoded blocks.

###### mode (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_conf_word_t::mode
```

**Description:** Mode (security) 5th bit is reserved as per 13757-4, but OMS uses it.

###### synchronized (heading level 9)

```
bool sl_rail_sdk_wmbus_conf_word_t::synchronized
```

**Description:** Synchronized or not.

###### accessibility (heading level 9)

```
sl_rail_sdk_wmbus_accessibility_t sl_rail_sdk_wmbus_conf_word_t::accessibility
```

**Description:** Accessibility.

###### mode_0_5 (heading level 9)

```
struct sl_rail_sdk_wmbus_conf_word_t::@4 sl_rail_sdk_wmbus_conf_word_t::mode_0_5
```

**Description:** Detailed config word for mode 0 and 5.

Short transport layer header. 

###### Public Attributes (heading level 8)

###### ci_field (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_stl_header_t::ci_field
```

**Description:** CI (control information) field.

###### access_number (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_stl_header_t::access_number
```

**Description:** Access number.

###### status (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_stl_header_t::status
```

**Description:** Status byte.

###### conf_word (heading level 9)

```
sl_rail_sdk_wmbus_conf_word_t sl_rail_sdk_wmbus_stl_header_t::conf_word
```

**Description:** Config word.

Long transport layer header. 

###### Public Attributes (heading level 8)

###### ci_field (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::ci_field
```

**Description:** CI (control information) field.

###### raw (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::raw[8]
```

**Description:** Raw address.

###### id (heading level 9)

```
uint32_t sl_rail_sdk_wmbus_ltl_header_t::id
```

**Description:** Address, device ID.

###### manufacturer (heading level 9)

```
uint16_t sl_rail_sdk_wmbus_ltl_header_t::manufacturer
```

**Description:** Address, manufacturer ID.

###### version (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::version
```

**Description:** Address, version.

###### device_type (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::device_type
```

**Description:** Address, device type.

###### detailed (heading level 9)

```
struct sl_rail_sdk_wmbus_ltl_header_t::@5::@6 sl_rail_sdk_wmbus_ltl_header_t::detailed
```

**Description:** Detailed address.

###### address (heading level 9)

```
union sl_rail_sdk_wmbus_ltl_header_t::@5 sl_rail_sdk_wmbus_ltl_header_t::address
```

**Description:** Address.

###### access_number (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::access_number
```

**Description:** Access number.

###### status (heading level 9)

```
uint8_t sl_rail_sdk_wmbus_ltl_header_t::status
```

**Description:** Status byte.

###### conf_word (heading level 9)

```
sl_rail_sdk_wmbus_conf_word_t sl_rail_sdk_wmbus_ltl_header_t::conf_word
```

**Description:** Config word.

Structure representing a Wireless M-Bus sensor data. 

Contains the value information field and the data field. 

###### Public Attributes (heading level 8)

###### vif (heading level 9)

```
uint32_t sl_rail_sdk_wmbus_sensor_data_t::vif
```

**Details:** value information field

###### data (heading level 9)

```
uint32_t sl_rail_sdk_wmbus_sensor_data_t::data
```

**Details:** data field

###### next (heading level 9)

```
struct sl_rail_sdk_wmbus_sensor_data* sl_rail_sdk_wmbus_sensor_data_t::next
```

**Details:** pointer to the next item

##### Wireless M-Bus Thermometer Sensor

The Wireless M-Bus Thermometer Sensor component is designed to monitor and measure temperature using a thermometer sensor. This component provides the necessary tools to integrate temperature data into Wireless M-Bus packets, ensuring that the data is correctly formatted and transmitted.

**Key Features:**

- **Temperature Measurement**: Functions to measure temperature using a thermometer sensor.
- **Data Handling**: Functions to retrieve and format temperature data for inclusion in Wireless M-Bus packets.
- **Packet Assembly**: Tools to assemble packets with temperature data, ensuring that the data is correctly formatted and transmitted.

###### Modules

[Configurations](rail-sdk-wmbus-sensor-thermometer-defines)

###### Functions

###### sl_rail_sdk_wmbus_sensor_thermometer_init (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_thermometer_init(void)`

**Description:** Wireless M-Bus Thermometer initialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_thermometer_deinit (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_thermometer_deinit(void)`

**Description:** Wireless M-Bus Thermometer deinitialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_thermometer_measure (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_thermometer_measure(void)`

**Description:** Wireless M-Bus Thermometer measure function function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Read sensor data.

**Returns**

- sl_status_t: SL_STATUS_OK if measure was successful SL_STATUS_FAIL if measure failed

###### sl_rail_sdk_wmbus_sensor_thermometer_get_data (heading level 7)

`sl_rail_sdk_wmbus_sensor_data_t * sl_rail_sdk_wmbus_sensor_thermometer_get_data(void)`

**Description:** Retrieves the sensor data for the Wireless M-Bus thermo meter sensor.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns a pointer to the [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) structure that contains the sensor data for the Wireless M-Bus thermo meter sensor.

**Returns**

- Pointer to a [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t), the sensor data for the Wireless M-Bus thermo meter sensor

###### sl_rail_sdk_wmbus_sensor_thermometer_print (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_thermometer_print(void)`

**Description:** Wireless M-Bus Thermometer 7 segment LCD print function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if measure was successful SL_STATUS_FAIL if measure failed

###### sl_rail_sdk_wmbus_sensor_thermometer_button_pressed (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_thermometer_button_pressed(void)`

**Description:** Wireless M-Bus Thermometer button pressed function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This function handles the button press event for the Wireless M-Bus thermo meter sensor, in this case, it changes the displayed value between temperature and humidity.

**Returns**

- sl_status_t: SL_STATUS_OK if measure was successful SL_STATUS_FAIL if measure failed

###### Configurations

###### Macros (heading level 7)

`#define SL_RAIL_SDK_WMBUS_SENSOR_THERMOMETER_SLEEPTIMER_PRIORITY 10`

**Description**: Default sleeptimer priority.

`#define SL_RAIL_SDK_WMBUS_SENSOR_THERMOMETER_SLEEPTIMER_TIMEOUT 1000`

**Description**: Default sleeptimer timeout.

##### Wireless M-Bus Virtual Water Meter Sensor

The Wireless M-Bus Virtual Water Meter Sensor component is a software-based solution designed to monitor and measure water usage in a given environment. This component provides the necessary tools to integrate water meter data into Wireless M-Bus packets, ensuring that the data is correctly formatted and transmitted.

**Key Features:**

- **Water Usage Measurement**: Functions to measure water usage using a virtual water meter sensor.
- **Data Handling**: Functions to retrieve and format water meter data for inclusion in Wireless M-Bus packets.
- **Packet Assembly**: Tools to assemble packets with water meter data, ensuring that the data is correctly formatted and transmitted.

###### Modules

[Configurations](rail-sdk-wmbus-sensor-virtual-water-meter-defines)

###### Functions

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_init (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_virtual_water_meter_init(void)`

**Description:** Wireless M-Bus Virtual Water Meter initialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_deinit (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_virtual_water_meter_deinit(void)`

**Description:** Wireless M-Bus Virtual Water Meter deinitialization function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if init was successful SL_STATUS_FAIL if init failed

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_measure (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_virtual_water_meter_measure(void)`

**Description:** Wireless M-Bus Virtual Water Meter measure function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if measure was successful SL_STATUS_FAIL if measure failed

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_get_data (heading level 7)

`sl_rail_sdk_wmbus_sensor_data_t * sl_rail_sdk_wmbus_sensor_virtual_water_meter_get_data(void)`

**Description:** Retrieves the sensor data for the Wireless M-Bus virtual water meter sensor.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

Returns a pointer to the [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t) structure that contains the sensor data for the Wireless M-Bus virtual water meter sensor.

**Returns**

- Pointer of a [sl_rail_sdk_wmbus_sensor_data_t](sl-rail-sdk-wmbus-sensor-data-t), to the sensor data for the Wireless M-Bus virtual water meter sensor

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_print (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_virtual_water_meter_print(void)`

**Description:** Wireless M-Bus Virtual Water Meter 7 segment LCD print function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

**Returns**

- sl_status_t: SL_STATUS_OK if 7 segment LCD print was successfully SL_STATUS_FAIL if 7 segment LCD print failed

###### sl_rail_sdk_wmbus_sensor_virtual_water_meter_button_pressed (heading level 7)

`sl_status_t sl_rail_sdk_wmbus_sensor_virtual_water_meter_button_pressed(void)`

**Description:** Wireless M-Bus Virtual Water Meter button pressed function.

**Parameters:**

|Type|Direction|Argument Name|Description|
|----|---------|-------------|-----------|
|void|N/A|undefined||

This function handles the button press event for the Wireless M-Bus virtual water meter sensor, in this case, it resets the total water consumption.

**Returns**

- sl_status_t: SL_STATUS_OK if button press was successful SL_STATUS_FAIL if button pressed failed

###### Configurations

###### Macros (heading level 7)

`#define SL_RAIL_SDK_WMBUS_SENSOR_VIRTUAL_WATER_METER_SLEEPTIMER_PRIORITY 10`

**Description**: Default sleeptimer priority.

`#define SL_RAIL_SDK_WMBUS_SENSOR_VIRTUAL_WATER_METER_SLEEPTIMER_TIMEOUT 1000`

**Description**: Default sleeptimer timeout.

### Flex SDK v3.x Range Test Demo User's Guide

#### Flex SDK v3.x Range Test Demo User's Guide

**NOTE: This section replaces _UG471: Flex SDK v3.x Range Test Demo User's Guide_. Further updates to this user guide will be provided here.**

This user's guide describes an easy way to evaluate the link budget of the Wireless Gecko EFR32 devices using Silicon Labs' Radio Abstraction Interface Layer (RAIL) by performing a range test between a transmitter and any number of receiver nodes. Range Test is a standalone test application that creates a radio link between the evaluation kits and sends a predefined number of packets from the transmitter side to the receiver. The Range Test demo implements packet error rate (PER) measurement. PER is a commonly-used technique for measuring the quality of RF links in wireless systems under particular conditions. Flex SDK 3.x contains multiple Range Test applications that enable the physical layer's (PHY) evaluation for a custom protocol or for standard protocols supported by RAIL (IEEE802.15.4g and Bluetooth LE).

Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

##### Key Points

- Evaluate the link budget of  Wireless Gecko EFR32 devices.
- Range Test is a standalone test application that creates a radio link between two evaluation kits.
- PER is a commonly-used technique for measuring the quality of RF links.
- EFR Connect smartphone application is now available for enhancing User Experience with the Dynamic Multiprotocol Range Test Applications.

#### Introduction

##### About the Range Test

The range test demo provides measurement results regarding the quality of the RF link. The demo uses at least two RF nodes. One node is used as the "transmitter" (TX) and the other(s) as the "receiver(s)" (RX). The transmitter sends packets to the receiver(s) repeatedly. The packet includes the self and remote IDs and the number of the sent packet. The packet number increments from packet to packet. The receiver receives the packet and checks the IDs. If they match, the packet number is stored and the received packet's RSSI displayed. Packet loss is therefore recognized by a packet number increase of greater than 1.

To conduct a range test, you will perform the following steps, described in more detail in later sections.

1. Connect the radio boards to the mainboards.
2. Connect the mainboards to the PC, select the **Flex (RAIL) - Range Test**  example and configure your custom settings using Radio Configurator. The range test is performed as a one-way radio communication. Configure the devices so that one is in RX and the other is in TX mode. It is important to set the self- and remote-IDs of the participants correctly.
3. Build the project and flash the image to the device.
4. If UART communication is not used, unplug the devices from the PC, put batteries into the mainboards and switch them on.
5. Start the test on both devices.
6. Actual packet transmission can be started at the transmit side by pressing **START** again.
7. Follow the progress of the test on the LCDs.

##### The Range Test Menu System

The Range Test applications have a clean menu system for configuring the measurement parameters both for the transmit and the receive side. The configurable parameters and the functions of the menu differ by the applications, and are described in [Configurable Parameters](03-using-the-range-test-applications#configurable-parameters).

Any application created for a Silicon Labs Development Kit is configured to use the Wireless Starter Kit mainboard LCD panel and push buttons to navigate through the menu. This is the default user interface, but other options are available to configure the device.

A Command Line Interface (CLI) is also provided for each application. Therefore, the LCD and/or the push buttons are not needed to use these applications, making the examples more suitable for custom designs.

##### Selection Guide for the Range Test Applications

Flex SDK 3.x provides four types of Range Test application, which are classified in the following table.

| |Since Protocol|Dynamic Multiprotocol|
|---|---|---|
|Custom PHY|Range Test|Range Test DMP|
|Standard PHY|Range Test BLE and IEEE802.15.4|Range Test BLE and IEEE802.15.4 with DMP|

###### Custom PHY vs Standard PHY Applications

Custom PHY Range Test applications are intended to evaluate the built-in or custom radio PHYs (defined in the _rail_config.c_ file). Standard PHY means Bluetooth LE (BLE) or IEEE802.15.4g protocol PHYs configured with RAIL APIs. With these applications these two protocols' RF performance can be evaluated.

###### Single Protocol vs Dynamic Multiprotocol

The Single Protocol applications supports both the CLI and push button/LCD interfaces to the application's menu.

EFR32 devices with Bluetooth LE stack support (devices from the EFR32BG|MG families) programmed with the Dynamic Multiprotocol (DMP) Range Test applications can be connected to a Bluetooth-capable smartphone. Once the connection is established, the receiver/transmitter node can be controlled by the EFR Connect smartphone application, which virtualizes the default menu system on the smartphone's screen. This makes the DMP Range Test applications portable for custom designs even if those have no USART capabilities.

While the DMP applications can also be used like the single protocol applications, through the mainboard's push buttons/LCD or the CLI, the smartphone control and visualization of the results may have some advantages over the regular experience. However, advertising, collecting the measurement results, and maintaining the Bluetooth LE connection requires more power. Because of this, the device should periodically switch between the Bluetooth LE and the other (measurable) radio configuration.

> **Note**: DMP applications require more RAM and flash memory than the single protocol applications.

![EFR Connect Smartphone Application's logo in Google Play](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-smartphone-application-s-logo-in-google-play.png)

#### Setting up Range Test Applications on the Development Kits

This section provides a quick summary on how to set up for range testing. Testing custom designs is outside the scope of this document. Therefore, the instructions assume the following:

- You have a complete development kit with two mainboards and two radio boards.
- You have installed Simplicity Studio 5 and Flex SDK 3.x.
- You are familiar with using Simplicity Studio to configure, build, and flash applications. For more details, see [Proprietary Flex SDK v3.x Quick Start Guide](/rail/{build-docspace-version}/proprietary-flex-sdk-v3x-quick-start-guide) or the online [Simplicity Studio 5 User's Guide](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/).

As noted above, running Range Test on a custom board is not extensively covered here. However, see section [A Note On Modifying The Application For Custom Boards](#a-note-on-modifying-the-application-for-custom-boards) for some guidance on this subject.

##### Prepare the Wireless Starter Kits

Every mainboard has a unique serial number that is displayed in Simplicity Studio's Launcher perspective once it is connected to the PC either with an ethernet or a USB cable.

The IP address and the serial number are displayed on the mainboard LCD during startup of the device, but may be lost when the app starts on the radio board. To see these again, disconnect and reconnect the mainboard’s power. Once the information is displayed, press and hold the RESET button. The information remains displayed as long as the button is pressed

> **Note**: The mainboard should be powered through its USB port, even if it is connected via Ethernet. Also, make sure that the 3-position power switch in the bottom left is set to AEM as shown in the following figure.

![Wireless Starter Kit Mainboard with Radio Board](/flex-v3x-range-test-demo/0.1/images/sld800-wireless-starter-kit-mainboard-with-radio-board.png)

If you are going to use the device as a mobile device to run the range test, connecting an external AA battery pack or a USB power bank to the mainboard board is recommended. The coin cell battery will not have enough power to do long-term testing. If the development kit is powered from a battery, change the 3-position switch from AEM to VBAT.

##### Create a New Range Test Application

This section assumes that you have installed Simplicity Studio 5 and the Flex SDK, and have your device(s) connected to the PC.

> **Note**: If you do not have a physical device handy, select the corresponding part in the **My Products** view to create a "virtual" device.

Select the physical or virtual device so that the **OVERVIEW** and other tabs are displayed in the **Launcher** perspective.

![Simplicity Studio's Launcher Perspective](/flex-v3x-range-test-demo/0.1/images/sld800-simplicity-studio-s-launcher-perspective.png)

Alternatively, you can generate a project without a virtual or physical device by selecting **Project > New > Silicon Labs Project wizard**. Select the target board and the preferred SDK along with the toolchain, and click **[Next]**.

![Alternative Project Creation Method](/flex-v3x-range-test-demo/0.1/images/sld800-alternative-project-creation-method.png)

In the Example Project Selection dialog, you can browse through the supported applications for the given part. You may filter with the Range Test keyword. Select an application and click **[Next]**.

![Example Browser in the New Project Wizard](/flex-v3x-range-test-demo/0.1/images/sld800-example-browser-in-the-new-project-wizard.png)

Rename the project, if desired. The project is placed into your current workspace by default, but you can select a different location. Finally, either copy the sources or link to them. Click **[Finish]**. Project creation may take a short time.

![Configuration in the New Project Wizard](/flex-v3x-range-test-demo/0.1/images/sld800-configuration-in-the-new-project-wizard.png)

> **Note**: Creating the project means copying or linking all the required source code into your project's folder, setting up project configurations based on the installed components and generating all the project customizations (basically through header files) according to the configurable components' default settings.

##### Customizing the Application

If you have created a custom PHY application, the Radio Configurator interface (stored in the .radioconf file) is displayed. Here you can set up the desired PHY. You can browse through the built-in PHYs or create a custom configuration (recommended only for experienced users). Saving this file generates a new _radio_config.c_ file. For more information on how to set the modem parameters, refer to [Proprietary Radio Configurator Guide](/rail/{build-docspace-version}/proprietary-radio-configurator-guide).

Otherwise, for a Standard PHY application, the project's, the _.slcp_ file is opened in the project editor tool called the Project Configurator. Generally, and if you are working with development kits, you should not modify this file. The project is ready to build.

> **Note**: If you closed the Radio Configurator, you can re-open it from the Project Configurator’s Configuration Tools tab.

![The Radio Configurator Interface](/flex-v3x-range-test-demo/0.1/images/sld800-the-radio-configurator-interface.png)

##### A Note on Modifying the Application for Custom Boards

Though the default Range Test user interface is the mainboard's LCD and push buttons, the application can be driven exclusively by CLI if desired. Hence, with some modifications, Range Test applications can run on custom designs that lack LCD and push buttons.

The standard single protocol version of Range Test simplifies this task, reducing the effort required to purge LCD and push button support from the application to two simple steps. In the Component Editor, uninstall the following components (search for the component name to locate):

- **Simple Button**
- **GLIB Graphics Library**

Doing so removes all dependencies but retains the **Sleeptimer** component. Macros in the application source code will then exclude from the build sections related to the LCD and push buttons, enabling the project to compile with only CLI support. Porting this to a custom board may require further modifications to translate the mainboard default settings (for example, the USART configuration) to the custom design, but the steps above will produce a viable CLI-only application that can be demonstrated on a mainboard before transitioning to your custom target.

##### PHY Limitations

Range Test applications work with a fixed packet length by default. Some profiles (Long Range, Connect, wM-Bus) define variable length packet configurations in their PHYs, but length configuration will be overridden with the fixed length setup configured on the application's menu. This limitation should be considered when designing the protocol for evaluation.

##### Build the Application

When you have finished configuring the project, click **Build** (hammer icon) on the toolbar.

![Build Icon](/flex-v3x-range-test-demo/0.1/images/sld800-build-icon.png)

Your sample application will be compiled based on its build configuration.

##### Load the Application onto a Device

Once the binary file has been generated you can flash it onto a connected device with the following options:

1. Use **Flash to Device**: Right-click the image file in Project Explorer view and select **Flash to Device** to open the Flash Programmer. ![Flash Tool](/flex-v3x-range-test-demo/0.1/images/sld800-flash-tool.png)
2. Use Simplicity Commander:  Run the executable file located under Simplicity Studio's installation folder in the `developer/adapter_packs/commander` folder, or open it through the **Tools** button on the toolbar or the Project COMPATIBLE TOOLS tab.
3. Use the debug functionality: Click **Debug** (bug icon) on the menu to (incrementally) build the project if any modifications have been made since the last build. With this mode all the debug functionality will be available.

#### Using the Range Test Applications

On startup, the Welcome Screen is shown on the LCD. This includes the Silicon Laboratories logo, the carrier frequency and the RF power level. The Welcome Screen is shown for up to three seconds, or as long as any push button is held down. The following figures show the Welcome screen for Custom PHY applications and Standard PHY applications, respectively.

![Welcome LCD UPD](/flex-v3x-range-test-demo/0.1/images/sld800-welcome-lcd-upd.png)

##### Configuration

###### Configurable Parameters

Next, the LCD displays the menu, on which the (mostly configurable) parameters and functions are displayed. The menu differs slightly, depending on the selected mode. The **Show Information** and the **Start Range Test** functions are also displayed. Selecting **Show Information** refreshes the screen to show the Welcome Screen again. The following figures show the menu for TX and RX.

![LCD Configuration Parameters](/flex-v3x-range-test-demo/0.1/images/sld800-lcd-configuration-parameters.png)

The menu options are:

###### Common (heading level 7)

- **Mode** (RX or TX): The applications start in RX mode by default, but the mode can be changed any time, before or between measurements. In addition, the same device can act as a transmitter and then as a receiver without resetting the device.
- **PHY**: Only configurable in a Standard PHY application (BLE 1/2Mbps or 802.15.4) and if you have a Multi-PHY radio configuration in a Custom PHY application.
- **Frequency**: Not a configurable parameter, but shows the selected PHY's base channel frequency. Therefore it is not updated when the Channel number is increased.
- **Channel number**: Selects the channel on which the RX node(s) will listen or the TX node will transmit.
- **Payload length**: Configurable between 7-64 in a Custom PHY application. In a Standard PHY application it can be configured to between 5-24 with a BLE PHY or 5-116 with an 802.15.4 PHY.
- **Packet count**: Ranges from 500 to infinite in both Modes, and sets the transmitted/expected number of packets on the participants.
- **Remote/Self ID**: In RX Mode, the radio listens on the given channel and inspects the packets received. Only packets that are sent with matching **Self ID** and **Remote ID** will be processed. Therefore the IDs should be configured on the TX accordingly.

###### RX/TX only Parameters (heading level 7)

- **MA Window size (RX only)**: Moving Average or MA window size configures how many packets will be counted in a shorter PER measurement during the test. The moving average PER is useful when trying to position the devices until you get a specific PER, for example to find the maximum distance between the units for 1% PER. The moving average in this case shows an almost instantaneous PER. When the positions are fixed you can re-run the test and the total PER for many packets will provide more accurate result.
- **Power (TX only)**: Output power can be set in the LCD menu in 0.5 dBm steps (power setpoint), between -15 and +20 dBm. Actual minimum and maximum power may vary on different frequencies and different parts. Also, the target power may differ from the power that is set by RAIL. The LCD menu informs the user about the setpoint and the actual power in that order.
- **UART log enable (TX only)**: If on, a status message can be observed on the UART TX line for each radio packet, formatted in human readable format. The default pin assignment is the standard VCOM port available on the mainboard.  
  > **Note**: This mode will not interfere with the command line interface (CLI). The CLI will be available regardless of whether or not the UART log is enabled.

Many of these options are also available in the EFR Connect smartphone app. After the menu items are configured, the range test can be started. During the test, all of the measured information can be observed on the LCD or the smartphone's screen.

###### Configure on the LCD Menu Using Push Buttons

The two push buttons on the mainboard are used to navigate through the menu system; soft labels on the bottom of the screen describe the current function of each button. In general, button 1 is used to navigate down through the menu items. Button 0 is used to configure the menu item selected by the pointer. Items with a **+** sign in the right bottom label are configurable.

###### Configure Using the Command Line

You can access all the configurable parameters (not depending on the Mode) through the CLI. The parameters can be written or read by commands starting with `set` or `get`, respectively.

To see the available commands and the available arguments issue, the `help` command.

###### Configure Through the EFR Connect Smartphone Application

Many configurable parameters can be set through the EFR Connect smartphone application, once a connection has been established. See section [Configurable Parameters](#configurable-parameters) for more information

##### Using the EFR Connect Smartphone Application

The Silicon Labs EFR Connect app uses the Bluetooth adapter on your phone/tablet to scan, advertise, connect, and interact with Bluetooth LE devices.

Documentation for EFR Connect is available through [docs.silabs.com](https://docs.silabs.com). When the EFR Connect smartphone app is opened, the following screen is displayed.

![ERF Connect Demo List UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-demo-list-upd.png)

Select **Range Test Demo** from the list of available applications.

Select the kit to which you would like to connect. The IDs are the last 4 bytes by of the MCU's Unique ID.

![ERF Connect Device List UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-device-list-upd.png)

Select the application's mode: TX or RX.

![ERF Connect Mode Selection UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-mode-selection-upd.png)

Selecting a mode establish the connection, and the device stops advertising as long as it is connected to the smartphone. Therefore you should reconnect to the device to change its mode.

> **Note**: An ongoing RX measurement will block re-connection, since the device will not advertise while it is waiting for the TX node's packets. To reconnect, first terminate measurement either by using the push buttons or by a CLI command.

The following figures show the starting screen for RX and TX.

![ERF Connect Welcome RX UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-welcome-rx-upd.png)   ![ERF Connect Welcome TX UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-welcome-tx-upd.png)

The following screens shows RX and TX mode with ongoing measurements.

![ERF Connect Ongoing RX UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-ongoing-rx-upd.png)   ![ERF Connect Ongoing TX UPD](/flex-v3x-range-test-demo/0.1/images/sld800-efr-connect-ongoing-tx-upd.png)

The same configuration parameters are available as on the LCD.

> **Notes**:
> 
> - Do not change the Mode using the push buttons or a CLI command while the connection is established between the device and your smartphone.
> - If you measure Bluetooth LE PHY in a Standard PHY application, the connection will be created through a separate Bluetooth LE protocol, with the Bluetooth LE stack, and will not interfere with the measurement.
> - If you start an RX measurement, stop it before trying to reconnect to the device. Otherwise the device will not advertise itself. However, during TX measurement the device continues to send advertising packets.
> - The smartphone application has a much longer RSSI history than is available on the mainboard's LCD.

##### Application Execution Tips

The test on the TX side runs as long as the number of transmitted packets reaches the predefined number or until the test is terminated by pressing Button 0. You can follow the number of transmitted packets on the transmit-side's LCD.

The RX side restarts whenever it receives a lower-indexed packet than the last one with the expected **Remote** and **Self ID**. The signal strength of the incoming packet is measured during packet reception, and the actual RSSI value is shown on the LCD. The RSSI values are also presented as a graph.

The number of lost packets and the packet error rate are defined only at the receive side and are based on the first and last received packet numbers, regardless of the **Packet count** parameter.

The RSSI is typically used to qualify the link: a higher level might show a better link quality. The actual RSSI value is measured when the sync word of the packet is received (for more details see `RAIL_RxPacketDetails_t.rssi`).

It is not necessary to start both sides synchronously as well as to receive the first **N** packets.

The range test can be performed inside a building if indoor propagation is tested. However, line-of-sight testing outside the building is recommended to get the best possible range result, as well as the best comparable results from different settings. It is also recommended that the antennas be located at least 1.5 m above the ground.

If PER < 1%, reset the current measurements on the boards and try moving the two devices closer. Propagation conditions usually improve if you distance yourself from a possibly faded area.

#### Range Test Applications' Metrics

Range Test creates a radio link between the evaluation kits and sends a predefined number of packets from the transmitter to the receiver node. The receiver node continually recalculates and reports PER during the entire measurement. The application displays the current Received Signal Strength Indicator (RSSI) level in dBm units and draws a chart of the RSSI historical data. For long tests the transmitter can be set up to transmit infinitely.

##### Range Test's Packet Assembly

Simple PHY Range Test applications' packet structure includes a packet counter, a destination and a source id, as shown in the source code below.

```C
typedef struct range_test_packet_t{
  uint16_t packet_counter;    ///> Value showing the number of this packet.
  uint8_t  destination_id;    ///> Destination device ID this packet was sent to.
  uint8_t  source_id;         ///> Device ID which shows which device sent this packet.
  uint8_t  repeat;            ///> Unused.
} range_test_packet_t;
```

In 802.15.4 mode the application sets up a similar packet payload, immediately after setting up the MAC header (MHR) field. Both destination address and PAN ID are set to broadcast (0xFFFF), while the source address is 0x0000.

```C
  data_frame->payload.source_id = range_test_settings.source_id;
  data_frame->payload.destination_id = range_test_settings.destination_id;
  data_frame->payload.packet_counter = packet_number;
  data_frame->payload.repeat = 0x00;
```

In BLE mode the application sends non-connectable undirected advertisement packets. The packet number and the IDs are configured as shown in the following code snippet:

```C
  ble_tx_pdu->manufactSpec.payload.packet_counter = packet_number;
  ble_tx_pdu->manufactSpec.payload.destination_id = range_test_settings.destination_id;
  ble_tx_pdu->manufactSpec.payload.source_id = range_test_settings.source_id;
  ble_tx_pdu->manufactSpec.payload.repeat = 0xFF;
```

In each cases the remaining part of the packet/payload is padded with `0x55` and `0xAA` at the odd and even byte indexes, respectively.

##### Definition of Packet Error Rate

Packet error rate is calculated according to the following equation:

![PER def](/flex-v3x-range-test-demo/0.1/images/sld800-per-def.png)

Where _PTX_ is the number of sent packets and _PRX_ is the number of received packets.

#### Expected Results

The following table contains expected range test results for the EFR32FG1 series boards under conditions recommended in section [Application Execution Tips](03-using-the-range-test-applications#application-execution-tips).

|Configuration|Tx Power (dBm)|Rx Sensitivity (dBm)|PCB Antenna Gain (dB)|Range in Dry Weather Condition (m)|Range in Wet Weather Condition (m)|Link Budget (dB)|
|---|---|---|---|---|---|---|
|169 MHz 2GFSK 2.4 kbps 1.2 kHz|19.5|-124|-12.5|3000|480|118.5|
|169 MHz 2GFSK 38.4 kbps 20 kHz|19.5|-112|-12.5|1200|240|106.5|
|169 MHz 2GFSK 500 kbps 125 kHz|19.5|-97|-12.5|380|100|91.5|
|433 MHz 2GFSK 2.4 kbps 1.2 kHz|10|-122.5|-0.5|4400|640|131.|
|433 MHz 2GFSK 50 kbps 25 kHz|10|-110|-0.5|1600|310|119|
|433 MHz 2GFSK 100 kbps 50 kHz|10|-107.5|-0.5|1300|270|116.5|
|490 MHz 2GFSK 2.4 kbps 1.2 kHz|19.5|-123|0|9400|1100|142.5|
|490 MHz 2GFSK 10 kbps 5 kHz|19.5|-118|0|6400|850|137.5|
|490 MHz 2GFSK 38.4 kbps 20 kHz|19.5|-111.6|0|3900|590|131.1|
|490 MHz 2GFSK 100 kbps 50 kHz|19.5|-107.8|0|2900|470|127.3|
|868 MHz 2GFSK 2.4 kbps 1.2 kHz|13|-118.2|0|2700|440|131.2|
|868 MHz 2GFSK 38.4 kbps 20 kHz|13|-109.1|0|1300|260|122.1|
|868 MHz 2GFSK 500 kbps 125 kHz|13|-100|0|670|150|113|
|915 MHz 2GFSK 0.6 kbps 0.3 kHz|19.5|-125|0.5|7800|990|145.5|
|915 MHz 2GFSK 50 kbps 25 kHz|19.5|-107.9|0.5|2100|370|128.4|
|915 MHz 2GFSK 100 kbps 50 kHz|19.5|-105.5|0.5|1700|300|126|
|915 MHz 2GFSK 500 kbps 175 kHz|19.5|-98|0.5|980|200|118.5|
|2.4 GHz 2GFSK 250 kbps|19.5|-99|1-3|280|105|122.5|
|2.4 GHz 2GFSK 1 Mbps|19.5|-93.1|1-3|180|75|116.5|

### RAILtest User Guide

#### RAILtest User Guide

> **Note: This section replaces _UG409: RAILtest User Guide_. Further updates to this user guide note will be provided here**.

The RAILtest application (RAILtest) provides you with a simple tool for testing the radio and the functionality of the RAIL library. For more advanced usage, developers must write software against the RAIL library and create a custom radio configuration.

Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

##### Key Points

- Command Line Interface description
- Application features
- Protocol-specific features
- Testing modes

#### Overview

The following is a summary of functionality provided as part of the RAILtest application:

- Transmit and receive packets
- Schedule transmits at a specific time in the RAIL timebase
- Configure RAIL address filtering to receive only specific packets
- Enable CCA mechanisms (CSMA/LBT) to validate that a channel is clear before transmit
- Set a timer callback in the RAIL timebase to see how the RAIL timer API works
- Change the transmit channel within the current configuration's band
- Change the transmit power level
- Enable RF energy sensing of a specified duration across the 2.4 GHz and/or Sub 1-GHz bands, and sleep to wake on this event.
- Output a continuous unmodulated tone for debugging
- Output a continuous modulated PN9 stream for debugging
- Enter into direct mode where data can be sent and received using asynchronous GPIOs as input and output

##### About RAILtest Versions

RAILtest version 2.14 was released with Gecko SDK (GSDK) v4.2. Previous versions are as follows:

- GSDK v4.1: RAILtest v2.13
- GSDK v4.0: RAILtest v2.12
- GSDK v3.2: RAILtest v2.11
- GSDK v3.1: RAILtest v2.10
- GSDK v3.0: RAILtest v2.9
- GSDK v2.7: RAILtest v2.8

##### Modes

RAILtest can be in a number of different modes. Each of these modes enables a subset of the test application's functionality, so that nonsensical commands (such as trying to transmit a tone and a packet at the same time) are ignored. The following are supported modes, with a short description.

- **None**: The app is doing nothing, but the radio may be on. Parameters can be set in this mode based on the current radio state, and the timer can be used.
- **Stream**: Send a stream of pseudo-random bits.
- **Tone**: Send a tone at the carrier frequency.
- **ContinuousTx**: Send an unending stream of packets, separated by a configurable delay.
- **DirectMode**: Send data to and from a GPIO, without any packet handling.
- **PacketTx**: Send a specific number of packets, with a summary print at the end.
- **ScheduledTx**: Send one packet scheduled in the future.
- **TxAfterRx**: Schedule a packet after each RX after a specific delay.
- **RxOverflow**: Overflow on receive by delaying in RAILCb_RxPacketReceived.
- **TxUnderflow**: Underflow by not loading data for the next TX sequence.
- **TxCancel**: Cancel a single packet transmit to force an error callback.
- **RfSense**: Sense RF energy to wake the radio.
- **PER** (Packet Error Rate) test: A GPIO is toggled, and stats are gathered on received packets.
- **BER** (Bit Error Rate) test: Statistics are gathered on received bits.

#### Overview

The following is a summary of functionality provided as part of the RAILtest application:

- Transmit and receive packets
- Schedule transmits at a specific time in the RAIL timebase
- Configure RAIL address filtering to receive only specific packets
- Enable CCA mechanisms (CSMA/LBT) to validate that a channel is clear before transmit
- Set a timer callback in the RAIL timebase to see how the RAIL timer API works
- Change the transmit channel within the current configuration's band
- Change the transmit power level
- Enable RF energy sensing of a specified duration across the 2.4 GHz and/or Sub 1-GHz bands, and sleep to wake on this event.
- Output a continuous unmodulated tone for debugging
- Output a continuous modulated PN9 stream for debugging
- Enter into direct mode where data can be sent and received using asynchronous GPIOs as input and output

##### About RAILtest Versions

RAILtest version 2.16 was released with Gecko SDK (GSDK) v4.4. Previous versions are as follows:

- GSDK v4.3: RAILtest v2.15
- GSDK v4.2: RAILtest v2.14
- GSDK v4.1: RAILtest v2.13
- GSDK v4.0: RAILtest v2.12
- GSDK v3.2: RAILtest v2.11
- GSDK v3.1: RAILtest v2.10
- GSDK v3.0: RAILtest v2.9
- GSDK v2.7: RAILtest v2.8

##### Modes

RAILtest can be in a number of different modes. Each of these modes enables a subset of the test application's functionality, so that nonsensical commands (such as trying to transmit a tone and a packet at the same time) are ignored. The following are supported modes, with a short description.

- **None**: The app is doing nothing, but the radio may be on. Parameters can be set in this mode based on the current radio state, and the timer can be used.
- **Stream**: Send a stream of pseudo-random bits.
- **Tone**: Send a tone at the carrier frequency.
- **ContinuousTx**: Send an unending stream of packets, separated by a configurable delay.
- **DirectMode**: Send data to and from a GPIO, without any packet handling.
- **PacketTx**: Send a specific number of packets, with a summary print at the end.
- **ScheduledTx**: Send one packet scheduled in the future.
- **TxAfterRx**: Schedule a packet after each RX after a specific delay.
- **RxOverflow**: Overflow on receive by delaying in `RAILCb_RxPacketReceived`.
- **TxUnderflow**: Underflow by not loading data for the next TX sequence.
- **TxCancel**: Cancel a single packet transmit to force an error callback.
- **RfSense**: Sense RF energy to wake the radio.
- **PER** (Packet Error Rate) test: A GPIO is toggled, and stats are gathered on received packets.
- **BER** (Bit Error Rate) test: Statistics are gathered on received bits.

##### Command Line Interface

The most powerful way to interact with the sample application is through the provided command line interface.

##### Command Input

The syntax for this interface is the standard command [arg0, arg1, ...] syntax, where the number and type of arguments depend on the specific command. Numeric values can be prefixed with 0x to indicate hexadecimal values.

In RAILtest 2.8 (GSDK v2.7.x), the maximum number of arguments to any command is set by the value of `MAX_COMMAND_ARGUMENTS`, and the maximum length of each command line is set by the value of `APP_COMMAND_INTERFACE_BUFFER_SIZE`.

Starting in RAILtest 2.9 (GSDK v3.0), the maximum number of arguments to any command is set by the value of `SL_CLI_MAX_INPUT_ARGUMENTS`, and the maximum length of each command line is set by the value of `SL_CLI_INPUT_BUFFER_SIZE`.

For a full listing of the command options see [Full Help Text](07-miscellaneous#full-help-text) or use the `help` command.

##### Command Responses

All responses to commands are formatted in a human readable yet parsable format. This format has two variations: single and multiline. Both follow these rules.

- Start and end with curly braces { }
- List the command name, enclosed in parentheses ( )
- Contain any number of tag/value pairs enclosed in curly braces { }
- Carriage returns and line feeds are treated as whitespace by any parser

###### Single Response

Used when a command has a single response.

- There is a single start/end curly brace wrapper
- Tag/value pairs are wrapped in a single set of curly braces, separated by a colon {tag:value}.

Example:

```sh
> getchannel
{{(getchannel)}{channel:4}}
```

###### Multi Response

Used when a command may have multiple responses, such as when reading a block of memory or receiving multiple packets.

- Response starts with a header, delimited by a hash # at the start of the line.
- Header includes the command name, followed by any tags individually wrapped with curly braces { }.
- Following the header, any number of responses can be provided.
- Data lines do not contain the command name or tags, only the values that correspond to the tags in the order described in the header.

Example:

```sh
> getmemw 0x20000000 4
#{{(getmemw)}{address}{value}}
{{0x20000000}{0x0000e530}}
{{0x20000004}{0x000051c6}}
{{0x20000008}{0x0000c939}}
{{0x2000000c}{0x0000e090}}
```

#### Peripherals

##### Buttons

When enabled, RAILtest can use up to two buttons. When pressed for a short duration (less than 1 second), the first button causes RAILtest to transmit one packet. When pressed for a long duration (greater than 1 second), the first button causes RAILtest to continuously transmit packets until the button is pushed again for a long duration. Pressing the second button causes RAILtest to increment the channel number used for TX and RX until the channel number wraps around to its beginning value.

Starting in RAILtest 2.9 (GSDK v3.0), button functionality is disabled by default. To enable button functionality, the `Simple Button Driver` software component needs to be enabled with an instance name of `btn0` for the first button and `btn1` for the second button.

##### LEDs

When enabled, RAILtest can use up to two LEDs. The first LED toggles when a packet is successfully received, and the second LED toggles when a packet is successfully transmitted.

Starting in RAILtest 2.9 (GSDK v3.0), LED functionality is disabled by default. To enable LED functionality, the `Simple LED Driver` software component needs to be enabled with an instance name of `led0` for the first LED and `led1` for the second LED.

##### LCD

When enabled, RAILtest can use the LCD to show packets received and transmitted as well as the channel selected and radio activity.

Starting in RAILtest 2.9 (GSDK v3.0), LCD functionality is disabled by default. To enable LCD functionality, the `RAILtest Application`, `Graphics` software component needs to be enabled.

#### Application Features

##### Packet Mode

The application starts in packet mode with the receiver enabled. In this mode the application receives and transmits packets using the radio's frame controller hardware. To disable receive use the `rx 0` command. To transmit use `tx [numPackets]` or press button PB0 if button support is enabled. To toggle the continuous transmit mode, hold PB0 for a couple of seconds if button support is enabled, or run the `tx 0` command. When transmitting multiple packets or infinite packets there is a configurable delay in between each transmit. By default, this is 250 ms, but it can be set with the `setTxDelay` command.

All received packets are printed to the console with information like CRC, RSSI, and timestamp as long as notifications are enabled. Notifications are enabled by default, but they can be turned off with the `setRxNotification 0` command.

The application by default sends a fixed packet, but it is possible to override the values through setTxPayload. The command allows you to modify the values of the payload at specific offsets. For instance, to modify the first 4 bytes sent in the packet to be 0x01 0x02 0x03 0x04, use:

```sh
setTxPayload 0 0x01 0x02 0x03 0x04
```

To view the currently configured TX Packet information, use `printTxPacket`.

> **Note**: The packet format depends on the current PHY configuration. If your PHY has a dynamic frame length byte then that will be used to determine how much data should be sent.

##### Direct Mode

In direct mode the radio will still attempt to decode received packets, but it will only be able to transmit packets sent over the DIN pin. The GPIOs for direct mode are fixed for now to the following pins.

```sh
DOUT - EFR32_PC11 -> EXP_HEADER16/WSTK_P13
DIN  - EFR32_PC10 -> EXP_HEADER15/WSTK_P12
```

The data on these pins is an asynchronous stream of bits at the expected data rate from the radio (DOUT) or to the radio (DIN). To enter direct mode, issue the `directMode 1` command after starting the app. To leave direct mode use `directMode 0`. If you want to transmit, you must enable the transmitter by issuing `directTx 1` and later stop it with `directTx 0`. Receive is controlled using the standard `rx 1/0` command, but is enabled by default when not transmitting.

> **Note**: Direct mode does not work in certain modulations (for example 4FSK). If you require this mode, contact support to verify your configuration.

##### Channels/Frequencies

The specific channel configuration depends on the PHY configuration you have chosen for your test app. To switch between channels, use the `setChannel [num]` command. If RX is active (`rx 1`), then any TX or RX in progress will be aborted and the new channel switched to. In addition, if button support is enabled, you can use button PB1 to cycle through channels.

To modify your frequency to a value not defined in the channel list, you will need to set the application into the `FREQUENCY_OVERRIDE` debug mode via `setDebugMode`, which tells the application to ignore the current channel selection. Once in the `FREQUENCY_OVERRIDE` debug mode, you can use the `freqOverride` command to switch to another center frequency.

> **Note**: The `freqOverride` command requires you to be in FREQUENCY_OVERRIDE debug mode. The radio state must also be IDLE for the frequency to be modified -- call rx 0 first.

```sh
setDebugMode 1
freqOverride 865000000
```

To leave `FREQUENCY_OVERRIDE` debug mode and return to normal channel-based operation, use `setDebugMode 0`.

> **Caution**: The modem is configured to a specific band. The application will not restrict you from changing the frequency out of band but this could cause significant issues, including forcing a chip reboot.

##### Command Scripting

The command scripting feature built into RAILtest allows for CLI commands to be executed without back-and-forth interaction on the command line. The same commands that can be executed one by one can be queued up within RAILtest and executed sequentially later. Additionally, a command script can be saved to flash, and any script saved to flash will run automatically on device boot.

In RAILtest 2.8 (GSDK v2.7.x) support is integrated into RAILtest to use a command script in RAM, but to use a command script in flash, the `Flash Data` plugin must be enabled.

In RAILtest 2.9 (GSDK v3.0), to use a command script in RAM, the `CLI Storage in RAM` software component needs to be enabled with an instance name of `inst0`. To use a command script in flash, the `CLI Storage in NVM3` software component needs to be enabled with an instance name of `inst0`.

This is an example of how to enter, print, and run a script from RAM. Note that the `wait` command needs to be used to allow time for the first scripted command (that is, `tx 1`) to successfully run to completion before the second scripted command (that is, `tx 2`) starts.

```sh
enterScript
tx 1
wait 500000
tx 2
endScript
printScript
runScript
```

This is an example of how to enter, print, run, and clear a script from flash.

```sh
enterScript 1
tx 1
wait 500000
tx 2
endScript
printScript 1
runScript 1
clearScript 1
```

This is an example of how to enter and run a script from flash on boot.

```sh
enterScript 1
tx 1
wait 500000
tx 2
endScript
reset
```

> **Note**: For rapid command entry (for example, automated testing), you may need to increase the USART RX buffer from its default value, specified by a define similar to `SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE` in RAILtest 2.9, to account for long command string entry being interrupted by chip interrupts. For lengthy (for example hours long) automated test programs, a notable decrease in test time will come from disabling CLI command history, setting `SL_CLI_NUM_HISTORY_BYTES` to 0 (RAILtest 2.9).

##### RAIL Timebase

The microsecond RAIL timebase is used for features requiring specific timing. You can read this timebase with `getTime`, and you can also set this microsecond timebase with `setTime`. Avoid changing the timebase when the timebase is actively being used, such as during clear channel assessment, during scheduled TX or RX, and so on.

##### Scheduled TX

The RAIL API has its own timebase that can be used to schedule the start of transmits. It measures time as a 32-bit integer in microseconds. As part of this change, many APIs will now return the time they were run, all RX packets report the time they were received, and all TX packets return the time that the transmit was completed. There is also the command getTime to print the current time in the RAIL timebase.

To test scheduled transmit we provide two commands: txAt and txAfterRx. These allow you to send a packet at an absolute time in the RAIL timebase or exactly some number of microseconds after each receive, respectively.

> **Note**: These APIs should provide reliable timing but you may have to adjust for overhead that relates to preamble and PA ramp time in order to transmit at the exact time you want.

##### Clear Channel Assessment

The RAIL API provides the ability to specify a Pre-Transmit Operation for every transmit, one of which is Scheduled Transmit discussed above. Others are also provided to support two common medium access methodologies that delay transmission until the channel is clear:

- CSMA-CA (Carrier Sense Multiple Access with Collision Avoidance) -- based on IEEE 802.15.4 specification
- LBT (Listen Before Talk) -- based on ETSI EN 300 220-1 specification

Both CSMA-CA and LBT are similar: Before transmission, a device waits for a random 'backoff' period of time and then performs a CCA (Clear Channel Assessment) for a fixed period of time. If the channel is free, the transmit proceeds; if busy, the process is repeated with a new random backoff period. The random backoff period is determined by a randomly chosen multiple of a fixed backoff unit of time.

For CSMA-CA, the random multiplier is a power-of-2 exponential whose range increases on each try up to a limit, and the CCA period is typically short -- smaller than a backoff unit and around the time it takes a small packet to be transmitted. For LBT, the random multiplier is linear and typically chosen to allow the random period to range up to the CCA period, which can be quite long -- much longer than the on-air time of the actual transmission it's gating. LBT also specifies that if the channel is found busy during CCA, the process cannot repeat until the channel is free.

In RAIL and RAILtest, several parameters are exposed through the `setLbtParams` and `getLbtParams` commands to configure either CSMA-CA or LBT operation. Their interpretation depends on which mode has been chosen:

- `minBo`: Minimum backoff. For CSMA-CA the first try's power-of-2 random exponential range, that is the backoff multiplier, will range from 0 to 2^minBo - 1. Subsequent tries increase minBo by 1 up to maxBo. For LBT this is the minimum backoff multiplier for all tries, typically 0.
- `maxBo`: Maximum backoff. For CSMA-CA this is the maximum power-of-2 random exponential range to which subsequent tries can increase. For LBT this is the maximum backoff multiplier for all tries, typically maxBo * backoff = duration. If both minBo and maxBo are 0, a non-random fixed backoff time is configured.
- `tries`: The maximum number of tries ('busy' CCAs), up to 15, that the CSMA-CA or LBT operation will tolerate before declaring the transmission a failure due to channel busy. A value of 0 will perform no CCA assessments, and always transmit immediately.
- `thresh`: The CCA RSSI threshold, in dBm, above which the channel is considered 'busy'.
- `backoff`: The backoff unit period, in RAIL's microsecond time base. This is multiplied by the random backoff multiplier controlled by minBo and maxBo to determine the overall backoff period. For random backoffs, this value must be in the range 100 to 511 microseconds; for fixed backoffs it can go up to 65535 microseconds.
- `duration`: The CCA duration, in RAIL's microsecond time base. The radio determines the maximum RSSI during this period for comparison against the CCA threshold.
- `timeout`: An overall timeout, in RAIL's microsecond time base, for the operation. If transmission does not start before this timeout expires, the transmission will fail. This is more important for limiting LBT due to LBT's unbounded requirement that if the channel is busy, the next try must wait for the channel to clear. A value of 0 indicates that no timeout is imposed.

Several examples:

- RAILtest's default parameters are suitable for the IEEE 802.15.4 PHY for CSMA-CA, equivalent to:`setLbtParams 3 5 4 -75 320 128 0`. This specifies up to 4 CCA attempts. The 1st will choose a random multiplier of 0..7 (2^3-1), the 2nd 0..15 (2^4-1), the 3rd 0..31 (2^5-1), and the 4th 0..31 since the maxBo limit is 5.
- ETSI EN 300 220-1 LBT's parameters in the 863 MHz band would be: `setLbtParams 0 10 15 -80 500 5000 1000000`. This specifies a 5 millisecond CCA duration with random backoff period of 0..5 milliseconds (0..10 * 0.5 milliseconds) and a 1 second timeout limit in case the channel remains busy.
- A single CCA of 160 microseconds after a fixed 1024 microsecond backoff, against a -70 dBm threshold would be: `setLbtParams 0 0 1 -70 1024 160 0`.

In RAILtest, CSMA-CA and LBT are enabled as a mode applied to subsequent transmits through `setLbtMode`, whose choices are 'off', 'csma', and 'lbt'.

> **Note**: On EFR32, LBT is currently implemented using the EFR32's CSMA-based hardware engine, so LBT parameters are mapped to roughly equivalent CSMA parameters.
> **Note**: Scheduled Transmit and Clear Channel Assessment are currently mutually exclusive, with Scheduled Transmit taking precedence.

##### Address Filtering

The address filtering code examines the packet as follows.

|Bytes: 0 - 255|0 - 8|0 - 255|0 - 8|Variable|
|---|---|---|---|---|
|Data0|Field0|Data1|Field1|Data2|

In the above structure, anything listed as DataN is an optional section of bytes that will not be processed for address filtering. The FieldN segments reference the specific sections in the packet that will be examined during filtering for addresses. There may be up to four addresses per field, and they may each have a size of up to 8 bytes. To set up address filtering, first configure where the addresses are in the packet and how long they are. Next, configure what combinations of matches in Field0 and Field1 should constitute an address match. Lastly, enter addresses into the tables for each field and enable them.

The `configAddressFilter` command can be used to set the offsets and sizes for the address fields as well as how combinations of matches in Field0 and Field1 are combined to determine whether or not an address matches.

Configuring which combinations of Field0 and Field1 constitute a match is the most complex portion of the address filter. The easiest way to think about this is with a truth table. If you consider each of the four possible address entries in a field, you can have a match on any one of those or a match for none of them. This is shown in the 5x5 truth table below where Field0 matches are the rows and Field1 matches are the columns.

|Fields|No Match|Address 0|Address 1|Address 2|Address 3|
|---|---|---|---|---|---|
|No Match|bit0|bit1|bit2|bit3|bit4|
|Address 0|bit5|bit6|bit7|bit8|bit9|
|Address 1|bit10|bit11|bit12|bit13|bit14|
|Address 2|bit15|bit16|bit17|bit18|bit19|
|Address 3|bit20|bit21|bit22|bit23|bit24|

Since this is only 25 bits it can be represented in one 32bit integer, where a 1 indicates filter pass and a 0 indicates filter fail. This is the matchTable parameter in the `configAddressFilter` command. For a simple one field configuration set the matchTable to `0x1fffffe` and for a two field configuration pairing indices across the fields use `0x1041040`.

After you have configured address filtering you must also set which addresses are valid and enable them. This can be done with the `setAddress` and `setAddressEnable` commands. You must also turn on the address filtering feature with the `setAddressFiltering` command.

As an example, to configure an address of `0x00` `0x01` `0x02` `0x03` in field0, index0 for a filter that has one field starting at offset 0 with a length of 4 bytes, use the following commands.

```sh
configAddressFilter 0x1fffffe 0 4 0 0
setAddress 0 0 0x00 0x01 0x02 0x03
setAddressEnable 0 0 1
setAddressFiltering 1
```

In addition to the standard address filtering, if the frame length decoding algorithm is by frame type, then additional filtering functionality is available. Address filtering can be enabled or disabled based on the frame type that is decoded. This can be set by the addressFilterByFrame command. This command takes an 8-bit bitmask, in which each bit represents whether addresses are present in that frame. The least significant bit determines whether to apply the address filter to frame 0, and the most significant bit determines whether to apply the address filter to frame 7. addressFilterByFrame must be called after configAddressFilter for it to take effect.

##### Automatic State Transitions

RAIL provides an API to configure state transitions to happen automatically on certain radio events:

- a successful receive
- a failed receive
- a successful transmission
- a failed transmission

All of these events can transition to a radio state of idle or receive. In addition, a transmission can be configured to happen after a successful receive.

These states are configured through the `setTxTransitions` and `setRxTransitions` commands. Each of these commands take in two radio states, which are passed in as single letter strings. To transition to receive after a transmission, regardless of its success, the command is `setTxTransitions r r`.

When settings the receive transitions, there is also a third argument, a bitfield to configure which events count as errors. The documentation for this bitfield can be found in the RAIL library documentation. Calling `setRxTransitions i i 0xFF` will ignore all errors that are possible to ignore, and transition the radio to idle after attempting to receive one packet.

In addition to the state transitions, timings can be set for the transitions. The six timings that are currently configurable are:

- idleToRx
- idleToTx
- rxToTx
- txToRx
- rxSearchTimeout
- txToRxSearchTimeout

Each of these timings configures an amount of delay between two states. The search timeouts allow you to set a maximum time that the chip will sit in the RX search state. These can be used to implement short receive timeouts. The rxSearchTimeout is used when transitioning to receive from idle and the txToRxSearchTimeout is used when transitioning to receive from a past transmit. Setting [rx|txToRx]SearchTimeout to zero disables the timeout and radio will stay in RX until an event changes the state. Transitions to idle simply happen as fast as possible. Each timing is configurable in microseconds, up to a maximum of 13 ms, with the exception of txToRxSearchTimeout which could be up to a quarter of the RAIL timebase, which is 2^32/4 microseconds or 18 minutes. For example, to disable the timeouts and set all other transitions to take 200 µs, use:

```sh
setStateTimings 200 200 200 200 0 0
```

##### Auto-Acknowledgment

RAIL contains auto-acknowledgment (ACK) APIs that are exposed through the RAILtest command interface. To initialize and enable this functionality use `autoAckConfig`. For example, `autoAckConfig` `rx` `100` `192` `1000` will configure the 'defaultState', the state at which the radio returns after an ACK operation, to receive. Transitions from idle will take 100 µs. Turnaround transitions will take 192 µs and will wait for an ACK for 1000 µs. To load a custom ACK payload, call `setAckPayload` and `setAckLength`.

If a packet is received during the ACK window, then the `isAck` flag for that packet will be true. The ACK window begins at the end of the turnaround time and lasts for the timeout length. If auto acknowledgment is not enabled, then the `isAck` flag will always be false.

To customize ACK functionality, users can use the `autoAckPause` command to either skip the wait for an ACK on the transmit side or skip the transmit of an ACK on the receive side. To modify if/how the ACK is transmitted after a receive operation, use the `setTxAckOptions` command.

Conversely, after a transmit operation, waiting for ACK is controlled by the TX options configured by 1.

While auto-ACK is enabled, you should not call `setTxTransitions` and `setRxTransitions`.

You can disable auto-ACK by calling autoAckDisable. It will also reset the Rx and Tx transitions to idle.

##### RF Energy Sensing

The EFR32 has the ability to sense the presence of RF Energy above -20 dBm within either or both the 2.4 GHz and Sub 1-GHz bands and trigger an event if that energy is continuously present for certain durations of time.

This feature is exposed through library `RAIL_RfSense`() and `RAIL_RfSensed`() APIs, whose use is exemplified by the RAILtest commands `rfSense` and `sleep`. Both commands allow you to specify the duration in microseconds of continuous RF energy, and which RF band(s) to monitor. The requested duration will be mapped to the nearest duration supported by the hardware; it is not terribly precise and can be off by a factor of 2 or more. Once RF energy of sufficient duration has been sensed, the sensing operation terminates and a new one must be started if additional sensing is desired.

The `rfSense` command activates sensing in the background during normal RAILtest operation, and will report when energy of sufficient duration has been detected through an asynchronous `rfSensedCheck` message. Note that sensing energy within a band on EFR32 precludes normal packet reception in that same band; this is by design.

The `sleep` command allows you to activate RF sensing in combination with entering one of the Energy-Saving Modes EM0..EM4. To wake from these modes, RF energy of the specified duration and band must be sensed. Energy modes 0 through 3 will also wake and terminate RF sensing on any serial input to the CLI. EM4 does not support waking on serial input. It will only wake on RF sense or a pin reset.

Some examples:

**RFSENSE Legacy Mode**:

```sh
> rfSense 500 2 // Sense RF energy of ~0.5ms or longer in sub-GHz band
{{(rfsense)}{RfSense:MHz}{RfUs:413}}  // Closest HW supports is ~0.4ms
...
{{(rfSensedCheck)}{RfSensed:MHz}{RfUs:413}}

> sleep 2 500 1 // Sleep in EM2 for RF energy of ~0.5ms in 2.4 GHz band
{{(sleep)}{EM:2}{SerialWakeup:On}{RfSense:GHz}}
...
{{(sleepWoke)}{EM:2}{SerialWakeup:No}{RfSensed:Yes}{RfUs:413}}

> sleep 4 500 3 // Sleep in EM4 for RF energy of ~0.5ms in any band
{{(sleep)}{EM:4s}{SerialWakeup:Off}{RfSense:Any}}
...
{{(reset)}{App:RAILtest}{Built:Jul 19 2019 13:36:24}}
{{(sleepWoke)}{EM:4s}{SerialWakeup:No}{RfSensed:Yes}}
```

RFSENSE Selective Mode (Transmit Node Setup):

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:27993006}}

> configRfSenseWakeupPhy
{{(configRfSenseWakeupPhy)}{RFSense Wakeup PHY:Enabled}}

> fifoModeTestOptions 1 0 // Manually load Tx FIFO to transmit only preamble and syncword
{{(fifoModeTestOptions)}{TxFifoManual:Enabled}{RxFifoManual:Disabled}}

> setRfSenseTxPayload 0x2 0xB16F // <Syncword Size(Bytes)> <Syncword>
{{(setRfSenseTxPayload)}{RFSense Payload:Set}}

> tx 1
{{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:54463886}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:57481907}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:57481861}{timePos:6}{lastTxStart:57398486}{ccaSuccess:0}{failed:0}{lastTxStatus:0x000000000}{isAck:False}}
```

**RFSENSE Selective Mode (Receive Node Setup for EFR32xG22)**:

```sh
> sleep 2 2 0xB16F 1 // <EM Mode> <Syncword Size(Bytes)> <Syncword> <RFBand>
{{(sleep)}{RfSense:Enabled}{None:Disabled}{Time:14176659}}
...
{{(sleepWoke)}{EM:2}{SerialWakeup:No}{RfSensed:Yes}{RfUs:0}}

> rfsense 2 0xB16F 1 // <Syncword Size(Bytes)> <Syncword> <RFBand>
{{(rfsense)}{RfSense:Enabled}{None:Disabled}{Time:44817696}}

> {{(rfSensedCheck)}{RfSensed:GHz}{RfUs:0}}
```

##### Multi-Timer

If the multi-timer is never enabled (or subsequently disabled with `enableMultiTimer`), then the RAIL timer is a single-instance, hardware timer. If the multi-timer is enabled, the RAIL timer becomes one instance of the software-based multi-timer. The multi-timer can only be enabled or disabled when no timers are running.

#### Protocol-Specific Features

##### IEEE 802.15.4

RAIL provides IEEE 802.15.4-specific hardware acceleration that can be configured through RAILtest commands. To configure the IEEE 802.15.4 2.4 GHz Radio Configuration, use `config2p4GHz802154`. This will configure the IEEE 802.15.4 2.4 GHz modem settings as well as channel scheme, making channels 11-26 available for use. To configure IEEE 802.15.4 hardware acceleration, use the `enable802154` command. The options exposed in `enable802154` allow you to configure similar parameters as `autoAckConfig`.

Indeed, Auto-ACK is enabled when calling `enable802154`. Thus, do not call `setRxTransitions` or `setTxTransitions` after an `enable802154` while Auto-ACK is enabled.The IEEE 802.15.4 ACK payload is already loaded into the ACK buffer; do not call `setAckPayload` or `setAckLength`. However, you will want to enable the Wait-For-ACK transmit option through `configTxOptions` so the hardware looks for the specific ACK corresponding to the transmitted packet. RAILtest is configured to always set frame pending bit in the ACK if it successfully receives a data command to the node. Any ACK modifications should use commands detailed in section [Auto Acknowledgment](04-application-features#auto-acknowledgment).

To configure the IEEE 802.15.4 SubGHZ SUN FSK GB868 mode (802.15.4e and 802.15.4g), use 'config863MHz802154' or 'config915MHz802154'. The different options can be configured using `set802154e` and `set802154g` commands. These commands map very closely to the RAIL API that it wraps, so refer to the RAIL Library doxygen for further information.

Further IEEE 802.15.4 configuration is done through `acceptFrames`, `setPromiscuousMode`, and `setPanCoordinator`. To configure the node's address, use the `setPanId802154`, `setShortAddr802154`, or `setLongAddr802154` commands. These commands map very closely to the RAIL API that it wraps, so refer to the RAIL Library doxygen for further information.

From this point, use the normal `tx` and `rx` commands to send packets back and forth.

Transmit side:

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1846852}}
> config2p4GHz802154
{{(config2p4GHz802154)}{802.15.4:Enabled}}
> enable802154 rx 100 192 1000
{{(enable802154)}{802.15.4:Enabled}{rxDefaultState:Rx}{txDefaultState:Rx}{idleTiming:100}{turnaroundTime:192}{ackTimeout:1000}}
// Turn on transmit wait-for-ACK option
> configTxOptions 1
{{(configTxOptions)}{waitForAck:True}{removeCrc:False}{syncWordId:0}{txAntenna:Any}{altPreambleLen:False}{ccaPeakRssi:False}}

// Load packet directed towards the receive side
// Packet has the destination address set on the receive side.
> setTxLength 26
{{(setTxLength)}{TxLength:26}}
> setTxPayload 0 0x1b 0x61 0x98 0x00 0x34 0x12 0x44 0x33 0x55 0x44
{{(setTxPayload)}{len:26}{payload: 0x1b 0x61 0x98 0x00 0x34 0x12 0x44 0x33 0x55 0x44 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}}
> setTxPayload 10 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
{{(setTxPayload)}{len:26}{payload: 0x1b 0x61 0x98 0x00 0x34 0x12 0x44 0x33 0x55 0x44 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x00 0x00 0x00}}
> setTxPayload 20 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
{{(setTxPayload)}{len:26}{payload: 0x1b 0x61 0x98 0x00 0x34 0x12 0x44 0x33 0x55 0x44 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f}}

// Assumes there is another node that will receive and ACK
> tx 1
> {{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:157683158}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:157689582}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:157689516}{failed:0}{lastTxStatus:0x0}{isAck:False}}
{{(rxPacket)}{len:4}{timeUs:157689914}{crc:Pass}{rssi:-20}{lqi:96}{phy:0}{isAck:True}{syncWordId:0}{antenna:0}{channelHopIdx:254}{payload: 0x05 0x02 0x00 0x00}}

// Assumes a node does not ACK
> tx 1
> {{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:165139148}}
{{(rxAckTimeout)}{ackTimeoutDuration:1021}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:165187375}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:165145515}{failed:0}{lastTxStatus:0x0}{isAck:False}}
```

Receive side:

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1846852}}
> config2p4GHz802154
{{(config2p4GHz802154)}{802.15.4:Enabled}}
> enable802154 rx 100 192 1000
{{(enable802154)}{802.15.4:Enabled}{rxDefaultState:Rx}{txDefaultState:Rx}{idleTiming:100}{turnaroundTime:192}{ackTimeout:1000}}
> setPanId802154 0x1234 // PANID: 0x1234, OTA Value: 0x34 0x12
{{(setPanId802154)}{802.15.4PanId:Success}}
> setShortAddr802154 0x3344 // Short Addr: 0x3344, OTA Value: 0x44 0x33
{{(setShortAddr802154)}{802.15.4ShortAddress:Success}}
// Long Addr (OTA): 0xDD 0xCC 0xBB 0xAA 0x99 0x88 0x77 0x66
> setLongAddr802154 0xDD 0xCC 0xBB 0xAA 0x99 0x88 0x77 0x66
{{(setLongAddr802154)}{802.15.4LongAddress:Success}}
> rx 1
{{(rx)}{Rx:Enabled}{Idle:Disabled}{Time:2070858}}

// Receive a packet and ACK it
{{(rxPacket)}{len:26}{timeUs:29662246}{crc:Pass}{rssi:-15}{lqi:82}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:254}{payload: 0x1b 0x61 0x98 0x00 0x34 0x12 0x44 0x33 0x55 0x44 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f}}
```

In 802.15.4, the first byte(s) written in the Tx buffer correspond to the PHR (physical header) and must follow a precise mapping, including at least the frame length. Formatting the PHR can be laborious and is error prone. Silicon Labs recommends using 'set802154PHR'.

For instance, in SUN FSK, to set this PHR:

| bit0                                                                                                   bit15|

| mode switch | reserved | FCS type | data whitening |     frame length     |

|       0             |   00         |    0           |        1               |20=000 0001 0100|

you can use:

```sh
> setTxLength 18  //must be >= frameLength+PHRsize-FCSsize
{{(setTxLength)}{TxLength:18}{TxLength Written:18}}
> setTxPayload 0 0x10 0x28
{{(setTxPayload)}{len:18}{payload: 0x10 0x28 0x11 0x22 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11}}
```

Or

```sh
> setTxLength 18  //must be >= frameLength+PHRsize-FCSsize
{{(setTxLength)}{TxLength:18}{TxLength Written:18}}
> set802154PHR 1 0 1
{{(set802154PHR)}{PhrSize:2}{PHR:0x2810}}
{{(set802154PHR)}{len:18}{payload: 0x10 0x28 0x11 0x22 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11}}
```

Note that 'set802154PHR':

- Only formats (and writes in the Tx buffer) the PHR. It does not check that the requested PHR format is coherent with the loaded PHY.
- Uses the TxLength value (set with 'setTxLength') to process the PHR frame length field.
- If the FCS size is known, then it set it to TxLength-PHRsize+FCSsize.
- If the FCS size is not known, then it set it to TxLength-PHRsize    (SUN OFDM and SUN OQPSK cases).

Note that the PHR value is interpreted by the HW both in Tx and Rx to dynamically adapt the processing.

Typical SUN OFDM usage:

```sh
> setTxLength 64
{{(setTxLength)}{TxLength:64}{TxLength Written:64}}
> Set802154phr 2 6 0
{{(set802154phr)}{PhrSize:4}{PHR:0x780c00}}
{{(set802154phr)}{len:64}{payload: 0x00 0x0c 0x78 0x00 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e 0x3f}}
> tx 10
{{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:3116912126}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:3117028916}}
{{(txEnd)}{txStatus:Complete}{transmitted:10}{lastTxTime:3117028845}{timePos:6}{lastTxStart:3117026790} {ccaSucess:0}{failed:0}{lastTxStatus:0x000000000}{isAck:False}}
```

To use 802.15.4 filtering with SUN OFDM PHYs
on Rx side

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:3470713331}}
> Enable802154 rx 200 1000 2000
{{(Enable802154)}{802.15.4:Enabled}{rxDefaultState:Rx}{txDefaultState:Rx}{idleTiming:200}{turnarounTime:1000} {ackTimeout:2000}{defaultFramePending:False}}
> set802154e 3
{{(set802154e)}{15.4E_GB868:True}{15.4E_EnhAck:True}{15.4E_ImplicitBroadcast:False}}
> setPanId802154 0xCDAB
{{(setPanId802154)}{802.15.4PanId:Success}}
> setLongAddr802154 0x12 0x34 0x56 0x78 0x12 0x34 0x56 0x78
{{(setLongAddr802154)}{802.15.4LongAddress:Success}}
```

on Tx side

```sh
> SetTxPayload 4 0x01 0x2D 0xAB 0xCD 0x12 0x34 0x56 0x78 0x12 0x34 0x56 0x78
{{(SetTxPayload)}{len:64}{payload: 0x00 0x0c 0x78 0x00 0x01 0x2d 0xab 0xcd 0x12 0x34 0x56 0x78 0x12 0x34 0x56 0x78 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 0x28 0x29 0x2a 0x2b 0x2c 0x2d 0x2e 0x2f 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39 0x3a 0x3b 0x3c 0x3d 0x3e 0x3f}}
```

To use continuous Tx (setTxStream) with SUN OFDM PHYs:

- All modes listed in [RAIL_StreamMode_t](https://docs.silabs.com/rail/2.12/group-diagnostic#gaac031a73387a3b22ae8ea79279d20266)  from 0 to 5 are supported except the 1010 stream option.
- the PHR is interpreted to get the rate, scrambler and frameLength parameters. Thus take care to always format it correctly and load it in the TxFIFO.
- to get a packet of infinit length, PHR frameLength must be set to 0. For that txLength must be set to 4  
  > setTxLength 4  
  {{(setTxLength)}{TxLength:4}{TxLength Written:4}}  
  > set802154Phr 2 4 0  
  {{(set802154Phr)}{PhrSize:4}{PHR:0x400}}  
  {{(set802154Phr)}{len:4}{payload: 0x00 0x04 0x00 0x00}}  
  > setTxStream 1  
  {{(setTxStream)}{Stream:Enabled}{None:Disabled}{StreamMode:PN9}{Time:2504841818}}
- If PHR frameLength is set to a value different from 0, it generates an infinite number of packets of size 'frameLength' with an IFS of 1ms.
- for a stream with data filled with a ramp started at a different offset for successive packets:  
  > setTxstream 1 4
- To send a tone at the carrier frequency:  
  > setTxTone 1  
  it is equivalent to  
  > setTxstream 1 0
- For an OFDM PHY the tone can also be generated roughly at channel_bandwidth/6  
  > setTxstream 1 5

###### WiSUN Specific

WiSUN is based on IEEE802.15.4 SUN PHYs but with a specific mode switch protocol.

Two commands support the WiSUN mode switch: `trigModeSwitchTx` and `modeSwitchLife`.

`modeSwitchLife` is optional and intended only for test automation or certification use.

You can also activate two specific Rx events MODE_SWITCH_START and MODE_SWITCH_END.  >**Note**: that they need to be enabled if `modeSwitchLife` is set to 1.

For Rx events MODE_SWITCH_START and MODE_SWITCH_END activation:

> setEventConfig 0x0 0x0 0x6000 0x6000

{{(setEventConfig)}{Mask:0x600000000000}{Values:0x600000000000}}

###### Concurrent Listening Specific

802.15.4 concurrent listening allows one radio switching quickly enough between RF channels to detect 802.15.4 preamble on either RF channel. This allows the application to use two 15.4 channels concurrently. Once preamble is detected, the radio stays on channel to receive the packet. It will also provide an ACK, if configured, and schedule any subsequent TX responses before resuming concurrent listening.

To configure concurrent listening the following RAILtest commands must be issued:

```sh
// Setup 802.15.4 on the RX side.
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1010696}}
> config2p4Ghz802154 1 0
{{(config2p4Ghz802154)}{802.15.4:Enabled}}

// Note: Channel must be set to one of the concurrent listening channels before enabling receive.
> setChannel 20
{{(setChannel)}{channel:20}}

> enable802154 rx 110 192 672 0
{{(enable802154)}{802.15.4:Enabled}{rxDefaultState:Rx}{txDefaultState:Rx}{idleTiming:110}{turnaroundTime:192}{ackTimeout:672}{defaultFramePending:False}}
> setPanId802154 4660 0
{{(setPanId802154)}{802.15.4PanId:Success}}
> setShortAddr802154 13124 0
{{(setShortAddr802154)}{802.15.4ShortAddress:Success}}
> setLongAddr802154 221 204 187 170 153 136 119 102 0
{{(setLongAddr802154)}{802.15.4LongAddress:Success}}

// Configure 802.15.4 concurrent listening on channels 15 and 20.
> configRxChannelSwitching802154 15 20
{{(configRxChannelSwitching802154)}{Success:True}}

// Configure receive options to enable concurrent listening.
> setRxOptions 1024
{{(setRxOptions)}{storeCrc:False}{ignoreCrcErrors:False}{enableDualSync:False}{trackAborted:False}{removeAppendedInfo:False}{rxAntenna:Any}{frameDet:On}{skipDCCal:False}{skipSynthCal:False}{rxChannelSwitching:True}{fastRx2Rx:False}}

// Enable the radio receive mode
> rx 1
```

Once configured, should the need arise to update the one or both concurrent listening channels:

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1010696}}
// Configure 802.15.4 concurrent listening on channels 11 and 17.
> configRxChannelSwitching802154 11 17
{{(configRxChannelSwitching802154)}{Success:True}}
> setChannel 17
{{(setChannel)}{channel:17}}
// Enable the radio receive mode
> rx 1
```

Concurrent listening can be disabled either by switching to a non-concurrent listening channel e.g.

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1010696}}
> setChannel 18
{{(setChannel)}{channel:18}}
// Enable the radio receive mode
> rx 1
```

Or, by disabling the rxChannelSwitching RX option, i.e., RAIL_RX_OPTION_CHANNEL_SWITCHING

```sh
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1010696}}
> setRxOptions 0
{{(setRxOptions)}{storeCrc:False}{ignoreCrcErrors:False}{enableDualSync:False}{trackAborted:False}{removeAppendedInfo:False}{rxAntenna:Any}{frameDet:On}{skipDCCal:False}{skipSynthCal:False}{rxChannelSwitching:False}{fastRx2Rx:False}}
// Enable the radio receive mode
> rx 1
```

> **Note**: Loading the PHY via e.g., `config2p4Ghz802154`, after configuring concurrent listening, will de-initialize concurrent listening and `configRxChannelSwitching802154` must be issued again to re-configure the feature.

##### Bluetooth Low Energy

RAIL provides Bluetooth Low Energy (BLE)-specific hardware acceleration. RAILtest provides a few wrappers over these APIs but since BLE is so timing-critical, not much can be done through RAILtest commands. To enable BLE hardware acceleration, use the setBleMode 1 command. You can then configure channel-specific settings with setBleChannelParams. A preset configuration to enable advertising on channel 37 is available using the setBleAdvertising command.

RAILtest can output a BLE advertising packet on channel 37 with the following commands:

```sh
> rx 0
rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:1999306}}
> setBleMode 1
setBleMode 1
{{(setBleMode)}{BLE:Enabled}}
> setBleAdvertising
setBleAdvertising 37
{{(setBleAdvertising)}{AdvertisingChannel:37}}
{{(setBleAdvertising)}{len:28}{payload: 0x02 0x1a 0xff 0xee 0xdd 0xcc 0xbb 0xaa 0x02 0x01 0x06 0x10 0x08 0x53 0x69 0x6c 0x61 0x62 0x73 0x20 0x52 0x41 0x49 0x4c 0x54 0x45 0x53 0x54}}
> tx 0
tx 0
> {{(tx)}{ContinuousTx:Enabled}{None:Disabled}{Time:16160500}}
```

After these commands, use your phone to search for available Bluetooth devices. You should see 'Silabs RAILTEST' as an available device. RAILtest is **not** a connectable device.

##### Z-Wave

RAIL provides Z-Wave-specific hardware acceleration that can be configured through RAILtest commands. Users can use the `setZWaveMode` command to enter Z-Wave mode and then `setZWaveRegion` to specify one of the region-specific PHYs, which generally consist of three separate channels. More about these PHYs can be found in [ITU-T G.9959](https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-G.9959-201202-S!!PDF-E&type=items) . To send packets between nodes, the following commands must be entered on both nodes, using the same region.

RX Node:

```sh
// Turn the radio off first in order to configure it
> rx 0
{{(rx)}{Rx:Disabled}{Idle:Enabled}{Time:99647646}}
// Enable Z-Wave Mode (1) – beam detection enabled (0x2), promiscuous mode off (0x1)
> setzwavemode 1 2
{{(setZWaveMode)}{ZWAVE:Enabled}{Promiscuous:Disabled}{BeamDetect:Enabled}}
// Specify the EU Region
> setzwaveregion 0
{{(setZWaveRegion)}{ZWaveRegion:EU-European Union}{ZWaveRegionIndex:0}}
```

On the transmit side, the user must specify the correct Home ID of the target Z-Wave node. This can be skipped, however, by enabling promiscuous mode on the receiver via `setZWaveMode` and/or `setZWaveOptions`. Additionally, the user must specify an accurate length byte, otherwise the transmitter may encounter an underflow. The CRC will be calculated on the fly by the radio hardware, so there is no need to specify it explicitly.

TX Node:

```sh
// Specify the Home ID in the packet. This is a 4-byte value, starting at byte 0
> setTxPayload 0 0xCA 0xFE 0xC0 0xDE
{{(setTxPayload)}{len:16}{payload: 0xca 0xfe 0xc0 0xde 0x33 0x44 0x55 0x66 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee}}
// Specify the length byte (byte 7) for a packet
> setTxPayload 7 15
{{(setTxPayload)}{len:16}{payload: 0xca 0xfe 0xc0 0xde 0x33 0x44 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc 0xdd 0xee}}
```

On the receiver side, for basic functionality, the node must configure its own Home ID.  >**Note**: that this will set parameters for the node on which these commands are executed – they do not set the TX packet contents for outgoing packets. To skip Home ID configuration, promiscuous mode can also be enabled.

RX Node:

```sh
// The Home ID is CAFEC0DE, using a “don’t care” hash
setzwavehomeid 0xCAFEC0DE 0x55
{{(setZWaveHomeId)}{Status:Set}}
```

For more advanced receiver functionality, or to be used as a sniffer, channel hopping must be configured. As used in Z-Wave networks, the three channels in each of the Z-Wave regions can be used in rapid succession for different purposes. For a receiving node to be able to receive these packets on any arbitrary channel, the node uses hardware acceleration to hop through the three different channels at specific intervals, using preamble sense mode. The following specification configures the correct hopping scheme, with the on-channel time and preamble sense mode, as well as zero delay between channels. Note, that while this configuration is accurate for most regions, Japan and Korea regions use 270 µs for all the channels, instead of the 270, 450, and 560 specified below. After this, packets can be transmitted on channel 0, 1, or 2, and will be received on the receiver node, without having explicitly set the channel.

RX Node:

```sh
// Configure the channel hopping algorithm
> configRxChannelHopping 0 2 270 0 1 2 450 0 2 2 560 0
{{(configRxChannelHopping)}{numberOfChannels:3}{buffer:0x200048b0}{Success:True}}
// Enable channel hopping
> enableRxChannelHopping 1
{{(enableRxChannelHopping)}{Success:True}}
```

TX Node:

```sh
setChannel 0
{{(setchannel)}{channel:0}}
> tx 1
> {{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:1518591782}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:1518601722}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:1518601679}{timePos:6}{lastTxStart:1518597116}{ccaSuccess:0}{failed:0}{lastTxStatus:0x000000000}{isAck:False}}
setChannel 1
{{(setchannel)}{channel:1}}
> tx 1
> {{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:1522247672}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:1522258337}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:1522258277}{timePos:6}{lastTxStart:1522252961}{ccaSuccess:0}{failed:0}{lastTxStatus:0x000000000}{isAck:False}}
setChannel 2
{{(setchannel)}{channel:2}}
> tx 1
> {{(tx)}{PacketTx:Enabled}{None:Disabled}{Time:1526903409}}
{{(appMode)}{None:Enabled}{PacketTx:Disabled}{Time:1526930874}}
{{(txEnd)}{txStatus:Complete}{transmitted:1}{lastTxTime:1526930821}{timePos:6}{lastTxStart:1526908743}{ccaSuccess:0}{failed:0}{lastTxStatus:0x000000000}{isAck:False}}
```

RX Node:

```sh
{{(rxPacket)}{len:13}{timeUs:1508290532}{timePos:4}{crc:Pass}{rssi:-10}{lqi:114}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:0}{payload: 0xca 0xfe 0xc0 0xde 0x33 0x0a 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb}}
{{(rxPacket)}{len:14}{timeUs:1511945271}{timePos:4}{crc:Pass}{rssi:-8}{lqi:100}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:1}{payload: 0xca 0xfe 0xc0 0xde 0x33 0x0a 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc}}
{{(rxPacket)}{len:14}{timeUs:1516608125}{timePos:4}{crc:Pass}{rssi:-10}{lqi:102}{phy:0}{isAck:False}{syncWordId:0}{antenna:0}{channelHopIdx:2}{payload: 0xca 0xfe 0xc0 0xde 0x33 0x0a 0x55 0x0f 0x77 0x88 0x99 0xaa 0xbb 0xcc}}
```

##### Cancel Specific Protocol Mode

To cancel any of the specific BLE, 802.15.4 or Z-Wave mode, you can simply call `deinitProtocol`.

#### Testing Modes

##### Packet Error Rate Testing

RAILtest can be used to determine the packet error rate (PER) for a given setup. To set up this test, a piece of test equipment needs to be configured to send a packet on the rising edge of a GPIO. The specific EFR32 pin and port to be used are identified by the defines `PER_PIN` and `PER_PORT` (RAILtest 2.8) or defines `SL_RAIL_TEST_PER_PIN` and `SL_RAIL_TEST_PER_PORT` (RAILtest 2.9). `perRx 100 10000` configures the Packet Error Rate test to send 100 packets, waiting 10000 µs between each packet. At the end of the test, the app provides an output indicating that Per mode has finished, and the statistics on the test can be recovered with `perStatus` and `status`. Calling `perRx 0 0` cancels an ongoing test, and calling `perRx` has the same effect as calling `resetCounters`.

##### Bit Error Rate Testing

The EFR32 hardware can enter bit error rate (BER) receive mode for diagnostic purposes. In BER mode, the chip expects to receive a PN9 (x^9 + x^5 + 1) transmission. To run the BER test successfully, a radio configuration specific to BER mode must be generated by the radio configurator.

Use the `setBerConfig` command to specify how many bytes to receive in BER receive mode. The maximum number of bytes is 536870911. Specifying 0 or a number greater than the maximum possible value automatically configures the BER test to receive the maximum number of bytes for testing.

Use the `berRx` command to enter or exit BER receive mode. If the test is allowed to run to completion, there is no need to exit BER receive mode.

Use the `berStatus` command to query for test statistics during or after a test. The statistics are reset when `setBerConfig` is run or when `berRx` 1 is run. The statistics include:

- BitsToTest (total bits to be tested)
- BitsTested (the number of bits already received and tested)
- PercentDone (percentage of how many configured bytes have been received)
- RSSI (an instantaneous RSSI value corresponding to the last byte received)
- BitErrors (the number of received bits determined to be in error)
- PercentBitError (percentage of bit errors to bits tested)

Some examples:

```sh
> setberconfig 100000

> berrx 1

> berstatus
{{(berStatus)}{BitsToTest:800000}{BitsTested:0}{PercentDone:0.00}
{RSSI:0}{BitErrors:0}{PercentBitError:0.00}}

// PN9 transmission enabled here

> berstatus
{{(berStatus)}{BitsToTest:800000}{BitsTested:121312}{PercentDone:15.16}
{RSSI:-23}{BitErrors:0}{PercentBitError:0.00}}

> berstatus
{{(berStatus)}{BitsToTest:800000}{BitsTested:800000}{PercentDone:100.00}
{RSSI:-24}{BitErrors:0}{PercentBitError:0.00}}

> berrx 1

> berstatus
{{(berStatus)}{BitsToTest:800000}{BitsTested:363936}{PercentDone:45.49}
{RSSI:-23}{BitErrors:0}{PercentBitError:0.00}}

> setberconfig 1000000

> berrx 1

> berstatus
{{(berStatus)}{BitsToTest:8000000}{BitsTested:888672}{PercentDone:11.11}
{RSSI:-23}{BitErrors:0}{PercentBitError:0.00}}

// PN9 transmission disabled here

> berstatus
{{(berStatus)}{BitsToTest:8000000}{BitsTested:4418528}{PercentDone:55.23}
{RSSI:-96}{BitErrors:960478}{PercentBitError:21.74}}

> berstatus
{{(berStatus)}{BitsToTest:8000000}{BitsTested:8000000}{PercentDone:100.00}
{RSSI:-97}{BitErrors:2752908}{PercentBitError:34.41}}
```

#### Miscellaneous

##### RAM Modem Reconfiguration

RAILtest can dynamically change the modem configuration allowing for a quick evaluation of different protocols or settings without the need to compile or flash the chip. This is enabled through the `writeRmrStructure`, `updateConfigurationPointer` and `reconfigureModem` commands. These commands are intended to be used only by Simplicity Studio and not directly from the CLI.

##### Register/Memory Access

> **Note**: These commands provide direct access to the chip's address space. Writing a value to an address can change RAM and register values, and even reading from an address can change the operation of the chip. Any action taken with these commands will potentially conflict with the running program, possibly leading to unexpected behavior or a system crash. Only use these commands when instructed to do so by your Silicon Labs support contact.

To modify any memory on the system, use the `getmemw` and `setmemw` commands. To use `getmemw`, specify the starting address and the number of 32bit words you want to read. Using `setmemw` is slightly different in that you specify the starting address and the 32bit words to write starting at the specified address. These commands operate on 32bit words so all addresses **must** be 32bit aligned.

##### Debug

- To output a tone on the current channel (or overridden frequency) use the `setTxTone` command.
- To output a PN9 or 101010 stream on the current channel on a certain antenna, TX_ANTENNA0 or TX_ANTENNA1, use the `setTxStream` command.

##### Full Help Text

###### RAILtest 2.14 (GSDK 4.2) Help Text

> **Note**: Each command is displayed (on the left) with its corresponding arguments and associated datatypes (on the right). Required command arguments and their datatypes are listed first (such as `uint32`) with potential optional arguments and their datatypes listed afterwards (such as `uint32opt`). The list of required command argument datatypes includes `uint8`, `uint16`, `uint32`, `int8`, `int16`, `int32`, and `string`. The list of optional command argument datatypes includes `uint8opt`, `uint16opt`, `uint32opt`, `int8opt`, `int16opt`, `int32opt`, and `stringopt`.

```sh
> help config2p4Ghz802154
_________________________________
____Application_Configuration____
setEventConfig      Control RAIL events.
                    [uint32] eventsMask<31:0>
                    [uint32] eventsValues<31:0>
                    [uint32opt] eventsMask<63:32>
                    [uint32opt] eventsValues<63:32>
resetCounters       Resets the TX and RX counters.
setPeripheralEnable Control LEDs and LCD peripherals.
                    [uint8] [0=Disable] 1=Enable
setNotifications    Control asynchronous status prints (rxPacket,txEnd,txError).
                    [uint8] 0=Disable [1=Enable]
getLogLevels        Show whether notifications or peripherals are enabled.
getVersion          Get version information.
getVersionVerbose   Get verbose version information.
setPtiProtocol      Set PTI protocol for Network Analyzer.
                    [uint8] 0=Custom 2=Thread 3=BLE 4=Connect 5=Zigbee 6=Z-Wave
getPti              Get PTI configuration.
setPrintingEnable   Control all printing in RAILtest, except CLI.
                    [uint8] 0=Disable [1=Enable]
____________________________
____Receive_and_Transmit____
rx                  Control receive mode.
                    [uint8] 0=Disable [1=Enable]
rxAt                Configure scheduled receive.
                    [uint32] startTimeUs
                    [string] 'rel'=Relative 'abs'=Absolute
                    [uint32] endTimeUs
                    [string] 'rel'=Relative 'abs'=Absolute
                    [uint8opt] rxTransEndSched: [0]/1
                    [uint8opt] hardEnd: [0]/1
setRxOptions        Show/Configure receive options (RAIL_RX_OPTIONs).
                    [uint32opt] rxOptionsValues: bitmask of enabled options
tx                  Transmit packets with current TX options.
                    [uint32] number of packets, 0=continuous until next 'tx 0'
txWithOptions       Same tx command. This command is deprecated.
                    [uint32] number of packets, 0=continuous until next 'tx 0'
txAfterRx           Schedule a TX with specified delay after each RX.
                    [uint32] delayUs: 0=Disable
configTxOptions     Show/Configure transmit options (RAIL_TX_OPTIONs).
                    [uint32opt] txOptionsValues: bitmask of enabled options
setFixedLength      Configure fixed length packet operation.
                    [uint16] fixedLength: payload bytes
setPower            Set the transmit power. The radio must be IDLE.
                    [int32] power: deci-dBm unless 'raw' is added
                    [stringopt] 'raw'=units are raw power level
getPower            Get the transmit power in deci-dBm.
setPowerConfig      Set transmit PA configuration. Must use setpower afterwards.
                    [uint8] paMode
                    [uint16] millivolts
                    [uint16] rampTimeUs
getPowerConfig      Get the transmit PA configuration.
getPowerLimits      Get min and max powerLevel for a power mode.
                    [uint8opt] powerMode
enablePaAutoMode    Control automatic PA selection based on the TX power level.
                    [uint8] 0=Disable 1=Enable
configPaAutoMode    Configure entries in the default PA Auto Mode plugin.
                    [uint8] start Index
                    [int32opt] min max mode band: PA auto config entries
sweepTxPower        Sweep TX power for the current PA by toning at each level.
offsetLqi           Adjust the hardware's LQI value for received packets.
                    [int32] offset: signed value to ad
                    The resulting LQI is capped within 0..255 range.
getRssi             Get RSSI in dBm. It'll be invalid if receiver isn't ready.
                    [uint32opt] [0=don't wait] 1=wait for valid RSSI if possible
sweepPower          Sweep power by toning low/high in a square wave fashion.
                    [int32] lowPower: deci-dBm
                    [int32] hiPower: deci-dBm
                    [uint32] periodUs
startAvgRssi        Start AGC RSSI averaging.
                    [uint32] averageTimeUs
                    [uint16opt] channel: if different than current channel
getAvgRssi          Get AGC RSSI averaging result.
setTxTone           Control tone transmission.
                    [uint32] 0=Disable 1=Enable
                    [uint32opt] antenna: [0]/1
                    [uint32opt] mode: [0]/1=phaseNoise
setTxStream         Control stream transmission.
                    [uint32] 0=Disable 1=Enable
                    [uint32opt] streamMode: [1=PN9] 2=1010 3=phaseNoise 0=tone
                    [uint32opt] antenna: [0]/1
status              Print the current status counters.
fifoStatus          Print the current FIFO-related counters.
setTxHoldOff        Control transmit hold-off (blocking of transmits).
                    [uint32] 0=Disable 1=Enable
setTxDelay          Set the inter-packet delay for repeated TX.
                    [uint32] delayMilliseconds
getTxDelay          Get the inter-packet millisecond delay for repeated TX.
setTxPayload        Set TX packet payload bytes for future transmits.
                    [uint16] offset
                    [uint8opt] byte0 byte1 ...
setTxRandom         Set a specified range of bytes in the Tx packet payload to a
                    random value. Call setTxRandom again to stop randomizing the payload.
                    [uint16opt] Start Index
                    [uint16opt] End Index
setTxPayloadQuiet   Like setTxPayload, but less verbose.
                    [uint16] offset
                    [uint8opt] byte0 byte1 ...
setTxLength         Set how much data to load into the TX FIFO for transmitting.
                    Actual packet length may vary based on radio configuration.
                    [uint16] lengthBytes
printTxPacket       Print the current TX payload data and byte length.
peek                Peek at the start of the receive buffer.
                    [uint16] bytes: 1-10
                    [uint16opt] offset: [0]
getTime             Get the current RAIL time in microseconds.
setTime             Set the current RAIL time.
                    [uint32] timeUs
dataConfig          Control the data methods for TX and RX.
                    [string] txMethod: 'pkt'/'fifo'
                    [string] rxMethod: 'pkt'/'fifo'
                    [uint8opt] RAIL_RxDataSource_t (>0 needs fifo mode)
                    [uint8opt] RAIL_TxDataSource_t (>0 needs ping-pong buffer)
setRxFifo           Set the receive buffer length.
                    [uint16] lengthBytes: range 64-RX_BUFFER_SIZE
setTxFifoThreshold  Set the TX FIFO Almost Empty threshold.
                    [uint16] thresholdBytes: below which the event triggers
setRxFifoThreshold  Set the RX FIFO Almost Full threshold.
                    [uint16] thresholdBytes: above which the event triggers
fifoModeTestOptions Manual control over RAILtest FIFO actions.
                    [uint8] txFifo: 1=Manual 0=Automatic
                    [uint8] rxFifo: 1=Manual 0=Automatic
rxFifoManualRead    Read and print bytes from receive FIFO when in manual mode.
                    [uint8] appendedInfo: 1=include packet metadata
                    [uint16] bytesToRead
                    [uint8opt] [0=don't] 1=show timestamps with appendedInfo
txFifoManualLoad    Try to load data into available TX FIFO space.
fifoReset           Reset the transmit and/or receive FIFO.
                    [uint8] tx: 1=reset TX FIFO
                    [uint8] rx: 1=reset RX FIFO
abortRxPacket       Idle the radio shortly after RX sync word detection.
                    [uint32] abortOffsetUs
printTxAcks         Control printing of TX ACK packets.
                    [uint8] [0=Disable] 1=Enable
configRxHopping     Configure an RX Channel Hopping sequence.
                    [uint32opt] channel hopMode param delayUs: a hop's config,
                                repeat for additional hops ...
                    Use no arguments to get Z-Wave radio config defaults.
enableRxHopping     Control RX channel hopping previously configured.
                    [uint8] [0=Disable] 1=Enable
                    [uint8opt] [0=Continue] 1=Restart sequence
configRxHoppingOpts Configure options for a hop. Use configRxHopping after.
                    [uint8] hopIndex
                    [uint8] options
                    [int8opt] rssiThreshold: dBm for the threshold option
configRxMultiHop    Configure multi-sense for a hop. Use configRxHopping after.
                    [uint8] hopIndex
                    [uint32] syncDetectUs
                    [uint32] preambleSenseUs
                    [uint32] timingSenseUs
                    [uint32] timingReSenseUs
getRxHoppingRssi    Get the latest RSSI for a hopping channel.
                    [uint8] hopIndex
spectrumAnalyzer    Hop across a channel range to see the RSSI distribution.
                    [uint8] 1=Show ASCII-Art graph (non-parseable output)
                    [uint16opt] minChannel: [0]-65535
                    [uint16opt] maxChannel: 0-[65535]
                    Channel range is limited by the PHY and by hopping's
                    MAX_NUMBER_CHANNELS.
configRxDutyCycle   Configure RX Duty Cycling of the receiver.
                    [uint32] hopMode
                    [int32] parameter(s) {syncUs preamUs timingUs retimingUs}
                    [int32] delayUs
                    [int32opt] options
                    [int32opt] rssiThreshold: dBm for the threshold option
enableRxDutyCycle   Control RX duty cycling previously configured.
                    [uint8] DutyCycling: 0=Disable 1=Enable
                    [uint8opt] ScheduledWakeup: [0=Disable] 1=Enable
getDefaultRxDutyCycleConfig Get the default RX duty cycle configuration.
setTxAltPreambleLen Set alternate TX preamble length, enabled via txOptions.
                    [uint16] preambleBits
configSyncWords     Set sync words and their length. The radio must be off.
                    [uint8] bits: 2-32
                    [uint32] syncWord1
                    [uint32opt] syncWord2: [same as syncWord1]
getSyncWords        Get the sync word length in bits and value(s).
printRxErrors       Control printing of RX error packets.
                    [uint8] [0=Disable] 1=Enable
printRxFreqOffsets  Control printing of RX frequency offsets.
                    [uint8] [0=Disable] 1=Enable
printDataRates      Print the data rates of the current PHY.
stopInfinitePream   Stops an infinite preamble transmission.
___________________________________
____Energy_Modes_and_RF_Sensing____
sleep               Sleep until UART input or RF Sensed (if either configured).
                    [string] energyMode: 0-4[hs], for EM1P use 2 with radio on
                    [uint32opt] Legacy: RfSenseUs
                                        RfBand: 0=none,1=GHz,2=MHz,3=both
                          or Selective: SyncwordBytes Syncword RfBand
rfsense             Start RfSensing.
                    [uint32] Legacy: RfSenseUs; Selective: SyncwordBytes
                    [uint32opt] Legacy: RfBand: 0=none,1=GHz,2=MHz,3=both
                          or Selective: Syncword RfBand: as above
configRfSenseWakeup Configure RFSense Selective Wakeup PHY for transmitting.
setRfSenseTxPayload Load TX FIFO with RfSense Selective(OOK) Mode wake packet.
                    [uint8] syncwordNumBytes: 1-4
                    [uint32] syncWord: sent from least to most significant byte
_________________________
____Address_Filtering____
configAddressFilter Configure the addresss filter.
                    [uint32] matchTable
                    [uint8opt] offset0 size0 offset1 size1 ...
                    Enter more offsets and sizes if required.
setAddressFiltering Control address filtering.
                    [uint8] 0=Disable 1=Enable
getAddressFiltering Get the current state of address filtering.
printAddresses      Print the current address filtering addresses.
setAddress          Set a specific filtering address value.
                    [uint8] field: 0-1
                    [uint8] filterIndex: 0-3
                    [uint8opt] addrByte0 addrByte1 ... addrByte7
setAddressMask      Set a specific filtering address mask.
                    [uint8] field: 0-1
                    [uint8opt] bitMask
setAddressEnable    Control address filtering for a specific address.
                    [uint8] field: 0-1
                    [uint8] filterIndex: 0-3
                    [uint8] 0=Disable 1=Enable
__________________________
____Error_Rate_Testing____
perRx               Start a Packet Error Rate test. 'perRx 0 0' stops test.
                    [uint32] number of packets
                    [uint32] delayUs
perStatus           Get the PER test results. Also see status command.
setBerConfig        Set number of bytes to receive in BER mode.
                    [uint32] number of bytes: 0=maximum (536870911)
berRx               Control BER receive mode.
                    [uint8] 0=Disable 1=Enable
berStatus           Get status of current or last BER test.
                    Status is reset by setBerConfig and berRx enable.
______________________________
____Listen_Before_Talk_LBT____
setLbtMode          Show/Set the LBT mode for transmits.
                    [stringopt] 'off'/'csma'/'lbt'
getLbtParams        Get the current LBT parameters.
setLbtParams        Set LBT parameters.
                    [uint8] minBo
                    [uint8] maxBo
                    [uint8] tries
                    [int32] ccaThreshold
                    [uint16] backoffUs
                    [uint16] durationUs
                    [uint32] timeoutUs
set802154CcaMode    Set 802.15.4 CCA Mode
                    [uint8] ccaMode 0=RSSI 1=Signal 2=RSSI|Signal 3=RSSI&Signal 4=Always transmit
_____________________
____802_15_4_Mode____
enable802154        Configure and enable 802.15.4 mode.
                    [string] defaultState: 'idle'/'rx'
                    [uint16] idleToRxUs
                    [uint16] turnaroundTimeUs
                    [int16] ackTimeoutUs: to ACK's sync-detect
                    [uint8opt] defaultFP: [0]/1 Frame Pending for poll ACKs
config2p4GHz802154  Configure the radio for 2.4 GHz 802.15.4.
                    Use with enable802154.
                    [uint8opt] antDiv: [0=Disable] 1=Enable
                    [uint8opt] coex: [0=Disable] 1=Enable
                    [uint8opt] fem: [0=Disable] 1=Enable
                    [uint8opt] custom: [0=None] 1=Custom1
config863MHz802154  Configure the radio for 863 MHz 802.15.4 GB868.
                    Use with enable802154.
config915MHz802154  Configure the radio for 915 MHz 802.15.4 GB868.
                    Use with enable802154.
set802154e          Configure 802.15.4E options.
                    [uint32] RAIL_IEEE802154_EOptions_t
set802154g          Configure 802.15.4G options.
                    [uint32] RAIL_IEEE802154_GOptions_t
set802154FpMode     Control early and data frame pending lookup.
                    [uint8] early:     [0=Disable] 1=Enable
                    [uint8] dataframes:[0=Disable] 1=Enable
acceptFrames        Control 802.15.4 frame type acceptance.
                    [uint8] command: 0=Reject [1=Accept]
                    [uint8] ack:    [0=Reject] 1=Accept
                    [uint8] data:    0=Reject [1=Accept]
                    [uint8] beacon:  0=Reject [1=Accept]
                    [uint8opt] multipurpose: [0=Reject] 1=Accept
setPromiscuousMode  Control promiscuous mode.
                    [uint8] 0=Disable 1=Enable
setPanCoordinator   Control whether node is a PAN coordinator.
                    [uint8] 1=Yes 0=No
setPanId802154      Set the PAN ID for a filtering index.
                    [uint16] panId
                    [uint8opt] filterIndex: [0]-2
setShortAddr802154  Set the short address for a filtering index.
                    [uint16] shortAddr
                    [uint8opt] filterIndex: [0]-2
setLongAddr802154   Set the long address for a filtering index.
                    [uint8] longAddr_0
                    [uint8] longAddr_1
                    [uint8] longAddr_2
                    [uint8] longAddr_3
                    [uint8] longAddr_4
                    [uint8] longAddr_5
                    [uint8] longAddr_6
                    [uint8] longAddr_7
                    [uint8opt] filterIndex: [0]-2
setAddresses802154  Set all 802.15.4 address information.
                    [uint16] panId0
                    [uint16] shortAddr0
                    [stringopt] longAddr0
                    [stringopt] panId1 shortAddr1 longAddr1 ...
setDataReqLatency   Set data request event processing latency.
                    [uint32] latencyUs
set802154PHR        Set PHR (first 1, 2 or 4 bytes) in Tx buffer according to
                      the 'format' input parameter.
                    PHR 'frameLength' field is derived from TxLength set
                      previously with 'setTxLength'
                    For PHR fields info, refer to 802.15.4 specification.
                    [uint8] PHR format : 0=misc IEEE802154 modulations, PHR 1byte
                                         1=SUN FSK, PHR 2bytes
                                         2=SUN OFDM, PHR 4bytes
                                         3=SUN OQPSK, PHR 4bytes
                    [uint8opt] For SUN_OFDM : rate
                               For SUN_OQPSK: spreadingMode
                               For SUN_FSK  : fcsTtype
                               For LEG_OQPSK: none
                    [uint8opt] For SUN_OFDM : scrambler
                               For SUN_OQPSK: rateMode
                               For SUN_FSK  : whitening
                               For LEG_OQPSK: none
trigModeSwitchTx    Transmit a Mode Switch packet then transmit packets on the new PHY with current
                    TX options Depending on modeSwitchLife configuration, after all iterations are
                    done, it either stays on the new PHY or returns to the base PHY.
                    [uint8] new PhyModeId, i.e. ID of the PHYMode we are switching to
                    [uint8] number of packets transmitted on the new PHY
                    [uint32opt] number of times the sequence -mode switch packet followed by data packets- is
                    repeated, default is 1 if argument is absent
                    [uint32opt] delayMilliseconds before switching back to base PHY after all packets have been
                    transmitted on the new PHY, default is 0 if argument is absent. Multitimer is
                    used for delay greater than 0.
modeSwitchLife      Return to the base PHY after all data packets transmission for TX or after
                    MODE_SWITCH_START event and multitimer expiration after first data packet
                    reception on new phy for RX.
                    [uint8] 0=stay on new PHY (normal Wi-SUN FAN behaviour) 1=return to base PHY (special test mode)
configRxChannelSwitching802154 Configure RX channel switching for 2.4 GHz 802.15.4.
                               [uint16] First radio channel
 [uint16] Second radio channel
________________
____BLE_Mode____
setBleMode          Control BLE mode.
                    [uint8] 0=Disable 1=Enable
getBleMode          Get the current BLE mode.
setBleChannelParams Configure channel parameters related to BLE.
                    [uint8] logicalChannel
                    [uint32opt] accessAddr crcInit disableWhiten
setBlePhySwitchToRx Configure BLE PhySwitchToRx parameters. RX is
                    entered timeDeltaUs after sync word of received packet.
                    [uint8] 0=Disable 1=Enable
                    [uint32opt] phy timeDelta physicalChannel
                    [uint32opt] logicalChannel accessAddr crcInit
                    [uint32opt] disableWhiten
                    [uint32opt] extraDelayUs
setBleAdvertising   Configure for BLE advertising.
                    [uint8] advChannel: 37-39
setBle1Mbps         Switch to the 1Mbps BLE PHY.
                    [uint8opt] 0=Legacy 1=Viterbi [chip default]
setBle2Mbps         Switch to the 2Mbps BLE PHY.
                    [uint8opt] 0=Legacy 1=Viterbi [chip default]
setBleCoding        Switch to a BLE coded PHY.
                    [uint8] RAIL_BLE_Coding_t value
setBleSimulscan     Switch to a BLE simulscan PHY.
___________________
____Z_Wave_Mode____
setZWaveMode        Show/Control Z-Wave mode.
                    [uint8opt] 0=Disable 1=Enable
                    [uint8opt] optionsBitmask
getZWaveMode        Get the current Z-Wave mode.
setZWaveRegion      Set the Z-Wave region.
                    [uint8] region: see listZWaveRegions
performZwaveIrcal   Perform IRCAL across all channels of the current Z-Wave region.
                    [uint8opt] [0=Use cached IRCAL values], 1=Force IRCAL
getZWaveRegion      Get the current Z-Wave region.
listZWaveRegions    List supported Z-Wave regions.
getZWaveBaudRate    Get the baudrate of the current Z-Wave channel.
setZWaveNodeId      Sets Z-Wave NodeId.
                    [uint16] nodeId
setZWaveHomeId      Sets Z-Wave HomeId and its hash.
                    [uint32] homeId
                    [uint8] hash
setZWaveOptions     Configure Z-Wave options.
                    [uint8opt] optionsBitmask
setZWaveLowPower    Set the transmit power for low-power ACKing.
                    [int32] power: deci-dBm unless 'raw' is added
                    [stringopt] 'raw'=units are raw power level
getZWaveLowPower    Get the low power values (deci-dBm and raw).
zwaveReceiveBeam    Run the Z-Wave beam detection algorithm.
setMfmMode          Set MFM mode to enabled or disabled
                    [uint8] 0=Disable 1=Enable
getMfmMode          Get the current MFM mod
__________________
____RAIL_Timer____
setTimer            Set the RAIL timer timeout.
                    [uint32] timeout: per mode
                    [string] 'rel'=Relative 'abs'=Absolute
timerCancel         Cancel the RAIL timer if it is active.
printTimerStats     Print current timer configuration.
enableMultiTimer    Control the multiTimer API.
                    [uint8] 0=Disable 1=Enable
setMultiTimer       Set a specific timer timeout.
                    [uint8] timer: 0..(NUM_MULTI_TIMERS-1)
                    [uint32] timeout: per mode
                    [string] 'rel'=Relative 'abs'=Absolute
multiTimerCancel    Cancel a specific timer if it is active.
                    [uint8] timer: 0..(NUM_MULTI_TIMERS-1)
getMultiTimerStats  Get information about a specific timer.
                    [uint8] timer: 0..(NUM_MULTI_TIMERS-1)
delayUs             Do a blocking delay for a specified time.
                    [uint32] delayUs
____________________
____Auto_ACK_ing____
autoAckConfig       Configure and enable auto-ACK functionality.
                    [string] defaultState: 'idle'/'rx'
                    [uint16] idleToRxUs
                    [uint16] turnaroundTimeUs
                    [uint16] ackTimeoutUs: to ACK's sync-detect
autoAckDisable      Disable auto-ACK. Use autoAckConfig to reenable.
setAckPayload       Set the ACK payload to transmit.
                    [uint16] offset
                    [uint8opt] byte0 byte1 ...
setAckLength        Set how much data to load into the TXACK FIFO.
                    [uint16] lengthBytes
printAckPacket      Print the current TXACK payload data and byte length.
getAutoAck          Get the current state of auto-ACKing.
autoAckPause        Pause or Resume auto-ACKing
                    [uint8] 1=PauseRx 0=ResumeRx
                    [uint8] 1=PauseTx 0=ResumeTx
setTxAckOptions     Control auto-ACK response for just the next receive.
                    [uint8] 1=cancelAck 0=sendAck
                    [uint8] 1=useTxBuf 0=useTxAckBuf
______________________
____GPIO_Functions____
setGpioOutPin       Set a GPIO pin data out bit.
                    [string] gpioPort: start from '0' or 'a' or 'A'
                    [uint8] gpioPin
                    [uint8] state: 0/1
___________________________
____Diagnostic_and_Test____
getConfigIndex      Get the index of the current multi-PHY radio config.
                    See the entries in *channelConfigs[]. Start with index 0.
setConfigIndex      Activate a multi-PHY radio configuration.
                    See the entries in *channelConfigs[]. Start with index 0.
                    [uint8] multiPhyIndex
setCtune            Set the value of HFXO CTUNE. The radio must be IDLE.
                    [uint16] ctune
getCtune            Get the value of HFXO CTUNE
setCtuneDelta       Set the value of HFXO CTUNE delta
                    [uint16] delta
getCtuneDelta       Get the value of HFXO CTUNE delta
setPaCtune          Set the PACTUNE value for TX and RX.
                    [uint8] txPaCtune
                    [uint8] rxPaCtune
enablePaCal         Control PA power calibration.
                    [uint8] 0=Disable 1=Enable
setDebugSignal      Configure chip specific debug output.
                    Use 'setDebugSignal help me' for more details.
                    [string] pin
                    [string] signal
                    [uint16opt] signalOptions
setDebugMode        Control Debug mode which allows freqOverride.
                    [uint32] 0=Disable 1=Enable
freqOverride        Set the radio frequency. Requires debug mode.
                    [uint32] freqHz: Only small deviations from the
                                     current configuration are supported.
configDirectMode    Configure direct mode
                    [uint8] syncRx: 0=Disable 1=Enable
                    [uint8] syncTx: 0=Disable 1=Enable
                    [uint8] doutPort
                    [uint8] doutPin
                    [uint8] dclkPort
                    [uint8] dclkPin
                    [uint8] dinPort
                    [uint8] dinPin
                    [uint8opt] doutLoc
                    [uint8opt] dclkLoc
                    [uint8opt] dinLoc
directMode          Control direct mode.
                    [uint8] 0=Disable 1=Enable
directTx            Control TX in direct mode.
                    [uint8] 0=Disable 1=Enable
txCancel            Start a TX that will be cancelled.
                    [int32] delayUs: when to cancel it
                    [uint8opt] stopMode: [0=RAIL_Idle] >0=RAIL_StopMode_t
configHFXOThermistor Configures the thermistor pin and the HFXO compensation parameters.
configHFXOCompensation Configure the temperature parameters for HFXO compensation.
                    [int8opt] Arg1: enableCompensation
                    Arg2: zoneTemperatureC
                    Arg3: deltaNominal
                    Arg4: deltaCritical
startThermistor     Starts a thermistor measurement.
getThermistor       Gets the thermistor impedance.
getHFXOPPMError     Compute the HFXO PPM deviation.
                    Must be called after a complete thermistor measurement
                    ie after getThermistor.
compensateHFXO       Starts the compensation process on the HFXO.
                      Must be called after a complete thermistor measurement
                      ie after getThermistor.
                    [uint8opt] 1=restore the initial frequency not compensated
configThermalProtection Enable thermal protection, configure temperature threshold and cool down
                    [uint8opt] Enable protection
                               New temperature threshold in Celsius degrees
                               New cool down
getTemperature      Show chip, FEM, XTAL temperatures in Celsius (255=invalid)
                    [uint8opt] 1=reset temperature values after reading
getRandom           Get random data from the radio.
                    [uint16] lengthBytes
                    [uint8opt] [0=show them] 1=hide them
setTxUnderflow      Control TX underflows by not loading the TX FIFO.
                    [uint8] 1=Force underflows 0=Disable
setRxOverflow       Control RX overflows by delaying in the event handler.
                    [uint8] 0=Disable 1=Enable
                    [uint32opt] delayUs: [0]
setCalibrations     Control calibrations.
                    [uint8] 0=Disable 1=Enable
setTxTransitions    Set the TX state transitions.
                    [string] txSuccess: 'idle'/'rx'
                    [string] txError: 'idle'/'rx'
setRxTransitions    Set the RX state transitions.
                    [string] rxSuccess: 'idle'/'rx'/'tx'
                    [string] rxError: 'idle'/'rx'/'tx'
getTxTransitions    Get the TX state transitions.
getRxTransitions    Get the RX state transitions.
setNextTxRepeat     Set next transmit's automatic repeat count.
                    [uint16] number of auto-repeated transmits after the first
                    [uint32opt] delayUs inter-transmit or hop delay
                    [uint32opt] channel (if hopping)
                    repeat delayUs and channel for additional hops.
setNextBleTxRepeat  Set next transmit's automatic repeat count.
                    [uint16] number of auto-repeated transmits after the first
                    [uint32opt] delayUs inter-transmit or hop delay
                    [uint32opt] phy railChannel logicalChannel accessAddress
                    (a hop's config, repeat from delayUs for additional hops)
setTxTimePos        Set desired TX timestamp position.
                    [uint8] RAIL_PacketTimePosition_t
setRxTimePos        Set desired RX timestamp position.
                    [uint8] RAIL_PacketTimePosition_t
setTimings          Set RAIL state transition timings (use -1 to keep same).
                    [int32] idleToRxUs
                    [int32] txToRxUs
                    [int32] idleToTxUs
                    [int32opt] rxToTxUs [0]
                    [int32opt] rxSearchTimeoutUs [0]
                    [int32opt] txToRxSearchTimeout [0]
                    [int32opt] txToTx [0]
forceAssert         Force a RAIL assert with the given error code.
                    [uint32] RAIL_AssertErrorCodes_t
getAppMode          Get the current RAILtest AppMode_t mode.
getRadioState       Get the current RAIL_RadioState_t radio state.
verifyRadio         Verify radio memory contents.
                    [uint32] durationUs: time limit
                    [uint8] 0=Resume if previously didn't finish 1=Restart
                    [uint8] 0=current radio config 1=external radio config
                    [uint8] 0=No callback 1=Use RAILCb_ConfigVerification
getChannel          Get the current radio channel.
setChannel          Set the radio channel.
                    [uint16] channel
reset               Perform a reboot of the chip.
writeRmrStructure   Reserved for Simplicity Studio use only.
                    [uint8]
                    [uint16]
                    [uint8]
                    [uint32opt]
updateConfigPtr     Reserved for Simplicity Studio use only.
                    [uint8]
                    [uint16]
                    [uint8]
reconfigureModem    Reserved for Simplicity Studio use only.
setRfPath           Set the RF path.
                    [uint32] 0=Path0 1=Path1
printEvents         Show/Configure printing of RAIL events as they occur.
                    [uint32opt] printEvents<31:0> printEvents<63:32>
                    [uint32opt] mask<31:0> mask<63:32>
printChipFeatures   Display RAIL features supported at compile and runtime.
getmemw             Read count 32-bit words starting at address.
                    [uint32] address
                    [uint32opt] count
setmemw             Write 32-bit values starting at address.
                    [uint32] address
                    [uint32opt] value0 value1 ...
throughput          Throughput test.
                    [uint32] number of packets
setRssiOffset       Sets the RSSI offset.
                    [int32] offsetDbm
getRssiOffset       Gets the RSSI offset(s) in dBm.
                    [uint8opt] [0=radio and protocol-specific] 1=radio only
setRssiDetectThresholdSets the RSSI detect threshold.
                    [int8] RSSI detect threshold (in dBm). (-128 disables detection)
getRssiDetectThresholdGets the RSSI detect threshold(in dBm).
txAt                Transmit a packet at a certain time.
                    [uint32] time: per mode
                    [stringopt] ['abs'=Absolute] 'rel'=Relative
                    [stringopt] 'abort' RX if TX occurs during packet RX
                                    otherwise TX is delayed to end of RX
setFreqOffset       Get/Set the frequency offset adjustment.
                    [int32opt] RAIL_FrequencyOffset_t
holdRx              Control holding of received packets.
                    [uint8] [0=Process packets immediately] 1=Hold packets
wait                Suspend processing of CLI input for a while.
                    [uint32] waitTimeUs
                    [stringopt] ['rel'=Relative] 'abs'=Absolute
clearScript         Clear the script entered via enterScript.
                    [uint8opt] [0=RAM] 1=Flash
printScript         Print the script entered via enterScript.
                    [uint8opt] [0=RAM] 1=Flash
enterScript         Enter script entry mode.
                    Conclude entry mode with text 'endScript'.
                    [uint8opt] [0=RAM] 1=Flash-script will run on boot
runScript           Run the script entered via enterScript.
                    [uint8opt] [0=RAM] 1=Flash-script will run on boot
setRetimeOption     Control retime options.
                    [uint8] optionBitMask: 1=HFXO | 2=HFRCO | 4=DCDC | 8=LCD
enable802154SignalIdentifier Enable Signal Identifier 2.4Ghz 802.15.4 signal detection
                    [uint8] 0=Disable 1=Enable
enableBleSignalIdentifier Enable Signal Identifier for BLE signal detection
                    [uint8] Mode 0=Disable 1=BLE1Mbps 2=BLE2Mbps
getChannelConfigEntry Get the maximum valid channelConfig index, the maximum valid channelConfigEntry index
                    in the selected channelConfig and parameters of the selected channelConfigEntry
                    [uint8] channelConfig index
                    [uint8] channelConfigEntry index
deinitProtocol      Deinit the current protocol (BLE, 802.15.4, Z-Wave)
```

###### RAILtest 2.8 (GSDK 2.7.x) Help Text

```sh
> help
<command> <args> <help text>
  u=uint8, v=uint16, w=uint32, s=int32, b=string, ?=Anything, *=0 or more of previous
 --- Application Configuration ---
setEventConfig              www*       [mask<31:0> events<31:0> [mask<63:32> events<63:32>]] Modify
                                       RAIL_ConfigEvents with the given mask and events
printDataRates                         Print the data rates of the current PHY
resetCounters                          Resets the Tx and Rx counters
setPeripheralEnable         u          [enable] Enable(1) or Disable(0) LEDs and LCD peripherals
setNotifications            u          [enable] Enable(1) or Disable(0) status prints that happen asynchronously
                                       (rxPacket, txEnd, txError)
getLogLevels                           Get whether notifications are set or peripherals are enabled
getVersion                             Get version information.
getVersionVerbose                      Get verbose version information.
setPtiProtocol              u          [protocol] Set PTI protocol for Network Analyzer (0=Custom 2=Thread 3=BLE
                                       4=Connect 5=Zigbee 6=Z-Wave)
setPrintingEnable           u          [enable] Universally enable or disable all printing in railtest. Enabled
                                       by default.
 --- Receive and Transmit ---
rx                          w          [enable] Enable(1) or Disable(0) receive mode
rxAt                        wbwbu*     [start mode end mode rxTransEndSched hardEnd] Configure scheduled
                                       receive.
setRxOptions                w*         [rxOptionsBitField] Configure receive options, based on RAIL_RX_OPTION
                                       defines. If called without any parameters, prints the current state of
                                       these options.
tx                          w          [n] Transmit n packets with tx options. If n is 0 transmit infinitely.
                                       Defaults are don't wait for ack, send CRC, use sync word 0.
txWithOptions               w          [n] Same functionality as tx. This command is deprecated
txAt                        wb*        [time mode (abort)] Transmit a packet at the time and mode specified. If
                                       the string 'abort' is specified and the TX tries to go out during packet
                                       reception, the TX will abort, as opposed to being postponed until the RX
                                       completes.
txAfterRx                   w          [time] Schedule a TX for a delay in us after each receive. 0 to disable
configTxOptions             w*         [txOptionsBitfield] Sets the bitmask to be used as the tx options. See
                                       #defines starting with "RAIL_TX_OPTION_" in rail_types.h. Can be called
                                       without any parameters to print the current state of these options.
setFixedLength              v          [fixedLength] Configure fixed length
setchannel                  v          [channel] Set the current radio channel
getchannel                             Get the current radio channel
setFreqOffset               s*         [(offset)] Sets the frequency offset adjustment. With no argument dis
                                       plays the current offset setting.
setPower                    sb*        [power raw] Set the current transmit power in deci dBm, or raw units if
                                       'raw' is specified. The radio must be IDLE for setPower to succeed.
getPower                               Get the current transmit power in deci dBm
setPowerConfig              uvv        [mode voltage rampTime] Set the current transmit power config.
getPowerConfig                         Get the current transmit power config.
enablePaAutoMode            u          [enable] Enable automatic configuration of PA's when setting dBm power
                                       levels.
configPaAutoMode            ussu       [index min max mode] Configure the entries of default PA Auto Mode
                                       configuration provided by the PA Auto Mode plugin.
sweepTxPower                           Sweep power levels for the current PA and stream at each level.
offsetLqi                   s          [offset] Add this offset value to the hardware's 8-bit hardware LQI value
                                       before being made available to the application.
getRssi                     w*         [wait] Get RSSI in dBm if the receiver is turned on. Optionally specify
                                       whether or not to wait for a valid value in case it is initially invalid.
sweepPower                  ssw        [lowPower] [hiPower] [period] Sweep power in square wave fashion. Specify
                                       power in deci dBm, period in microseconds.
startAvgRssi                wu*        [averageTimeUs] [channel] Start AGC RSSI averaging
getAvgRssi                             Get AGC RSSI averaging result.
setRssiOffset               s          Sets the RSSI offset in dBm.
getRssiOffset                          Gets the RSSI offset.
setTxTone                   ww*        [enable (antenna)] Enable(1) or Disable(0) a tone from the radio with
                                       option of selecting antenna
setTxStream                 ww*        [enable (streamMode) (antenna)] Enable(1) or Disable(0) a stream from the
                                       radio based on selection of RAIL_StreamMode_t and antenna.(Option :
                                       Unspecified - Any, 0 - TX_ANTENNA0, 1 - TX_ANTENNA1). Default settings
                                       for streamMode is RAIL_STREAM_PN9_STREAM and for antenna is
                                       RAIL_TX_OPTIONS_DEFAULT.
status                                 Print the current status counters
fifoStatus                             Print the current fifo related counters
setTxHoldOff                w          [enable] Enable(1) or Disable(0) transmit hold-off (blocking of
                                       transmits)
setTxDelay                  w          [delay] Set the inter-packet delay in milliseconds for repeated Tx
getTxDelay                             Get the inter-packet delay in milliseconds for repeated Tx
setTxPayload                vu*        [offset byte0 byte1 ...] Set the packet bytes to be sent
setRfSenseTxPayload         uw         [syncwordNumBytes syncWord] Set the RfSense Wakeup Syncword (1-4 bytes)
                                       in TX FIFO to wake up a receiving node configured for Selective(OOK)
                                       RFSENSE.
setTxPayloadQuiet           vu*        [offset byte0 byte1 ...] Functions like 'setTxPayload', but outputs less
                                       information
setTxLength                 v          [length] Set the number of bytes to load into the FIFO before
                                       transmitting. Actual packet length may vary based on radio configuration
printTxPacket                          Print the current Tx data and length
peek                        v*         [number of bytes] [offset] Peek at the start of receive buffer.
getTime                                Get the current time from the RAIL timebase in microseconds
setTime                     w          Set the current time in the RAIL timebase in microseconds
dataConfig                  bb         [txMethod rxMethod] Choose between 'pkt' and 'fifo' data methods for RAIL
                                       Tx and Rx
setRxFifo                   v          [length] Set the receive buffer's length, which is used in both packet
                                       mode and FIFO mode. The length cannot be set above RX_BUFFER_SIZE.
setTxFifoThreshold          v          [txFifoThreshold] Set the Tx Fifo Almost Emtpy threshold
setRxFifoThreshold          v          [rxFifoThreshold] Set the Rx Fifo Almost Emtpy threshold
fifoModeTestOptions         uu         [txFifoManual rxFifoManual] Manual control over RAILTEST fifo actions
rxFifoManualRead            uvu*       [appendedInfo bytesToRead printTiming] Read bytes out of receive fifo and
                                       print
txFifoManualLoad                       Will attempt to load data into the fifo if there is space
fifoReset                   uu         [tx rx] Reset the transmit or receive fifo
abortRxPacket               w          [abortOffset] Delay after sync word before idling radio.
printTxAcks                 w          [printTxAcks] Enable printing of tx ack packets as they happen.
configRxChannelHopping      w*         [(channel mode parameter delay)...] Configure RX Channel Hopping to hop
                                       in the sequence provided, for the given RAIL_RxChannelHoppingMode_t mode,
                                       parameter, and interchannel delay. One mode and parameter must be
                                       provided per channel.
enableRxChannelHopping      uu*        [enable (reset)] Enable/disable rx channel hopping. The channel hopping
                                       will start again from the first member of the sequence is reset is true.
configChannelHoppingOptions uu         [index options] Configure channel hopping options for the entry of
                                       specified index. Must call configRxChannelHopping after this, for options
                                       to take effect.
getChannelHoppingRssi       u          [channelIndex] Get the latest RSSI for the channel at the index of the
                                       hopping sequence specified.
spectrumAnalyzer            uv*        [(graphics min max)]Emulate spectrum analyzer functionality to get the
                                       power across min and max channels (number of channels limited by
                                       MAX_NUMBER_CHANNELS) of the current PHY using channel hopping. Specify
                                       graphics = 1 for an ASCII-Art graph, which will break out of the standard
                                       RAILTest response format.
configRxDutyCycle           www        [mode parameter delay] Configure RX Duty Cycle mode to cycle the receiver
                                       with the given parameters.
enableRxDutyCycle           u          [enable] Enable/disable rx duty cycle mode.
setTxAltPreambleLen         w          [length] Set an alternate preable length for transmit, which can be
                                       enabled in txOptions.
configSyncWords             uw*        [bits sync1 (sync2)] Set the sync word bit length and value(s). It can be
                                       only set when radio is off.
getSyncWords                           Get the sync word length(in bits) and value(s).
printRxErrors               w          [enable] Enable (1) or Disable (0) printing of Rx error packets. Defaults
                                       to disabled.
stopInfinitePreambleTx                 Stops the infinite preamble transmission
 --- Energy Modes and RF Sense ---
sleep                       uw*        [EM# [RfSenseUs RfBand] or [SyncwordSize(bytes) Syncword RfBand]] Sleep
                                       in EM# with RFSenseUs on RfBand (0=none,1=2.4GHz,2=SubGHz,3=both) (and
                                       UART input) for Legacy Mode or SyncwordSize(bytes) and Syncword on RfBand
                                       for Selective(OOK) Mode. To enter EM1P if supported, request EM2 with the
                                       radio on.
rfsense                     ww*        [[RfSenseUs RfBand] or [SyncwordSize(bytes) Syncword RfBand]] Start
                                       RfSensing with RSenseUs on RfBand for Legacy Mode or SyncwordSize(bytes)
                                       and Syncword on RfBand for Selective(OOK) Mode.
configRfSenseWakeupPhy                 Configure the transmitting node with RFSense Selective(OOK) Wakeup PHY.
 --- Address Filtering ---
configAddressFilter         wu*        [matchTable offset0 size0 offset1 size1] Configure the addresss filter.
setAddressFiltering         u          [enable] Enable(1) or Disable(0) address filtering.
getAddressFiltering                    Print the current state of address filtering.
printAddresses                         Print the current address filtering addresses.
setAddress                  uuu*       [field index value...] Set the address value at (field, index) to value.
setAddressEnable            uuu        [field index enable] Enable address filtering for the given address.
 --- Error Rate Testing ---
perRx                       ww         [packets delayUs] Start a Packet Error Rate test. 'perRx 0 0' will
                                       disable ongoing test.
perStatus                              Output the results of the PER test. Also see 'status' command
setBerConfig                w          [number bytes] Set number of bytes to receive in BER mode; 536870911 =
                                       max number of bytes to test; 0 = set max number of bytes to test
berRx                       w          [enable] Enable(1) or Disable(0) BER receive mode
berStatus                              Get status of last BER test or of current running test; status
                                       information is reset for commands setBerConfig and berRx enable
 --- Listen Before Talk (LBT) ---
setLbtMode                  b*         [modeStr] Set LBT mode off, csma, lbt
getLbtParams                           Get the current LBT parameters
setLbtParams                uuusvvw    [minBo maxBo tries thresh backoff duration timeout] Set LBT parameters
 --- 802.15.4 Mode ---
enable802154                bvvvu      [defaultState idleTime turnaroundTime ackTimeout (defaultFramePending)]
           Enable 802.15.4 mode
config2p4GHz802154          u*         [antDiv coex] Configure the radio for 2.4 GHz 802.15.4. This should be
                                       called in addition to 'enable802154'.
config863MHz802154                     Configure the radio for 863 MHz 802.15.4 GB868. This should be called in
                                       addition to 'enable802154'.
config915MHz802154                     Configure the radio for 915 MHz 802.15.4 GB868. This should be called in
                                       addition to 'enable802154'.
set802154e                  w          [EOptionsBitfield] Configure 802.15.4E options, based on
                                       RAIL_IEEE802154_E_OPTION_ defines.
set802154g                  w          [GOptionsBitfield] Configure 802.15.4G options, based on
                                       RAIL_IEEE802154_G_OPTION_ defines.
set802154fpmode             uu         [early dataframes] Enable(1) or Disable(0) early frame pending lookup and
                                       data frame pending lookup. Default settings are 0 0
acceptFrames                uuuu*      [command ack data beacon (multipurpose)] Enable(1) or Disable(0) 802.15.4
                                       frame acceptance. Default settings for 802.15.4 are 1 0 1 1 0.
setPromiscuousMode          u          [enable] Enable(1) or Disable(0) promiscuous mode
setPanCoordinator           u          [enable] Enable(1) or Disable(0) the node acting as a PAN coordinator
setPanId802154              vu*        [panId index] Set the PAN ID for the given index. Index defaults to 0 if
                                       not given
setShortAddr802154          vu*        [shortAddr index] Set the short address(es) for the given index. Index
                                       defaults to 0 if not given
setLongAddr802154           uuuuuuuuu* [longAddr_0 ... longAddr_7 index] Set the long address for the given
                                       index. Index defaults to 0 if not given
setAddresses802154          vvb*       [panId0 shortAddr0 longAddr0 panId1 ... ] Set all 802.15.4 address
                                       information.
setDataReqLatency           w          [us] Set data request event processing latency.
 --- BLE Mode ---
setBleMode                  u          [enable] Set BLE mode to enabled or disabled
getBleMode                             Get the current BLE mode
setBleChannelParams         uw*        [logicalChannel accessAddr crcInit disableWhiten] Configure channel
                                       parameters related to BLE
setBlePhySwitchToRx         uw*        [enable phy timeDelta physicalChannel logicalChannel accessAddr crcInit
                                       disableWhiten] Configure parameters for BLE PhySwitchToRx. RX is entered
                                       timeDelta us after sync word of received packet.
setBleAdvertising           u          [advChannel] Configure for BLE advertising on channel 37, 38, or 39
setBle1Mbps                 u*         [isViterbi] Switch to the 1Mbps BLE PHY
setBle2Mbps                 u*         [isViterbi] Switch to the 2Mbps BLE PHY
setBleCoding                u          [coding] Switch to the given RAIL_BLE_Coding_t value
 --- Z-Wave Mode ---
setZWaveMode                u*         [enable [options]] Set Z-Wave mode to enabled or disabled
getZWaveMode                           Get the current Z-Wave mode
setZWaveRegion              u          [region] Set Z-Wave region
getZWaveRegion                         Get the current Z-Wave region
listZWaveRegions                       List supported Z-Wave regions
getZWaveBaudRate                       Get the baudrate of the current Z-Wave channel
setZWaveNodeId              u          [nodeId] Sets Z-Wave NodeId
setZWaveHomeId              wu         [homeId hash] Sets Z-Wave HomeId and its hash
setZWaveOptions             u*         [options] Enable/Disable Z-Wave options
setZWaveLowPower            sb*        [power raw] Set the low transmit power in deci dBm, or raw units if 'raw'
                                       is specified. This will be used during Low Power ACKing.
getZWaveLowPower                       Get the deci dBm value and raw value of the Low transmit power
zwaveReceiveBeam                       Do the beam detection algorithm to receive Z-Wave beams.
 --- RAIL Timer ---
setTimer                    wb         [timeout mode] Set the RAIL timer timeout. You can use either an absolute
                                       (abs) or relative (rel) timer mode.
timerCancel                            Cancel the RAIL timer if it's active.
printTimerStats                        Print current timer configuration.
enableMultiTimer            u          [enable] Enable (1) or disable (0) the multiTimer API for use. By default
                                       the multiTimer is disabled for single protocol RAIL and enabled for
                                       multiprotocol RAIL.
setMultiTimer               uwb        [timer timeout mode] Set a specific timer's timeout, starting with timer
                                       0. You can use either an absolute (abs) or relative (rel) timer mode.
multiTimerCancel            u          [timer] Cancel a specific timer if it's active, starting with timer 0.
printMultiTimerStats        u          [timer] Print a specific timer's configuration, starting with timer 0.
delayUs                     w          [delay] Blocking delay for specified number of microseconds.
 --- Auto Acking ---
autoAckConfig               bvvv       [defaultState idleTime turnaroundTime ackTimeout] Configure and enable
                                       auto ack functionality in RAIL.
autoAckDisable                         Disable auto ack. Use autoAckConfig to reenable.
setAckPayload               vu*        [offset byte0 byte1 ...] Set the ack bytes to be sent.
setAckLength                v          [length] Set the number of bytes to transmit for ack payloads
printAckPacket                         Print the current ack data and length
getAutoAck                             Print the current state of auto acking.
autoAckPause                uu         [RxPause TxPause] Pause(1) or Resume(0) Auto Acking
setTxAckOptions             uu         [cancelAck useTxBuf] Enable(1) or Disable(0) feature for one receive
 --- GPIO Functions ---
setGpioOutPin               buu        [port pin state] Set a GPIO pin's data out bit.
 --- Diagnostic and Test ---
getConfigIndex                         Get the index of the current radio configuration selected for use. See
                                       the entries in *channelConfigs[]. Start with index 0.
setConfigIndex              u          [index] Set the index of the current radio configuration selected for
                                       use, and associate this new configuration to the current railHandle. See
                                       the entries in *channelConfigs[]. Start with index 0.
getmemw                     ww*        [address count] Read count 32bit words starting at address
setmemw                     ww*        [address value...] Write as many 32bit values as specified starting at
                                       address
setCtune                    v          [ctune] Set the value of CTUNE in the CMU->HFXOSTEADYSTATECTRL register.
                                       The radio must be IDLE for setCtune to succeed.
getCtune                               Get the value of CTUNE in the CMU->HFXOSTEADYSTATECTRL register
setPaCtune                  uu         [txPaCtune] [rxPaCtune] Set the value of PACTUNE for TX and RX mode
enablePaCal                 u          [enable] Enable(1) or Disable(0) PA power calibration
setDebugSignal              ?          Configure chip specific debug output. Use 'setDebugSignal help' for more
                                       details.
setDebugMode                w          [mode] 1 = Frequency Override. 0 = Disable debug mode
freqOverride                w          [freq] Change to freq specified in Hz. Requires debug mode to be enabled.
                                       Only small frequency deviations from the current configuration are
                                       supported.
directMode                  u          [enable] Enable(1) or Disable(0) direct mode
directTx                    u          [enable] Enable(1) or Disable(0) TX in direct mode
txCancel                    su*        [delay (stopmode)] Start a single TX that will be cancelled in delay
                                       microseconds using stopmode 0=RAIL_Idle(default) or >0=RAIL_StopMode_t.
startThermistorMeasurement             Configures the thermistor pin and starts a thermistor measurement.
getThermistorImpedance                 Gets the thermistor impedance.
getRandom                   vu*        [len hidden] Get len bytes of random data from the radio. Only print them
                                       to the screen if hidden is 0 (default).
setTxUnderflow              w          [enable] Enable(1) or Disable(0) TX underflows
setRxOverflow               w*         [enable delayUs] Enable(1) or Disable(0) RX overflows. The overflow will
                                       be caused by hanging in the interrupt handler for delayUs
setCalibrations             w          [enable] Enable(1) or Disable(0) RAIL calibrations
setTxTransitions            bb         [txSuccess txError] Set each RAIL TX state transition value to r(x) or
                                       i(dle)
setRxTransitions            bb         [rxSuccess rxError] Set each RAIL RX state transition value to t(x),
                                       r(x), or i(dle).
getTxTransitions                       Get the RAIL TX state transitions for success and error.
getRxTransitions                       Get the RAIL RX state transitions for success and error.
setTxTimePos                u          [RAIL_PacketTimePosition_t] Set desired Tx timestamp position.
setRxTimePos                u          [RAIL_PacketTimePosition_t] Set desired Rx timestamp position.
setTimings                  vvvv*      [idleToRx txToRx idleToTx rxToTx rxSearch txToRxSearch] Set RAIL state
                                       transition timings in microseconds
forceAssert                 w          [errorCode] Force a RAIL assert with the given error code.
printEvents                 w*         [printEvents<31:0> [printEvents<63:32>] [mask<31:0>] [mask<63:32>]]
                                       Configure printing of RAIL events in chronological order as they occur.
                                       Pass no parameters to see a list of all available event enum names and
                                       values.
printChipFeatures                      Display RAIL features supported at compile and runtime on the chip.
getAppMode                             Print the current app mode of RAILTEST. Values printed are those to be
                                       found in AppMode_t.
getRadioState                          Get the RAIL radio state. Values returned correspond to
                                       RAIL_RadioState_t.
verifyRadio                 wuuu       [durationUs restart override callback] Verify radio memory contents and
                                       return after duration in microseconds. Restart (1) or resume (0) from
                                       last run.
enterScript                 u*         [(flash)] Enter script entry mode. Conclude entry mode with text 'end
                                       Script'. Specify if script is saved to RAM (0, default) or RAM and flash
                                       (1). If saved to flash, script will run on boot.
runScript                   u*         [(flash)] Run the script entered via enterScript. Run the script in RAM
                                       (0, default) or in flash (1).
printScript                 u*         [(flash)] Print the script entered via enterScript. Display the script in
                                       RAM (0, default) or in flash (1).
clearScript                 u*         [(flash)] Clear the script entered via enterScript. Clear the script in
                                       RAM (0, default) or in flash (1).
wait                        wb*        [time (mode)] Suspend processing of any input until time in the future.
                                       Optionally specify whether the time is relative (rel) (default) or
                                       absolute (abs).
holdRx                      u          [enable] Enable/Disable holding of received packets instead of instantly
                                       processing them.
reset                                  Perform a reboot of the chip
 --- Antenna Commands ---
setRfPath                   w          [rfPath] 0=Path0, 1=Path1
 --- RAM Modem Reconfiguration Commands ---
writeRmrStructure           uvuw*      This command should only be called by Simplicity Studio and not directly
                                       from the CI.
updateConfigurationPointer  uvu        This command should only be called by Simplicity Studio and not directly
                                       from the CI.
reconfigureModem                       This command should only be called by Simplicity Studio and not directly
                                       from the CI.
```

### Using RAIL for Wireless M-Bus Applications with EFR32

#### Using RAIL for Wireless M-Bus Applications with EFR32

**This section replaces _AN1119: Using RAIL for Wireless M-Bus Applications with EFR32_. Further updates to this application note will be provided here.**

This application note describes using the Flex SDK for Wireless M-Bus development on EFR32 Wireless Geckos. It includes features and limitations, using the radio configurator and supplied software components, and a description of the examples. Proprietary is supported on all EFR32FG devices. For others, check the device's data sheet under Ordering Information > Protocol Stack to see if Proprietary is supported. In Proprietary SDK version 2.7.n, Connect is not supported on EFR32xG22.

##### Overview

Wireless Gecko supports all Wireless M-Bus PHY configurations, according to EN13757-4 (both directions in all cases):

- Mode S
- Mode T
- Mode R2
- Mode C
- Mode N (all indexes, index 3/9/12 only on Series 2)
- Mode F

Note that, currently, only EFR32xG23 supports Wireless M-Bus on Series 2.

For the RF performance of the above modes, see [AN1076: EFR32FG1x Wireless M-Bus Performance Measurement Results](https://www.silabs.com/documents/public/application-notes/an1076-efr32fg1x-wmbus-measurements.pdf).

In all modes, we support basic data link layer features for both frame format A and frame format B:

- Segmenting frames into blocks, and reassembling them to frame
- CRC calculation and checking
- Frame length decoding
- Data encoding and decoding (Manchester and 3 out of 6)
- Postamble transmission

The software is built on top of RAIL, therefore it inherits RAIL features that can be useful for implementing Wireless M-Bus, such as timestamping or scheduled reception and transmission.

The supplied example includes an easily reusable module that provides some useful features, including mode 5 (AES-128 with dynamic initialization vector) security.

Simplicity Studio 5, used with the Proprietary Flex SDK v3.x, introduced an updated radio configurator graphical user interface (GUI). The illustrations in [Using the Radio Configurator](03-using-the-configurator) have been updated. Places where the functionality diverges from that in Simplicity Studio 4, used with Flex SDK v2.x, are noted. This document applies to both variants.

This document is mainly about the examples provided through Simplicity Studio, which can be used as a guideline when developing a Wireless M-Bus stack or a very simple application. If you need a fully-featured Wireless M-Bus stack, it is commercially available from our 3rd party partner company. For more details, contact our sales team.

#### Limitations

##### T Mode Meter to Other Device (only for EFR32 Series 1)

While the hardware supports 3 out of 6 coding, EFR32 Series 1 cannot generate the postamble required by this mode (this does not matter in receive mode). For T Mode Meter to Other transmission on EFR32 Series 1, we recommend using the supplied encoder function (`WMBUS_phy_software()`), which calculates the CRC using the GPCRC peripheral, encodes the packet using a software based 3 out of 6 encoder, and adds the required postamble.

On EFR32 series 2, where Wireless M-Bus support is available (e.g. EFR32xG23), this feature is available from hardware. The software workaround is no longer recommended.

##### Select Frame Type Based on Sync Word

Modes C, N, and F support frame formats A and B, where the sync word selects the frame format. Receiving frame A and frame B with the same configuration is currently not supported. You can either:

- Set up the frameA configuration and receive only frame format A.
- Set up the frameB configuration and receive only frame format B.
- Manually create a multi-PHY configuration and switch between the configurations at runtime. However, you must decide which frame you expect before you switch to RX mode.
- Set up a custom C/N/F configuration with no frame coding option. In that case, you must decode the length and check CRC in software, but you can decide the frame type during reception as well.

Modes that support frame format B always have both sync words configured:

- FrameA and noFrame configurations have sync word 0 configured for frame type A and sync word 1 for type B.
- FrameB configurations have sync word 0 configured for frame type B and sync word 1 for frame type A.

You cannot receive frame type B with a frameA configuration or vice versa, but you can enable the second sync word in RAIL, and use the sync detect event to recognize that you are receiving something with the other frame type.

##### Decoder for Both C and T Mode Meter to Other

It is theoretically possible to receive mode C frames with a mode T configuration, because the first 10 bits of the sync word are the same. If the next 6 bits are a valid 3 out of 6 code, it is a T frame, and if the next 16 bits are the second part of mode C’s sync word, it is a C frame. Since the second part of mode C’s sync word is not a valid 3 out of 6 code, it is not possible that both conditions are true for a correctly formatted frame.

With the _WMbus TC M2O (100k, frameA)_ PHY, it is possible to receive mode T and mode C packets. When transmitting, this PHY always uses mode T. The `RAIL_WMBUS_Config` API can be used to enable the simultaneous RX option which makes it possible to receive mode C frame A/B and mode T frame type A packets.

Note, that with the T+C mode PHY, performance cannot be guaranteed. The PHY is based on the mode T PHY, so it should match the mode T performance, but this specific mode was not characterized.

#### Using the Radio Configurator

For Wireless M-Bus configurations, always use the Mbus Profile:

![Mbus Profile](/rail-wmbus-apps-with-efr32/0.1/images/an1119-mbus-profile.png)

##### Multi-PHY Configuration

The following modes require multiple PHYs:

- Mode T2 (bidirectional only)
- Mode C2 (bidirectional only)
- Mode N has a separate PHY for each bitrate (index 1-5-7-10; 2-6-8-11; 4-18 and 3-9-13). In the 2013 release of EN13757-4, the naming was different. See the tables in Recommended Configurations below.
- Modes C, N, and F have separate PHYs for frame formats A and B

The Radio Configurator can be used to set up virtual channels. For example, channel 0 can be used for _Mode T meter to other_ and channel 1 can be used for _Mode T other to meter_.

There are other possible uses, such as supporting all 868MHz based modes (S, T and C) with simple channel changes.

It is also possible to configure an application with multiple protocols as Wireless M-Bus modes. In order to change protocols RAIL_ConfigChannels must be used. This can be useful to select a mode during boot or configuration. For further details, if you are working with Proprietary Flex SDK v2.x see [AN971: EFR32 Radio Configurator Guide for RAIL in Simplicity Studio v4](https://www.silabs.com/documents/public/application-notes/an971-efr32-radio-configurator-guide.pdf). If you are working with Flex SDK v3.x see [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

The **Wireless M-bus Meter** example application is configured to support Mode T2 bidirectional mode using Multi-PHY configuration.

##### Recommended Configurations

###### For 868 MHz and 434 MHz bands

|Mode|Submode|Single PHY Configuration Name (frame A) (1)|Single PHY Configuration Name (frame B) (1)|Freq. (MHz)|
|---|---|---|---|---|
|Mode S|N/A|WMbus S (32.768k, Manchester)| |868.3|
|Mode T|Meter to Other, Rx|WMbus T M2O (100k, 3of6) (2)  WMbus T M2O, no postamble (100k, 3of6) (3)| |868.95|
| |Meter to Other, Tx|WMbus T M2O (100k, 3of6) (2)  WMbus T M2O (100k, no framing) (4)| |868.95|
| |Other to Meter|WMbus T O2M (32.768k, Manchester)| |868.3|
|Mode TC|Meter to Other|WMbus TC M2O (100k, frameA) (2) (5)| |868.95|
|Mode R2|N/A|WMbus R2 (4.8k, Manchester)| |868.33|
|Mode C|Meter to Other|WMbus C M2O frameA (100k) (6)|WMbus C M2O frameB (100k) (7)|868.95|
| |Other to Meter|WMbus C O2M frameA (50k) (6)|WMbus C O2M frameB (50k) (7)|869.525|
|Mode F|N/A|WMbus F, frameA (2.4k) (6)|WMbus F, frameB (2.4k) (7)|433.82|

**Notes**:

1. The names were changed from earlier releases to make them more uniform, but they always included the mode, the bitrate, and the frame type (where applicable)
2. Only for EFR32 series 2 with Wireless M-Bus support.
3. Only for EFR32 series 1. Could also work in Tx mode, but it does not generate the postamble required by the standard.
4. Only for EFR32 series 1. Should be used with the supplied software encoder (`WMBUS_phy_software()` function).
5. See [Decoder for Both C and T Mode Meter to Other](02-limitations#decoder-for-both-c-and-t-mode-meter-to-other) for details.
6. Sync word for frame format A is set up for sync word 0, sync word for frame format B is set up as sync word 1 but is not enabled by default. Receiving frame format B is not possible, but the sync detect event could be used.
7. Sync word for frame format B is set up for sync word 0, sync word for frame format A is set up as sync word 1 but is not enabled by default. Receiving frame format A is not possible, but the sync detect event could be used.

###### For the 169 MHz band (Mode N)

|Index (according to EN13757-4-2019)|Single PHY  configuration  (Frame A) (1,2)|Single PHY configuration (Frame B) (1,3)|Freq.  (MHz)|Channel  Spacing  (kHz)|Last channel number|
|---|---|---|---|---|---|
|1 (4)|WMbus N, index 1/5/7/10, frameA (2.4k)|WMbus N, index 1/5/7/10, frameB (2.4k)|169.40625|12.5|5|
|2 (5)|WMbus N, index 2/6/8/11, frameA (4.8k)|WMbus N, index 2/6/8/11, frameB (4.8k)|169.40625|12.5|5|
|3 (7)|WMbus N, index 3/9/12, frameA (6.4k)|WMbus N, index 3/9/12, frameB (6.4k)|169.41|12.5|5|
|4 (6)|WMbus N, index 4/13, frameA (19.2k)|WMbus N, index 4/13, frameB (19.2k)|169.4375|50|0|
|5|WMbus N, index 1/5/7/10, frameA (2.4k)|WMbus N, index 1/5/7/10, frameB (2.4k)|169.48125|12.5|0|
|6|WMbus N, index 2/6/8/11, frameA (4.8k)|WMbus N, index 2/6/8/11, frameB (4.8k)|169.48125|12.5|0|
|7|WMbus N, index 1/5/7/10, frameA (2.4k)|WMbus N, index 1/5/7/10, frameB (2.4k)|169.49375|12.5|7|
|8|WMbus N, index 2/6/8/11, frameA (4.8k)|WMbus N, index 2/6/8/11, frameB (4.8k)|169.49375|12.5|7|
|9|WMbus N, index 3/9/12, frameA (6.4k)|WMbus N, index 3/9/12, frameB (6.4k)|169.41|12.5|57|
|10|WMbus N, index 1/5/7/10, frameA (2.4k)|WMbus N, index 1/5/7/10, frameB (2.4k)|169.59375|12.5|17|
|11|WMbus N, index 2/6/8/11, frameA (4.8k)|WMbus N, index 2/6/8/11, frameB (4.8k)|169.59375|12.5|17|
|13|WMbus N, index 4/13, frameA (19.2k)|WMbus N, index 4/13, frameB (19.2k)|169.625|50|3|

**Notes**:

1. The names were changed from earlier releases to make them more uniform, but they always included the mode, the bitrate, and the frame type (where applicable)
2. Sync word for frame format A is set up for sync word 0, sync word for frame format B is set up as sync word 1 but is not enabled by default. Receiving frame format B is not possible, but the sync detect event could be used.
3. Sync word for frame format B is set up for sync word 0, sync word for frame format A is set up as sync word 1 but is not enabled by default. Receiving frame format A is not possible, but the sync detect event could be used.
4. Submodes, according to EN13757-4-2013, available on this index: N1c, N2c (on ch1); N1d, N2d (on ch3).
5. Submodes, according to EN13757-4-2013, available on this index: N1a, N2a (on ch0); N1b, N2b (on ch1); N1e, N2e (on ch4); N1f, N2f (on ch5).
6. Same as submode N2g in EN13757-4-2013.
7. Only available on EFR32 Series 2 with Wireless M-Bus support.

##### Using Custom Settings

All the above configurations (and more) can be set up using Custom settings. Currently, to use the multi-PHY features, you have to use custom settings for all but the first (virtual) channel.

![Custom Settings](/rail-wmbus-apps-with-efr32/0.1/images/an1119-custom-settings.png)

For details about the Wireless M-Bus custom setting parameters, see [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

##### Using Multi-PHY Features

The following procedure shows how to set up a T2 meter/collector on Series 2 as an example, using Simplicity Studio 5 and Flex SDK v3.x. The settings to use are the same as in earlier configurator versions, but the Multi-PHY configurator workflow changed significantly between Simplicity Studio 4 and Simplicity Studio 5. To apply these changes in Simplicity Studio 4, see [AN971: EFR32 Radio Configurator Guide for RAIL in Simplicity Studio v4](https://www.silabs.com/documents/public/application-notes/an971-efr32-radio-configurator-guide.pdf).

First, select the PHY you wish to use as channel 0 under the protocol setup. In the example, this would be M2O TRx setup, which is _WMbus T M2O (100k, 3 of 6)_.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-select-radio-phy.png)

With this, the default channel group is already set for Mode T M2O. All that remains is to set the channel numbering and the name.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-select-channel-numbering.png)

Create a new channel group by clicking the [C] control on the menu in the upper left and select the O2M TRx setup, which is _WMbus T O2M (32.768k, Manchester)_. Set the channel numbering so that channel 1 will correspond to this PHY.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-new-channel-config.png)

With this setup, a meter can transmit on channel 0 and receive on channel 1, while a collector can transmit on channel 1 and receive on channel 0.

#### The Wireless M-Bus Support Component

> **Note**: In Flex SDK 3.x, the component can be found under Flex/RAIL/Utility. In Flex SDK v2.x, the wmbus plugin was equivalent to this component.

This component provides the following features:

- Processes the packet before sending it, if needed. Currently needed for mode T meter to other only.
- Helper functions to get the timing in limited access mode.
- Helper functions to fill the payload with EN13757-3 compatible payload.
- Helper functions to encode/decode manufacturer field.
- Helper functions for cryptography using mbedTLS. Currently only supports mode5 (AES128-CBC with dynamic init vector).
- Helper types for data link and transport layer header.

For detailed documentation, see `sl_wmbus_support.h` (or in Flex v2.x `wmbus.h`), documented via Doxygen style.

In Flex 3.x, the component allows configuration of the wmbus mode used. This selects the timing provided to the application in limited access mode. If _T mode, Meter to Other_ is selected and the part requires it, it also enables the workaround described in [Limitations](02-limitations).

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-t-mode.png)

#### Example Application

The provided example application pair implements a very basic meter-collector interaction.

##### Meter

> **Note**: In Flex SDK 2.x, both TX_CHANNEL and the mode variable can be found in main.c.

The meter periodically sends synchronous SND-NR messages with some hardcoded value with mode 5 security. While waiting, it sleeps in EM2 in idle or EM1 if the main oscillator is required for scheduling or Rx mode. By default, the meter is configured for limited access mode (short receive window after transmission), but it doesn’t handle any received packets, it is just implemented to demonstrate the scheduling required for an application.

The application will always transmit on the channel defined by _TX_CHANNEL_ in app_init.h (0 by default). In symmetric modes (S, R2, N, F), _TX_CHANNEL_ is also used for reception. In asymmetric modes (T and C), _TX_CHANNEL+1_ is used for reception.

In Flex SDK 3.x, be sure to select the correct mode in the wireless M-bus support component configuration, as described in [The Wireless M-Bus Support Component](04-wmbus-plugin). In Flex SDK 2.x, the same configuration should be applied in the main.c file:

```sh
static const WMBUS_Mode_t mode = WMBUS_MODE_T_METER
```

The meter application also includes wmbus_sample_frame.c and .h, which can be used for guidance on how to assemble a simple wmbus frame.

###### Meter Peripherals

The meter example, depending on the devkit it is running on, implements various sensors:

- Virtual water meter sensor, which periodically increments.
- Pulse counter, which increments on button press of BTN0. In the M-Bus frame, this is transmitted as energy in watt-hours (Wh).
- Thermometer, which uses the on-board Si7021 to get temperature measurements.

The latter two are only available on development kits which have the required peripheral.

On FG23-DK2600, the 5-digit 7-segment LCD shows the measurement of one of the sensors. The active sensor can be selected by pressing BTN1.

![image](/rail-wmbus-apps-with-efr32/0.1/images/an1119-meter.png)

The meter device enters EM2 sleep when in idle. It provides a command line interface on serial port at 9600 baud, to allow it to work in EM2 sleep. On the command line interface, the active sensor can be selected.

##### Collector

The collector prints the received packet on serial terminal, with some information (like the first block) detailed. If the packet is EN13757-3 compatible with the short header, it also decodes mode5 security, if required.

Once the meter and collector are running, the collector should print messages like this to the serial terminal:

```sh
RX:[Time:163580960]
Block-1:[L:30,C:0x44,M:SIL,ID:00000001,Version:0x01,devType:0x07]
AppHeader:[CI:0x7A,AccessNr:60,Status:0x00,encMode:5,Accessibility:02,encBlocks:1,sync:1]
[0x2F 0x2F 0x04 0x13 0x39 0x30 0x00 0x00 | 0x02 0x3B 0x7B 0x00 0x2F 0x2F 0x2F 0x2F]
```

A Wireless M-Bus sniffer can also be used. In that case, the default crypto key used by the application is:

`00112233445566778899AABBCCDDEEFF.`

For unencrypted packets, RAILTest also can be used as a sniffer with the right meter to another device to receive configuration.

#### Changing the Mode of the Example

This section provides summary instructions on changing the mode of the meter example. Full details on the Radio Configurator workflow are provided in [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

##### Changing to a Symmetric Configuration

Because the default modeT configuration requires a multi-PHY setup, you would need to remove all the channel overrides to completely undo it. A simpler way is to add a new protocol with the "P" control in the Radio Configurator, and remove the old one later.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-radio-config-controls.png)

On the new protocol, select the Mbus Profile, and the PHY you want, for example _WMBus S (32.768k, Manchester)_.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-general-settings.png)

Save the config, which will generate its files. Next, open the configuration of the _Wireless M-bus support_ component.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-open-wireless-mbus-support.png)

Set the mode to match the Radio Configurator.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-set-mode.png)

Remove the old protocol with the "X" control.

This changes the timing of the application according to EN13757-4 and, for EFR32 Series 1, removes the software coder needed for mode T. When a symmetric mode is selected, it also sets up the software to use the same channel for Tx and Rx.

##### Changing to an Asymmetric Configuration

For an asymmetric configuration, follow the same steps as above to configure the Tx PHY. For example, for modeC, set the Radio Configurator for _WMbus C M2O frameA (100k)_ and set the component configuration to _C mode_.

However, you must also set up an Rx configuration for channel 1. First, open the Radio Configurator again, and set the _stop channel No._ of the Tx PHY to 0.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-stop-channel.png)

The original setting was 20, but in a symmetric config this does not matter because only channel 0 is used, when the mode in the component is configured correctly.

Next, click the "C" control to add a new Channel Group, and set both its start and stop channel to 1 (although, technically, the latter is not needed).

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-stop-channel-2.png)

Select the new channel group and enable customization. Because the radio configurator only supports a single preconfigured PHY in channel-based Multi-PHY, which is the most effective method for this setup, you must manually configure this PHY for modeC O2M.

Finally, set up the following PHY parameters, according to EN13757-4:

- Base Frequency
- Mbus Frame Format
- Mbus Mode
- Symbol Encoding
- Preamble Length Total
- MBus Postamble Length

You can also create a new protocol set up to the O2M config and copy the settings from there. For example, the following figure shows the settings for ModeC.

![screenshot](/rail-wmbus-apps-with-efr32/0.1/images/an1119-new-protocol.png)

Save the changes in the Radio Configurator. Since the mode is already set up in the component, the configuration change is complete, and you can compile and use the project.

## Training

### RAIL Training Overview

The training section provides a series of documentation that helps developers
learn the basics of RAIL.

The contents here are intended for embedded C developers who are already
somewhat familiar with the platform and development tools,  e.g. the [Getting
Started](/rail/3.1.0/rail-getting-started-overview/) section.

While the section is written for firmware developers, as proprietary wireless
often requires knowledge on the physical layer, some knowledge on the topic is
required, or at least highly recommended. The radio configurator, where the
physical layer can be configured is documented in
[Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

Note that the pages here are not automatically updated with every SDK release.
If there's a conflict between these articles and the [RAIL API
documentation](/rail/3.1.0/rail-api/), always trust the API
documentation. If you find an issue, please let us know on our
[community](https://community.silabs.com).

#### Getting Started with RAIL

You should start with these tutorials. All others are based on these, as these
are the minimum to develop useful applications on RAIL.

- [Introduction, RAIL components and the Empty  
  Example](/rail/3.1.0/rail-training-intro)
- [Transmitting a Packet](/rail/3.1.0/rail-training-tx)
- [Event Handling and Automatic State  
  Transitions](/rail/3.1.0/rail-training-event)
- [Downloading received  
  messages](/rail/3.1.0/rail-training-trx)
- [Time, Timestamping and  
  Scheduling](/rail/3.1.0/rail-training-timestamping)

#### Basics

These articles are common and basic features. While technically not required
for basic functionality, it's highly recommended to read them before developing
any production quality project.

- [Debugging](/rail/3.1.0/rail-training-debugging): Debug features of RAIL, and recommended methods of debugging RAIL applications
- [Calibrations](/rail/3.1.0/rail-training-calibration): Calibrations controllable from RAIL
- [Power Manager integration](/rail/3.1.0/rail-training-power-manager): How RAIL Integrates with Power Manager
- [Idle Modes](/rail/3.1.0/rail-training-idle): The explanation of various parameters of `RAIL_Idle()`.

#### Further Topics

These articles document some specific features of RAIL that some applications
need. It is recommended to read them if you think you will need that feature.

- [Timer Synchronization and  
  Sleep](/rail/3.1.0/rail-training-timersync): How RAIL can  
  keep time in EM2 with the help of the RTCC
- [Tx/Rx Options](/rail/3.1.0/rail-training-trx-options) -  
  The various options available for Rx and Tx. Mainly, Listen Before Talk and  
  Address Filtering
- [Low duty cycle  
  mode](/rail/3.1.0/rail-training-low-duty-cycle): The  
  theory of duty cycling, a way to save energy on the Rx side by sacrificing  
  some on the Tx side.
- [Interrupt and Thread  
  Safety](/rail/3.1.0/rail-training-low-duty-cycle): While  
  RAIL is, in general not thread safe, you actually only need to avoid specific  
  operations, which are detailed here.
- [Understanding RAIL Config  
  Files](/rail/3.1.0/rail-training-railcfg): Basic  
  explanation of the various varibles in `rail_config.c`

#### Multiprotocol

Multiprotocol is a complex topic, and it is recommended only if you have a good
understanding of RAIL's basic functionality. This section describes both dynamic
multiprotocol capabilities and MultiPHY capabilities.

- [Introduction](/rail/3.1.0/rail-training-dmp-intro):  
  Explanation of Multiprotocol and MultiPHY, and recommendation what to use for  
  given problem.
- [MultiPHY  
  Usecases](/rail/3.1.0/rail-training-multiphy-examples):  
  Explanation of MultiPHY through the most typical usecases
- [DMP](/rail/3.1.0/rail-training-dmp): A short introduction  
  of Dynamic Multiprotocol, highlighting the differences between Single protocol  
  and Multiprotocol usage of RAIL.

### Getting Started

#### Introduction, RAIL components, and the Empty Example

##### What is RAIL?

RAIL is short for Radio Abstraction Interface Layer, and is the most direct
interface available for EFR32 radios. You can think of it as a radio driver.
While this sounds like a restriction, this actually makes software development
for proprietary wireless much simpler:

- EFR32 has a very flexible radio, which also makes it quite complex. RAIL (and  
  the radio configurator) provides an easy-to-use interface of EFR32's features.
- The various generations of EFR32s are slightly different, but the RAIL API is  
  the same (except maybe the chip specific updates), which makes hardware  
  updates almost seamless.
- We plan to add RAIL support to all of our future wireless MCUs.

RAIL application development is currently possible in the SiSDK in Simplicity
Studio. To progress further with this tutorial, please **remember to open the
[RAIL API documentation](/rail/3.1.0/rail-api/)**.

###### When to Use RAIL?

If you have an existing protocol, and you must be compatible with it, you'd
probably have to use RAIL (as all of our stacks use a standardized frame
format).

If you want to use sub-GHz communication, you have a few options, including
RAIL. For simple point to point communication, RAIL might be the simplest
solution. However, as soon as you need security or addressing, it might be
better choose a protocol stack, such as [Connect](/connect-stack/).

RAIL also has the benefit that it adds the least amount of delays to all radio
events. In fact, some event notification will happen in interrupt context.

###### What is Covered by RAIL?

RAIL only supports what the radio hardware supports. For example, auto ACK and
address filter is available, as the hardware provides support for it. On the
other hand, while security is important for wireless communication, it's not
really a radio task, hence RAIL does not support it. The crypto engine is an
independent peripheral that can be used to encrypt payloads before giving them
to RAIL and the radio hardware.

##### Supported Energy Modes

EM1p or higher is required for the radio to be operational (i.e., Transmitting,
receiving, or waiting for packets, RAIL timer running from HF clock). On devices
without EM1p support, EM1 is required for the radio. See [EFR32 Migration Guide for Proprietary Applications](/rail/3.1.0/efr32-migration-guide-for-proprietary-apps) for more details on EM1p.

EM2 or higher is required for RAIL scheduling or timers. In this mode, timers
are running from LF clock, which needs configuration. This is configured by
default in our examples, and will be discussed [in a later
article](/rail/3.1.0/rail-training-timersync) in detail.

EM3 or higher is required for RAIL to work without re-initialization.

##### Writing Code from Scratch

We do not recommend writing code from scratch because it is much simpler to have
something existing that sets up the include paths and linker settings correctly.
The best way to start is the example _RAIL - SoC Empty_.

##### RAIL Components

The empty application includes the following RAIL related components (under
'Platform/Radio'):

- _RAIL Library, Single Protocol_, which is the library itself
- _RAIL Utility, PA_, which configures and initializes the power  
  amplifier
- _RAIL Utility, Initialization_, which initializes RAIL and loads an initial  
  configuration
- _RAIL Utility, Callbacks_, which currently only implements the assertion callback
- _RAIL Utility, PTI_, which enables Packet Trace Interface, the hardware that feeds data to the Network Analyzer
- _RAIL Utility, RSSI_, which compensates the RSSI offset error (and can be fine tuned)

And a few other RAIL components, that are useful if you plan to use a RAIL-supported protocol, like IEEE 802.15.4.

There are a few components that you might want to install:

- _RAIL Utility, DMA_, which allocates a DMA channel to speed up RAIL initalization
- _Radio Utility, Front End Module_, which can be used to drive a FEM (or  
  external PA/LNA), if your HW uses one
- _RAIL Utility, RF Path_, which can be used to select the antenna path on the  
  parts that have multiple (like EFR32xG23)

If you work on a starter kit, you don't need to change the configuration of most
of these components, except the Initialization component. However, the
initialization component also includes a good starting point, that we don't need
to modify for simple applications.

##### The Radio Configurator

The Radio Configurator is accessible by configuring the component _Advanced
Configurators/Radio Configurator_. The usage of the radio configurator is out of
scope for this tutorial series. For more details, see [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

##### The Project Structure

Projects always include the following parts:

- **autogen** folder: Only the autogen folder includes generated code. It  
  includes the PHY configuration (`rail_config.c`), init code, the linker  
  script, and other generated code used by components, like the command  
  descriptors for the CLI interface
- **config** folder: Component configuration headers are placed into this  
  folder. These can be edited with the Component Editor that can be opened on  
  the Project Configurator via the Configure button, but directly editing the  
  header file is also possible. The input of the radio configuration is also  
  here, in `rail/radio_settings.radioconf`
- **simplicity_sdk** folder (with version number): Source and binary files added by  
  components
- **files in the root folder**: Only the application specific files should be in  
  the root folder, including source files, the project configurator (`.slcp`  
  file) the Pin tool (`.pintool` file) and a readme file.

![Project Structure](/rail-training-intro/0.1/images/project-v6.png)

Note that all files related to the project should be visible in the project
explorer, including header and library files.

###### Where to Add User Code

All projects include `main.c`, which is not recommended to modify. Instead, add
the initialization code to `app_init.c`, and implement the main loop in
`app_process.c`. This way, the _System_ components can initialize components,
and call the "process" function of the components that requires this.
Additionally, enabling an RTOS will convert app_process's main loop into an RTOS
task.

##### Conclusion

This project is ready to send out frames. We're going to do that in the [next
part](/rail/3.1.0/rail-training-tx).

#### Transmitting a Packet

This tutorial is the continuation of a series started with
[Introduction](/rail/3.1.0/rail-training-intro).

Please read it first if you haven't.

The completed example for this article is available on
[GitHub](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_transmit).
You can either import this example, as documented in the readme on Github, or
follow this article and modify a **RAIL - SoC Empty** example. Note that the
code snippets here just like the code on Github is missing a lot of error
handling for easier readability. Therefore, it shouldn't be used as a base of
development.

---

In this tutorial, we're going to modify the project _RAIL - SoC Empty_ to
transmit a packet. We're going to use the default, fixed length 16 Bytes payload
configuration first.

This tutorial references some more advanced articles - we don't recommend
reading them yet if you just started learning RAIL. They are only linked to
highlight the connection.

> Code snippets in this example are for illustration only. Refer to the attached
> files for reference code.

##### Buffer Handling

###### Setting Up the Packet Buffer

RAIL requires a buffer (usually called FIFO) to be configured for Tx. First, we
have to allocate some memory for that buffer:

```c
#define SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH         256
SL_RAIL_DECLARE_FIFO_BUFFER(tx_fifo, SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH);
```

On all Series 2 chips, except EFR32xG21, RAIL requires a 4 bytes aligned FIFO.
In the code above, we used `SL_RAIL_DECLARE_FIFO_BUFFER` which guarantees good
alignment on any EFR32.

The Tx buffer can hold more than one packet, which can be useful if you need to
send out a lot of messages quickly. To load the payload of the packet to the
buffer, we have two options: write it via RAIL APIs or write to the memory
directly.

Note, that the transmitted packet size can be bigger than the FIFO, but that
requires special care, that will be detailed in a [later
tutorial](/rail/3.1.0/rail-training-special-data-modes).

###### Writing to the Buffer Directly

In `app_process.c`:

```c
#define SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH 16
#define SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH 256
uint8_t payload[SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH] =
    {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0F};

SL_RAIL_DECLARE_FIFO_BUFFER(tx_fifo, SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH);

void load_payload_directly(sl_rail_handle_t rail_handle) {
  memcpy(tx_fifo,
         payload,
         SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH);
  sl_rail_set_tx_fifo(rail_handle,
                      tx_fifo,
                      SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH,
                      SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH,
                      0);
}
```

The `memcpy()` is just a standard C function to write to buffers, and we use
`sl_rail_set_tx_fifo()` to pass that buffer to RAIL. We also tell RAIL how long
the buffer is, how much data it has already in it, and the start position of the
TX data from the FIFO base address.

![Tx direct write](/rail-training-tx/0.1/images/tx-buffer-fifo-direct.png)

Note : This illustrates the simple case of one `sl_rail_set_tx_fifo()` call. In
effect, different buffers are used for Rx and Tx.

###### Writing to the Buffer Indirectly

In `app_init.c`:

```c
#define SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH         256
SL_RAIL_DECLARE_FIFO_BUFFER(tx_fifo, SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH);

void app_init(void)
{
  sl_rail_handle_t rail_handle = sl_rail_util_get_handle(SL_RAIL_UTIL_HANDLE_INST0);

  sl_rail_set_tx_fifo(rail_handle, tx_fifo, SL_TUTORIAL_TRANSMIT_BUFFER_LENGTH, 0, 0);
}
```

In `app_process.c`:

```c
#define SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH 16
uint8_t payload[SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH] =
    {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0F};

static void load_payload_indirectly(sl_rail_handle_t rail_handle) {
  sl_rail_write_tx_fifo(rail_handle,
                        payload,
                        SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH,
                        false);
}
```

In this case, we pass the buffer to RAIL when it's still empty, and we write to
that buffer using a RAIL API. Note that using `memcpy()` instead of
sl_rail_write_tx_fifo would not work: while it would write the memory itself, it
wouldn't change the read and write pointers of the FIFO, handled by RAIL, so
RAIL would still think the buffer is empty.

![Tx direct write](/rail-training-tx/0.1/images/tx-buffer-fifo-indirect.png)

###### Direct or Indirect

There are four main factors that could decide which method to use to write the
FIFO:

- With indirect mode, the buffer can be used for partial packets. It is simpler  
  to use for multiple packets. Buffer wrapping is also supported internally by  
  RAIL.
- _Calling `sl_rail_set_tx_fifo()` does not move any memory_, just sets a few  
  registers, while calling _`sl_rail_write_tx_fifo()` does need some time to  
  copy the payload to_ _the buffer_.
- _Calling `sl_rail_set_tx_fifo()` is not allowed during transmission._ Whereas  
  using sl_rail_write_tx_fifo() is safe to use, even when radio transmission is  
  occurring.
- Indirect mode clearly separates init and process code.

For simpler applications, `sl_rail_set_tx_fifo()` can be a better option. If you
want to send almost the same packet, with just a few bytes modification, it's
much better, since you don't have to write the whole packet again. (Note that if
you want to transmit the _exact_ same message over and over, you should use
`SL_RAIL_TX_OPTION_RESEND`, detailed in a [later
article](/rail/3.1.0/rail-training-trx-options)).

On the other hand, the separation in RAIL examples between app_init and
app_process works nicely with the indirect method, and in most real cases, you
need to move memory anyway. If you must start transmitting before you can
construct the whole packet, you must use `sl_rail_write_tx_fifo()`, as you can
call it during transmit. It's also useful if you want to send out a lot of
packets: Use `sl_rail_write_tx_fifo()` to load each message one after the other,
then send them out quickly without any buffer operation.

The attached code uses indirect mode mainly for the clear separation.

###### FIFO Reset

The last parameter of `sl_rail_write_tx_fifo` can reset the FIFO, which means it
will invalidate the data already in there. This is also possible with
`sl_rail_reset_fifo`.

It's a good idea to run some tests without resetting the FIFO,
as it can mask small errors, e.g., writing more to the FIFO than needed.
However, in production, it's a good idea to reset the FIFO if you think it
should be empty, as in production, masking errors are beneficial.

##### Transmitting the Packet

Starting the transmission is simple:

```c
sl_rail_start_tx(rail_handle, 0, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);
```

This instructs RAIL to start transmitting the data stored in the FIFO on channel
0 (second parameter). The third parameter can change various options, like using
the second configured sync word (see an [article on the
topic](/rail/3.1.0/rail-training-trx-options)). The last
parameter is only required for [DMP (dynamic multiprotocol)
mode](/rail/3.1.0/rail-training-dmp).

##### Changing the Packet Length

You can change the configured fixed length on the Radio Configurator, but that's
obviously not possible at runtime, which is often needed. **Note that the amount
of data loaded into the FIFO does not matter as long as it's equal to or greater
than the length of the frame.**

###### Changing Packet Length with a Fixed Length Configuration

With the API `sl_rail_set_fixed_length()`, it's possible to change the
pre-configured length (stored in rail_config.c) at runtime. Note that this
changes the length of the packets on the Rx side as well. If you want to return
to the pre-configured value, you can use `sl_rail_set_fixed_length(rail_handle,
SL_RAIL_SETFIXEDLENGTH_INVALID)`.

![Tx fixed frame payload](/rail-training-tx/0.1/images/tx-fixed-frame-payload-v6.png)

###### Using Variable Length Configurations

A lot of protocols store the length of the packet in the header of the frame.
For example, in IEEE 802.15.4, the first byte stores the length (and the maximum
is 127). To set this up, use the following settings in the Radio Configurator:

- Set _Frame Length Algorithm_ to _VARIABLE_LENGTH_
- This automatically enables the _Header_
- Set the length of the header to _1_
- Set variable length bit size to _8_
- Set the maximum length to _127_

![Tx fixed frame payload](/rail-training-tx/0.1/images/tx-variable-frame-payload-v6.png)

For more information on this setup, and on more advanced variable length
configs, see
[Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).
Note that the above configuration is not fully IEEE 802.15.4 compatible to make
it simpler.

Length decoding works the same way for **both Rx and Tx**. This means that
during Tx, we have to make sure that the committed length in the header matches
the number of bytes you load into the FIFO. It also means that if we set the
length field to more than 127, we will get a transmit error.

This would be a valid 16 bytes frame, both for the above described variable
length and 16 bytes fixed length mode, so this is used in the attached sample
code:

```c
uint8_t payload[SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH] =
    {SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH-1, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
     0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0F};
```

We use `SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH-1` in the length field, since the 1 byte length field
itself shouldn't be counted.

The routine `sl_rail_set_fixed_length()` is available in variable length mode,
and it changes the radio to fixed length operation (again, both for Rx and Tx).
Calling `sl_rail_set_fixed_length(rail_handle, SL_RAIL_SETFIXEDLENGTH_INVALID)`
will restore it to variable length mode.

##### Setting up the Example

###### Button Handling

The [linked
example](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_transmit)
sets the tx fifo on init, loads, and sends the packet on any button press. This
is implemented using the
[**Simple Button**
component](https://docs.silabs.com/gecko-platform/latest/platform-driver/simple-button)
on **btn0**, and implementing its callback:

In `app_process.c` (to get access to the button instance, now declared in
`autogen/sl_simple_button_instances.h`):

```c
#include "sl_simple_button_instances.h"
```

Also add the button callback code (the callback is already declared in
`sl_button.h`):

```c
void sl_button_on_change(const sl_button_t* handle){
  if ( sl_button_get_state(handle) == SL_SIMPLE_BUTTON_PRESSED ){
      send_packet = true;
  }
}
```

> By default, the Simple Button is configured for a pin which matches the
> development kit's PB0 button.

Since this callback is in interrupt context, we avoid using RAIL API directly.
It is safe in almost all cases, but calling `sl_rail_start_tx()` from interrupt
context [should be done
carefully](/rail/3.1.0/rail-training-thread-safety). Instead,
we set the volatile `send_packet` variable to true, and call RAIL APIs from
`app_process_action()` only:

```c
void app_process_action(void)
{
  if (send_packet) {
    sl_rail_handle_t rail_handle = sl_rail_util_get_handle(
                                   SL_RAIL_UTIL_HANDLE_INST0);

    send_packet = false;
    // Increment the last byte of the payload
    payload[SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH - 1]++;
    sl_rail_write_tx_fifo(rail_handle,
                          payload,
                          SL_TUTORIAL_TRANSMIT_PAYLOAD_LENGTH,
                          false);
    sl_rail_start_tx(rail_handle,
                     SL_TUTORIAL_TRANSMIT_DEFAULT_CHANNEL,
                     SL_RAIL_TX_OPTIONS_DEFAULT,
                     NULL);
  }
}
```

In the above snippet, we're also incrementing the last byte of the payload
before every transmit.

##### Conclusion

We didn't care about possible errors generated by RAIL: we do that [next
time](/rail/3.1.0/rail-training-event), which also provides
hints for receiving packets.

##### API Introduced in this Article

###### Functions

- [sl_rail_set_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-tx-fifo)
- [sl_rail_write_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-write-tx-fifo)
- [sl_rail_reset_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-reset-fifo)
- [sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx)
- [sl_rail_set_fixed_length()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-set-fixed-length)

###### Types and enums

- [SL_RAIL_TX_OPTIONS_DEFAULT](/rail/3.1.0/rail-api/transmit#sl-rail-tx-options-default)
- [SL_RAIL_SETFIXEDLENGTH_INVALID](/rail/3.1.0/rail-api/radio-configuration#sl-rail-set-fixed-length-invalid)

#### Event Handling and Automatic State Transitions

This tutorial is the continuation of a series started with the article
[Introduction](/rail/3.1.0/rail-training-intro). The previous
chapter was about [transmitting a
packet](/rail/3.1.0/rail-training-tx).

Please read them first if you haven't.

The completed example for this article is available [on
GitHub](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_event_handling).
You can either import this example, as documented in the readme on Github, or
follow this article and modify the example from the [previous
article](/rail/3.1.0/rail-training-tx).

---

In the previous tutorials, we set up RAIL to do various tasks through API
commands. However, RAIL can inform the application on various events almost real
time (basically, wiring interrupts through RAIL). So let's improve what we had
in the previous tutorial.

##### The Event Handler Function

You might have already seen this function in `app_process.c`:

`void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)`

This is the event handler function, which is called by the RAIL library, and
routed through the **RAIL Utility, Initialization** component.

The `events` variable is a bit field, holding all possible events. Be careful,
this bit field does not fit into a 32-bit variable, which is the size of the
`int` on EFR32 MCUs.

The event handler should be prepared for multiple events in a single call.
There's no "clearFlag" mechanism. Each event will be signaled once, and the
application is responsible for handling it.

Keep in mind that almost all events are generated from interrupts, so the event
handler is usually running from interrupt context (i.e., interrupts are
disabled, unless interrupt priorities are configured). Therefore, the event
handler should run fast; if you have to do something that takes more time, set a
flag, and do it from the main loop.

You should also be careful with RAIL interrupt safety. Calling state changing
APIs (`sl_rail_start*`, `sl_rail_stop*` or `sl_rail_idle`) from the interrupt
handler is allowed, but we recommend to read [the interrupt safety
article](/rail/3.1.0/rail-training-thread-safety) before
doing so.

The events enabled by default are configured on the **RAIL Utility,
Initialization** component (under **Platform/Radio**, press **Configure**):

![Event Configuration](/rail-training-event/0.1/images/event-config-v6.png)

However, using the RAIL API directly is actually simpler than using the event
configuration capabilities of this component. The API for this is
`sl_rail_config_events()`. You can keep the event setup enabled; it doesn't
really matter.

`sl_rail_config_events()` has a `mask` and an `events` parameter, making it
simple to configure multiple events at the same time; e.g., to enable or disable
a single event, leaving the others untouched:

```c
//disable SL_RAIL_EVENT_TX_PACKET_SENT
sl_rail_config_events(rail_handle, SL_RAIL_EVENT_TX_PACKET_SENT, 0);

//enable SL_RAIL_EVENT_TX_PACKET_SENT
sl_rail_config_events(rail_handle, SL_RAIL_EVENT_TX_PACKET_SENT, SL_RAIL_EVENT_TX_PACKET_SENT);
```

RAIL also defines a few event groups (defined in `sl_rail_types.h`, the most
useful are:

- `SL_RAIL_EVENTS_ALL` includes all the events
- `SL_RAIL_EVENTS_NONE` includes no events (equivalent to 0)
- `SL_RAIL_EVENTS_TX_COMPLETION` includes all possible events after a successful  
  `sl_rail_start_tx()`
- `SL_RAIL_EVENTS_RX_COMPLETION` includes all possible events that can result in  
  state transition from Rx mode

This can be used, for example, to disable or enable group of events:

```c
//disable all events
sl_rail_config_events(rail_handle, SL_RAIL_EVENTS_ALL, 0);

//enable all events
sl_rail_config_events(rail_handle, SL_RAIL_EVENTS_TX_COMPLETION, SL_RAIL_EVENTS_TX_COMPLETION);
```

If you enable/disable events in group, it's a good practice to create similar
macro group of events in your application.

Note that enabling all events is not recommended. Some events - depending on
the radio config - might happen very often, and even if you don't do anything on
that event in the handler, just the execution of the event handler takes some
CPU time.

RAIL has no API to flush pending events, but disabling and enabling them will
have that result:

```c
//flush SL_RAIL_EVENT_TX_PACKET_SENT
sl_rail_config_events(rail_handle, SL_RAIL_EVENT_TX_PACKET_SENT, 0);
sl_rail_config_events(rail_handle, SL_RAIL_EVENT_TX_PACKET_SENT, SL_RAIL_EVENT_TX_PACKET_SENT);
```

However, you only need to do this in rare cases. Enabling events is not like
unmasking interrupts. Enabling them will not trigger the event handler on past
events.

##### Tx Error Handling

In the last tutorial, we sent out a frame, but we didn't check the results
because it would have needed the event handler. Let's do the following:

- Toggle led0 on success (Tx or Rx)
- Toggle led1 on error (StartTX, Rx or Tx error)

> Nb: at startup, all leds are set off by the stack.

First, for the LEDs, enable the [_Simple
LED_](https://docs.silabs.com/gecko-platform/latest/platform-driver/simple-led)
component with _led0_ and _led1_ instances.

In `app_process.c` (to get access to the led instances, now declared in
`autogen/sl_simple_led_instances.h`):

```c
#include "sl_simple_led_instances.h"
```

For the actual radio related changes, we'll need to enable the success and error
events. We can do that during init since we don't really need to disable
anything at runtime for such simple applications:

```c
void app_init(void)
{
  //...
  sl_rail_config_events(rail_handle, SL_RAIL_EVENTS_ALL, SL_RAIL_EVENTS_TX_COMPLETION);
}
```

Next, let's check for errors returned by the sl_rail_start_tx call:

```c
sl_rail_status_t status = sl_rail_start_tx(rail_handle, 0, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);
if ( status != SL_RAIL_STATUS_NO_ERROR ) {
  sl_led_toggle(&sl_led_led1);
}
```

Finally, let's check the events for success and errors:

```c
void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  (void)rail_handle;
  if ( events & SL_RAIL_EVENTS_TX_COMPLETION ) {
    if ( events & SL_RAIL_EVENT_TX_PACKET_SENT ) {
      sl_led_toggle(&sl_led_led0);
    } else {
      sl_led_toggle(&sl_led_led1); //all other events in SL_RAIL_EVENTS_TX_COMPLETION are errors
    }
  }
}
```

With this, you should see led0 toggling on every transmitted packet.

Note that the example on Github has more error handling added to it, e.g., the
return value of `sl_rail_set_tx_fifo()` is also checked.

##### Receiving Packets

Let's add receive capabilities to this application! Again, use led0 to report
success and led1 for errors.

First, we need to modify the init code.

In `app_init.c` (to get access to the led instances):

```c
#include "sl_simple_led_instances.h"
```

We need Rx success/error events enabled, and we need to start the radio in Rx
mode:

```c
void app_init(void)
{
  //...

  sl_rail_status_t status = sl_rail_config_events(rail_handle,
                                                  SL_RAIL_EVENTS_ALL,
                                                  SL_RAIL_EVENTS_TX_COMPLETION
                                                  | SL_RAIL_EVENTS_RX_COMPLETION);
  if (status != SL_RAIL_STATUS_NO_ERROR) {
    // Turn led1 ON on ConfigEvents Error
    sl_led_toggle(&sl_led_led1);
  }
  status = sl_rail_start_rx(rail_handle,
                            0,
                            NULL);
  if (status != SL_RAIL_STATUS_NO_ERROR) {
    // Turn led1 ON on StartRx Error
    sl_led_toggle(&sl_led_led1);
  }
}
```

The API `sl_rail_start_rx()` is similar to Tx. The second argument of the
function indicates which channel is going to be used.

Finally, let's check the events for success and errors (in `app_process.c`):

```c
#include "sl_simple_led_instances.h"

//...

void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  //...
  if ( events & SL_RAIL_EVENTS_RX_COMPLETION ) {
    if ( events & SL_RAIL_EVENT_RX_PACKET_RECEIVED ) {
      sl_led_toggle(&sl_led_led0);
    } else {
      sl_led_toggle(&sl_led_led1); //all other events in SL_RAIL_EVENTS_RX_COMPLETION are errors
    }
  }
}
```

##### Automatic State Transitions

By default, after receiving or transmitting a packet, RAIL will switch to idle
mode (i.e., turn off the radio). Since we want it to keep receiving future
packets, we can use RAIL's auto state transition feature. This can be configured
on the _RAIL Utility, Initialization_ component, let's set all dropdowns to
_RX_:

![Auto State transitions](/rail-training-event/0.1/images/auto-state-transition-v6.png)

We're basically saying that after the packets are received/transmitted, we want
to return to Rx. These configurations can be also changed in run-time, using the
`sl_rail_set_rx_transitions()` and `sl_rail_set_tx_transitions()` APIs.

If you compile and flash the program after this modification, you should see
that now both WSTK toggles led0 on _every_ button press.

The following illustrates a high level flowchart of the radio controller:

![Radio controller high level flowchart](/rail-training-event/0.1/images/rail-flow-chart.png)

Note that in the Tx state, calling `sl_rail_idle()` will operate a transition to
the radio OFF state.

##### Testing and Conclusion

If you install this example to two boards (make sure you attach the antennas if
you use sub-GHz kits on sub-GHz config), you will see that on the press of btn0
on either device, led0 on both devices toggle. However, we can't see what we're
receiving, since we never actually download the messages.

We're going to fix this [next
time](/rail/3.1.0/rail-training-trx).

##### API Introduced in this Article

###### Functions

- [sl_rail_config_events()](/rail/3.1.0/rail-api/events#sl-rail-config-events)
- [sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)
- [sl_rail_set_rx_transitions()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-rx-transitions)
- [sl_rail_set_tx_transitions()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-tx-transitions)

###### Types and Enums

- [sl_rail_events_t](/rail/3.1.0/rail-api/events#sl-rail-events-t)
- [SL_RAIL_EVENTS_ALL](/rail/3.1.0/rail-api/events#sl-rail-events-all)
- [SL_RAIL_EVENTS_TX_COMPLETION](/rail/3.1.0/rail-api/events#sl-rail-events-tx-completion)
- [SL_RAIL_EVENTS_RX_COMPLETION](/rail/3.1.0/rail-api/events#sl-rail-events-rx-completion)
- [SL_RAIL_EVENTS_NONE](/rail/3.1.0/rail-api/events#sl-rail-events-none)
- [SL_RAIL_EVENT_TX_PACKET_SENT](/rail/3.1.0/rail-api/events#sl-rail-event-tx-packet-sent)
- [SL_RAIL_EVENT_RX_PACKET_RECEIVED](/rail/3.1.0/rail-api/events#sl-rail-event-rx-packet-received)

#### Downloading Received Messages

This tutorial is the continuation of a series started with the article
[Introduction](/rail/3.1.0/rail-training-intro). The previous
chapter was about [Event Handling and Automatic State
Transitions](/rail/3.1.0/rail-training-event).

Please read them first if you haven't.

The completed example for this article is available on
[GitHub](https://github.com/SiliconLabs/proprietary_rail/tree/master/rail_tutorial_downloading_messages).
You can either import this example, as documented in the readme on Github, or
follow this article and modify the example from the [previous
article](/rail/3.1.0/rail-training-event).

---

In the previous tutorial, we had both transmit and receive working, but we
couldn't see what we received. This tutorial will solve that problem.

We're also adding calibrations, which is recommended for all projects.

_You can find a SimpleTRX example in Simplicity Studio, which has a similar
purpose. However, the result of this tutorial will be somewhat different.
Mainly, this tutorial is not very pedantic on checking errors returned by all
functions, to make it easier to understand. However, we highly recommend
checking all possible errors, therefore using the SimpleTRX example in Studio as
a reference._

##### Enabling Calibrations

All calibrations are enabled by default in **RAIL Utility, Initialization** as
depicted below, but require some application code to perform them.

![RAIL utility calibration](/rail-training-trx/0.1/images/rail-utility-calib-v6.png)

First, we need to add the related event during initialization to enable it (in
`app_init.c`):

```c
void app_init(void)
{
  //...
  sl_rail_status_t status = sl_rail_config_events(rail_handle, SL_RAIL_EVENTS_ALL,
                                                  SL_RAIL_EVENTS_TX_COMPLETION
                                                  | SL_RAIL_EVENTS_RX_COMPLETION
                                                  | SL_RAIL_EVENT_CAL_NEEDED);
  //...
}
```

Next, we need to perform calibrations when RAIL requests them (in
`app_process.c`):

```c
void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  //...
  if (events & SL_RAIL_EVENT_CAL_NEEDED) {
    sl_rail_status_t status = sl_rail_calibrate(rail_handle,
                                                NULL,
                                                SL_RAIL_CAL_ALL_PENDING);
    if (status != SL_RAIL_STATUS_NO_ERROR) {
      sl_led_toggle(&sl_led_led1);
    }
  }
}
```

This is all that's needed from an application to perform all calibrations
available on EFR32, to have the maximum available performance. Calibrations are
detailed further in [another
tutorial](/rail/3.1.0/rail-training-calibration).

##### Preparing for Printing

In the previous tutorials, we already enabled LEDs and buttons, but we'll need a
more user friendly output: We need a serial console. To enable that, install the
**Log** component under **Application/Utility**. This should pull up its
dependencies, including an **IO Stream: EUSART** or **UART** component, which is
the serial driver itself.

Finally, we need to enable **Virtual COM UART** on the **Board Control**
component:

![Enabling VCOM](/rail-training-trx/0.1/images/enablevcom-v6.png)

This pulls up a GPIO, which will enable the USB-UART bridge on the development
kit (on the motherboard, if you use a dual board development kit).

##### Receive FIFO

We already configured Tx FIFO in multiple ways. RAIL also implements an Rx FIFO.
With the default **RAIL Utility, Initialization**, the RX FIFO is 512 bytes,
allocated by the RAIL library. We will use that, but it is configurable. See
`sl_rail_set_rx_fifo()` in the [API
documentation](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-fifo)
for details.

For reception RAIL also uses a Packet Queue, as RAIL saves a few bytes to each
packet to store timestamp, RSSI, and similar information (sometimes we call this
"appended info"). With the default **RAIL Utility, Initialization**, it is also
allocated by the RAIL library with the size for 16 packets. This is also
configurable, see
[sl_rail_set_rx_packet_queue()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-packet-queue).

We're working on what we call packet mode. It's the simpler, and recommended
way, but it's not possible to handle packets bigger than the receive FIFO with
this method, in which case FIFO mode should be used. We return to that topic in
a [later
tutorial](/rail/3.1.0/rail-training-special-data-modes).

##### The Packet Handle

The FIFO is accessible with `sl_rail_rx_packet_handle_t` variables or packet
handles. Obviously, we don't have the handle of the packet we just received, but
we have "sentinel" handles:

- `SL_RAIL_RX_PACKET_HANDLE_NEWEST`
- `SL_RAIL_RX_PACKET_HANDLE_OLDEST`
- `SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE`
- `SL_RAIL_RX_PACKET_HANDLE_INVALID`

Note that `SL_RAIL_RX_PACKET_HANDLE_OLDEST` and `SL_RAIL_RX_PACKET_HANDLE_NEWEST`
will always return with packet information. For example, OLDEST will return with
one of the following:

1. the oldest packet received, if available
2. the packet the radio is receiving at the moment, if available and if no fully  
   received packet is available
3. the placeholder which will be used for the next packet the radio will  
   receive, if no fully or partially received packet is available

If you don't care about upcoming or ongoing packets, you can use
`SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE`. It will only return with fully
received packets.

##### When to Read the FIFO

Let's say we want to download the packet when it's fully received (although it's
possible to access it during reception). We **must** let RAIL know this in the
event `SL_RAIL_EVENT_RX_PACKET_RECEIVED`. If we don't, **RAIL automatically
frees the memory allocated to the packet we just received.**

We have two options:

- Download the packet from the event handler
- Hold the packet in the FIFO and download later

While the first one is simpler, it is desirable in most cases to keep large
memory copy operations outside of interrupt handlers, therefore the attached
example demonstrates the second method.

Note however, that if you plan to use [dynamic multiprotocol,
DMP](/rail/3.1.0/rail-training-dmp) and either the receive
FIFO or receive Packet Queue are shared with another protocol, both are reset
during protocol switches losing any held packets. To avoid this, either give
each protocol its own receive FIFO and receive Packet Queue, or you must read
the FIFO before yielding the radio. In the case of one FIFO, it's usually better
to download the packet in the event handler.

##### The Event Handler

In the event handler, we want to instruct RAIL to hold all successfully received
frames:

```c
void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  //...
  if (events & SL_RAIL_EVENTS_RX_COMPLETION) {
    if (events & SL_RAIL_EVENT_RX_PACKET_RECEIVED) {
      if (sl_rail_hold_rx_packet(rail_handle) == SL_RAIL_RX_PACKET_HANDLE_INVALID) {
        sl_led_toggle(&sl_led_led1);
      }
      sl_led_toggle(&sl_led_led0);
    } else {
      sl_led_toggle(&sl_led_led1); // all other events in
                                   // SL_RAIL_EVENTS_RX_COMPLETION are errors
    }
  }
}
```

The API `sl_rail_hold_rx_packet` will also return a packet handler, but we only
report an error if it did not. We don't need the handle itself, since we're
going to use sentinel handles. **Keep in mind that you _must_ release all
packets that were held; otherwise, you will lose part of your Rx fifo,
essentially leaking memory.** Note also that this API shouldn't be used when
developing for dynamic multiprotocol (DMP) if the FIFO or the Packet Queue is
shared with any other protocol.

![Packet hold](/rail-training-trx/0.1/images/hold-rx-packet.png)

##### Download and Print

First, let's create a buffer we can use to download the packet:

```c
static uint8_t rx_buffer[256];
```

In `app_process_action()`, if there's something in the packet handle, let's
download and print it:

```c
void app_process_action(void)
{
  static sl_rail_rx_packet_handle_t packet_handle;
  static sl_rail_rx_packet_info_t packet_info;
  static sl_rail_rx_packet_details_t packet_details;
  //...
  packet_handle = sl_rail_get_rx_packet_info(rail_handle,
                                             SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE,
                                             &packet_info);
  if (packet_handle != SL_RAIL_RX_PACKET_HANDLE_INVALID) {
    sl_rail_copy_rx_packet(rail_handle, rx_buffer, &packet_info);
    sl_rail_status_t status =
      sl_rail_get_rx_packet_details(rail_handle, packet_handle, &packet_details);
    if (status != SL_RAIL_STATUS_NO_ERROR) {
      sl_led_toggle(&sl_led_led1);
    }
    status = sl_rail_release_rx_packet(rail_handle, packet_handle);
    if (status != SL_RAIL_STATUS_NO_ERROR) {
      sl_led_toggle(&sl_led_led1);
    }

    app_log("RX");
    for (int i = 0; i < packet_info.packetBytes; i++) {
      app_log(" 0x%02X", rx_buffer[i]);
    }
    app_log("; RSSI=%d dBm\n", packet_details.rssi);
  }
}
```

Let's go through this, line by line:

First, `sl_rail_get_rx_packet_info()` will return with a valid `packet_handle`
if we have a completely received frame. In that case, it also returns a usable
`packet_info` which has the length of the received packet, and pointers to
download it. Note that the length will include the full frame, and is always
valid, whichever length configuration is used (fixed or variable).

Since the receive buffer is a ring buffer, the packet in the buffer might not be
in a single sequential buffer, copying from that using `memcpy()` is a bit
complicated: `sl_rail_copy_rx_packet()` function implements that.

The API `sl_rail_get_rx_packet_details()` will return some useful information of
the packet, such as RSSI or timestamps.

Finally, we release the packet, using `sl_rail_release_rx_packet()`.

Note that this method is safe, even if we receive a new packet while downloading
one. That packet will be downloaded and printed when `app_process_action()` is
called the next time.

![Rx cycle](/rail-training-trx/0.1/images/rx-circle.png)

It is important to note here that there is a subtle difference between
SL_RAIL_RX_PACKET_HANDLE_OLDEST and SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE.

SL_RAIL_RX_PACKET_HANDLE_OLDEST as well as SL_RAIL_RX_PACKET_HANDLE_NEWEST
become valid at beginning of frame reception. As a result, it cannot be used for
packets reception easily in an active loop.

The following tab clarifies the differences between the handles:

| |NEWEST|OLDEST|OLDEST_COMPLETE|
|---|---|---|---|
|FIFO Empty|INVALID|INVALID|INVALID|
|FIFO receiving packet A|Points to packet A|Points to packet A|INVALID|
|FIFO has received packet A|Points to packet A|Points to packet A|Points to packet A|
|FIFO receiving packet B|Points to packet B|Points to packet A|Points to packet A|
|FIFO receiving packet B and A is copied/released|Points to packet B|Points to packet B|INVALID|

While this isn't exhaustive, it helps to clarify the ambiguity between all three
handles.

##### Download in the Event Handler

Downloading the packet in the event handler is essentially the same as what we
did in the main loop above, except we don't need to worry about releasing:

```c
if (events & SL_RAIL_EVENT_RX_PACKET_RECEIVED) {
  sl_rail_rx_packet_info_t packet_info;
  sl_rail_rx_packet_handle_t packet_handle = sl_rail_get_rx_packet_info(rail_handle, SL_RAIL_RX_PACKET_HANDLE_NEWEST, &packet_info);
  sl_rail_copy_rx_packet(rail_handle, rx_buffer, &packet_info);
  sl_rail_status_t status = sl_rail_get_rx_packet_details(rail_handle, packet_handle, &packet_details);
}
```

Note that `packet_details` should be a global variable (i.e. declared outside of
the functions to be available to both functions) in this case.

##### Conclusion

With this, you can use RAIL for basic transmit and receive, which concludes the
getting started series. However, RAIL can do much more. You can continue with
the basic tutorials.

##### API Introduced in this Article

###### Functions

- [sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate)
- [sl_rail_set_rx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-fifo)
- [sl_rail_set_rx_packet_queue()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-packet-queue)
- [sl_rail_hold_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-hold-rx-packet)
- [sl_rail_release_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-release-rx-packet)
- [sl_rail_get_rx_packet_info()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-info)
- [sl_rail_get_rx_packet_details()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-details)
- [sl_rail_copy_rx_packet()](/rail/3.1.0/rail-api/packet-information#sl-rail-copy-rx-packet)

###### Types and Enums

- [sl_rail_rx_packet_handle_t](/rail/3.1.0/rail-api/receive#sl-rail-rx-packet-handle-t)
- [sl_rail_rx_packet_info_t](/rail/3.1.0/rail-api/sl-rail-rx-packet-info-t)
- [sl_rail_rx_packet_details_t](/rail/3.1.0/rail-api/sl-rail-rx-packet-details-t)
- [SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed)
- [SL_RAIL_RX_PACKET_HANDLE_NEWEST](/rail/3.1.0/rail-api/receive#sl-rail-rx-packet-handle-newest)
- [SL_RAIL_RX_PACKET_HANDLE_OLDEST](/rail/3.1.0/rail-api/receive#sl-rail-rx-packet-handle-oldest)
- [SL_RAIL_RX_PACKET_HANDLE_OLDEST_COMPLETE](/rail/3.1.0/rail-api/receive#sl-rail-rx-packet-handle-oldest-complete)
- [SL_RAIL_RX_PACKET_HANDLE_INVALID](/rail/3.1.0/rail-api/receive#sl-rail-rx-packet-handle-invalid)

#### Time, Timestamping, and Scheduling

Timing is an important aspect of most wireless protocols. While it's possible to
use a generic timer for most of the required tasks, Silicon Labs' Wireless MCUs
provide a protocol timer, which works together with the radio state machine,
providing many advantages. This protocol timer is the base of all RAIL timing
features.

Using the protocol timer, you can completely eliminate interrupt latencies, and
you can get more accurate and more repeatable timing, even if you update the SDK
version. Using the protocol timer in dynamic multiprotocol (DMP) is highly
recommended as it tells the radio scheduler what you are planning to use the
radio for.

##### RAIL Time

RAIL timebase (or the resolution of RAIL time) is 1 µs regardless of the
oscillator's frequency, counted from boot. The same timebase is used for
everything (timestamping and absolute timers). It's stored in
[sl_rail_time_t](/rail/3.1.0/rail-api/system-timing#sl-rail-time-t),
currently implemented as `uint32_t`, what means that it wraps every 1.19 hours.

Note that different hardware might run at different speeds, which is converted
to this universal 1 µs timebase. For this reason, you should never compare
RAIL times with equality operators (`==` and `!=`) as it might skip values.

RAIL provides the usual getter/setter for this:

```c
sl_rail_time_t sl_rail_get_time(sl_rail_handle_t rail_handle);
sl_rail_status_t sl_rail_set_time(sl_rail_handle_t rail_handle, sl_rail_time_t time);
```

Note that it's generally a bad practice to use
[sl_rail_set_time()](/rail/3.1.0/rail-api/system-timing#sl-rail-set-time):
It can cause serious issues when timers are running. Also, RAIL time is one of
the few shared resources between protocols in dynamic multiprotocol mode.

##### Timestamps

By default, each Tx and Rx packet is timestamped with the RAIL time on a fixed
position of the packet.

_While it would be possible to save the value of a timer at a specific RAIL
event (like
[SL_RAIL_EVENT_TX_PACKET_SENT](/rail/3.1.0/rail-api/events#sl-rail-event-tx-packet-sent),
[SL_RAIL_EVENT_RX_SYNC_0_DETECT](/rail/3.1.0/rail-api/events#sl-rail-event-rx-sync-0-detect),
[SL_RAIL_EVENT_RX_PACKET_RECEIVED](/rail/3.1.0/rail-api/events#sl-rail-event-rx-packet-received),
etc.) this isn't recommended._

_The reason is that at the RAIL API level, there's no way to guarantee time
accuracy between the transmission/reception routine is called and the event is
raised. Moreover, this would not be possible if radio interrupts are disabled._

###### Acquire Tx Timestamp

To get the timestamp of transmitted packets, use
[sl_rail_get_tx_packet_details()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-packet-details)
in the context of the
[SL_RAIL_EVENT_TX_PACKET_SENT](/rail/3.1.0/rail-api/events#sl-rail-event-tx-packet-sent)
event:

```c
if ( events & SL_RAIL_EVENT_TX_PACKET_SENT ){
  sl_rail_tx_packet_details_t packet_details;
  packet_details.is_ack = false;
  sl_rail_get_tx_packet_details(rail_handle, &packet_details);
  // ...
  // Timestamp position discussed later
}
```

Note that in case of using
[sl_rail_get_tx_packet_details()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-packet-details),
the
[is_ack](/rail/3.1.0/rail-api/rail-tx-packet-details-t#is-ack)
**must always be initialized** to get proper timestamp;

We return to the time positions soon, but first, let's see how to get the
timestamp of a received packet.

###### Acquire Rx Timestamp

Similarly to Tx, RAIL defines
[sl_rail_get_rx_packet_details()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-details)
API for Rx, and you should use it like this:

```c
sl_rail_rx_packet_info_t packet_info;
sl_rail_rx_packet_details_t packet_details;
sl_rail_rx_packet_handle_t packet_handle = sl_rail_get_rx_packet_info(rail_handle, SL_RAIL_RX_PACKET_HANDLE_NEWEST, &packet_info);
sl_rail_get_rx_packet_details(rail_handle, packet_handle, &packet_details);
```

Note that a `packet_handle` was used to identify the packet we need to be
timestamped. This means that the timestamp of the received packet is stored as
long as the packet is not released either automatically or by calling
[sl_rail_release_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-release-rx-packet)
after
[sl_rail_hold_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-hold-rx-packet).
As a result, these routines do not need to be called in the RAIL event handler
(interrupt context).

This means that the Tx timestamps can only be obtained in the RAIL event handler
(interrupt context), as opposed to the RX timestamps, which persist until the
received packets are released.

###### Timestamp Positions

###### Position Conversion APIs (heading level 7)

RAIL provides several timestamp time positions via the
[sl_rail_packet_time_position_t](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
enumeration. The following values are part of it:

- [SL_RAIL_PACKET_TIME_AT_PREAMBLE_START](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
- [SL_RAIL_PACKET_TIME_AT_SYNC_END](/rail/3.1.0/rail-api/system-timing#sl-ail-packet-time-position-t)
- [SL_RAIL_PACKET_TIME_AT_PACKET_END](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
- [SL_RAIL_PACKET_TIME_DEFAULT](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)

The first three are self-explanatory.
[SL_RAIL_PACKET_TIME_DEFAULT](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
is the hardware implementation, which never needs the
[total_packet_bytes](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#total-packet-bytes).
The
[sl_rail_get_rx_packet_details()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-details)
function will update the
[time_position](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#time-position)
to one of the first three, which is the default on the hardware.

On EFR32 Series 1, this will be
[SL_RAIL_PACKET_TIME_AT_SYNC_END](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
for Rx and
[SL_RAIL_PACKET_TIME_AT_PACKET_END](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
for Tx packet.

On EFR32 Series 2,
[SL_RAIL_PACKET_TIME_AT_PACKET_END](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
is used for both Tx and Rx.

To convert the timestamp to a given position, one of the following APIs must be called:

```c
//Rx APIs:
sl_rail_status_t sl_rail_get_rx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details);
sl_rail_status_t sl_rail_get_rx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details);
sl_rail_status_t sl_rail_get_rx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_rx_packet_details_t *p_packet_details);
//Tx APIs:
sl_rail_status_t sl_rail_get_tx_time_frame_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details);
sl_rail_status_t sl_rail_get_tx_time_preamble_start(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details);
sl_rail_status_t sl_rail_get_tx_time_sync_word_end(sl_rail_handle_t rail_handle, sl_rail_tx_packet_details_t *p_packet_details);
```

These conversion APIs all need the `p_packet_details` previously provided by the
[sl_rail_get_tx_packet_details()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-packet-details)
(refer to the API documentation of each function for exceptions)

To convert the default timestamp, RAIL needs
[total_packet_bytes](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#total-packet-bytes).
The functions will update the
[time_position](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#time-position).
to one of the following values:

- [SL_RAIL_PACKET_TIME_AT_PREAMBLE_START_USED_TOTAL](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
- [SL_RAIL_PACKET_TIME_AT_SYNC_END_USED_TOTAL](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
- [SL_RAIL_PACKET_TIME_AT_PACKET_END_USED_TOTAL](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)

This can be used to recognize an inaccurate timestamp, if
[total_packet_bytes](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#total-packet-bytes)
is unknown.

Note, that
[sl_rail_get_tx_time_preamble_start()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-time-preamble-start)
can be used with `SL_RAIL_TX_STARTED_BYTES` to get an accurate preamble start
timestamp without knowing the
[total_packet_bytes](/rail/3.1.0/rail-api/sl-rail-packet-time-stamp-t#total-packet-bytes).

##### General Purpose Timer

By default, you can set up a single general purpose timer on the RAIL timebase.
The following APIs are usable for this timer (for the detailed arguments, please
check the API documentation):

- [sl_rail_set_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-set-timer)(sl_rail_handle_t,  
  sl_rail_time_t, sl_rail_time_mode_t, sl_rail_timer_callback_t)
- [sl_rail_get_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-get-timer)(sl_rail_handle_t)
- [sl_rail_cancel_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-cancel-timer)(sl_rail_handle_t)
- [sl_rail_is_timer_expired](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-expired)(sl_rail_handle_t)
- [sl_rail_is_timer_running](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-running)(sl_rail_handle_t)

There are a few parameters that require explanation.
[sl_rail_timer_callback_t](/rail/3.1.0/rail-api/system-timing#sl-rail-timer-callback-t)
is a function pointer type to the function which will be called when the timer
fires.
[sl_rail_time_mode_t](/rail/3.1.0/rail-api/system-timing#sl-rail-time-mode-t)
can take two values in this case:

- [SL_RAIL_TIME_ABSOLUTE](/rail/3.1.0/rail-api/system-timing#sl-rail-time-mode-t)
- [SL_RAIL_TIME_DELAY](/rail/3.1.0/rail-api/system-timing#sl-rail-time-mode-t)

If `SL_RAIL_TIME_ABSOLUTE` is used, RAIL interprets the timing in radio time
base absolute time. On the other hand, if `SL_RAIL_TIME_DELAY` is used, the time
specified is a delay starting from the the function call in the RAIL timebase.
However, `SL_RAIL_TIME_DELAY` only guarantees that _at least_ the specified
delay is elapsed; it does not compensate the API processing time. If you need
accurate timing, you should use `SL_RAIL_TIME_ABSOLUTE`:

```c
sl_rail_time_t anchor = sl_rail_get_time(rail_handle);
sl_rail_set_timer(rail_handle, anchor + 1000, SL_RAIL_TIME_DELAY, timer_cb);
```

![Absolute_scheduled](/rail-training-timestamping/0.1/images/rail-general-purpose-timer-0.png)

You can notice that the timer starts from the anchor and not from the
[sl_rail_set_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-set-timer)
function call. If `SL_RAIL_TIME_DELAY` were used, this is how it would look
like, with the small processing time added to the delay:

![Delay_scheduled](/rail-training-timestamping/0.1/images/rail-general-purpose-timer-1.png)

Note though, that this processing time is consistent in the same environment. So
if for some reason, you cannot get an anchor point, you can use a
`SL_RAIL_TIME_DELAY`, measure it, and compensate from the application. However,
if you update RAIL, or change the part the code is running on, the delay might
change.

Restarting timers (i.e., to change the timeout) is not allowed. If the timer
might be running when you set it, you should call
[sl_rail_cancel_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-cancel-timer)
first.

##### Multi-timer

RAIL provides timer virtualization over RAIL timer. In single protocol mode, it's
not enabled to save code space. To enable it, call
[sl_rail_config_multi_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-config-multi-timer)
with `true` argument.

Multi-timer is always enabled in dynamic multiprotocol (DMP) mode.

It provides basically the same APIs and the same precision as the regular RAIL
timer:

- [sl_rail_set_multi_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-set-multi-timer)(sl_rail_multi_timer_t*,  
  sl_rail_time_t, sl_rail_time_mode_t, sl_rail_multi_timer_callback_t, void*)
- [sl_rail_get_multi_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-get-multi-timer)(sl_rail_multi_timer_t*)
- [sl_rail_cancel_timer](/rail/3.1.0/rail-api/system-timing#sl-rail-cancel-timer)(sl_rail_multi_timer_t*)
- [sl_rail_is_timer_expired](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-expired)(sl_rail_multi_timer_t*)
- [sl_rail_is_timer_running](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-running)(sl_rail_multi_timer_t*)

There are only two differences:

- Each API needs a  
  [sl_rail_multi_timer_t](/rail/3.1.0/rail-api/sl-rail-multi-timer-t)  
  `timer_handle`. Every timer you plan to use should have its unique handler  
  statically allocated.
- The callback function has a customizable, `void*` argument.

The regular RAIL timer can still be used when multi-timer is enabled. It's still
implemented as a multi-timer, but its handle is allocated by RAIL. For more
information on how RAIL can be used to implement multi-protocol, refer to the
[Dynamic Multiprotocol User's Guide](https://docs.silabs.com/connect/latest/multiprotocol-dynamic-ug/).

Note: multi-protocol does not necessarily mean multi PHYs. For more information
on the differences between the two, refer to the [article about multi PHYs and
multiprotocol](/rail/3.1.0/rail-training-dmp-intro)

##### Scheduling Tx

Scheduling transmissions on the RAIL time is quite simple:

```c
sl_rail_scheduled_tx_config_t schedule_config = {
  .when = 1000,
  .mode = SL_RAIL_TIME_DELAY,
  .tx_during_rx = SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX,
};
sl_rail_start_scheduled_tx(rail_handle, 0, SL_RAIL_TX_OPTIONS_DEFAULT, &schedule_config, NULL);
```

The parameters of
[sl_rail_start_scheduled_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-scheduled-tx)
are the same as the parameters of
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx),
except the
[sl_rail_scheduled_tx_config_t](/rail/3.1.0/rail-api/sl-rail-scheduled-tx-config-t)
pointer `config` argument, which works just like running the RAIL timer. The
only new argument field here is
[tx_during_rx](/rail/3.1.0/rail-api/rail-schedule-tx-config-t#tx-during-rx);
it can have the following values:

- [SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX](/rail/3.1.0/rail-api/transmit#sl-rail-scheduled-tx-during-rx-t)
- [SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX](/rail/3.1.0/rail-api/transmit#sl-rail-scheduled-tx-during-rx-t)

If you have the radio in receive mode, and when your scheduled packet starts
transmitting, you might be in the middle of receiving a packet. In this case,
`SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX` will start the transmission when
the reception completes, so transmission will be delayed from the intended
scheduling. `SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX` on the other hand cancels
the transmission.

##### Scheduling Rx

Scheduling Rx is similar to scheduling Tx, but it provides more options:

```c
sl_rail_scheduled_rx_config_t schedule_config = {
  .start = 1000,
  .start_mode = SL_RAIL_TIME_DELAY,
  .end = 10000,
  .end_mode = SL_RAIL_TIME_DELAY
  .rx_transition_end_schedule = false;
  .hard_window_end = false;
};
sl_rail_start_scheduled_rx(rail_handle, 0, SL_RAIL_RX_OPTIONS_DEFAULT, &schedule_config, NULL);
```

The following illustrates the scheduled reception as defined above:

![Rx_scheduled](/rail-training-timestamping/0.1/images/rail-packet-scheduling-rx.png)

The arguments
[start](/rail/3.1.0/rail-api/rail-schedule-rx-config-t#start)
and
[start_mode](/rail/3.1.0/rail-api/rail-schedule-rx-config-t#start-mode)
work just like the Tx scheduling setup (or a regular timer), but for Rx, we can
also configure when to end and return to idle mode. In the case above, the delay
starts when the receiver starts, so the config above will start receiving 1 ms
after the API call, and stop it 11 ms after the API call, closing a 10 ms Rx
window.

The end timer is just an option: You can use
[SL_RAIL_TIME_DISABLED](/rail/3.1.0/rail-api/system-timing#sl-rail-time-mode-t),
in which case the radio will stay in Rx mode indefinitely. However, keep in mind
that auto state transitions affect scheduled Rx mode as well; if a packet is
received, it can go to idle or Tx automatically, or it can go back to Rx, in
which case it will wait until the original
[end](/rail/3.1.0/rail-api/sl-rail-schedule-rx-config-t#end)
time, and go to idle at that point.

When the end timer fires, RAIL will trigger the
[SL_RAIL_EVENT_RX_SCHEDULED_RX_END](/rail/3.1.0/rail-api/events#sl-rail-event-rx-scheduled-rx-end)
event.

The last two parameters are rarely used; see the [API
documentation](/rail/3.1.0/rail-api/sl-rail-schedule-rx-config-t)
for it.

Note also that this is one of the few APIs that behave differently in Dynamic
multiprotocol (DMP) mode. For details, see [the article on
DMP](/rail/3.1.0/rail-training-dmp).

##### Multiple Radio Operations

It is not possible to schedule multiple radio operations, whether Rx or Tx.
Only one operation is possible to scheduled at a time; the next one can be
scheduled when the current one is finished.

Although Dynamic multiprotocol does essentially allow it, it is, in reality
rarely needed. For more info, see the [introductory article on
DMP](/rail/3.1.0/rail-training-dmp-intro).

##### State Timing

RAIL lets you configure the delays needed for each radio state transitions
described below. This is useful, in effect, in cases expecting ACKs to be
received after a determined time following a transmission. The radio transceiver
doesn't need to be turned on immediately, hence, saving power.

RAIL defines a few configurable transition times in
[sl_rail_state_timing_t](/rail/3.1.0/rail-api/sl-rail-state-timing-t):

- [idle_to_rx](/rail/3.1.0/rail-api/sl-rail-state-timing-t#idle-to-rx):  
  delay from scheduled time of Rx to actual Rx
- [idle_to_tx](/rail/3.1.0/rail-api/sl-rail-state-timing-t#idle-to-tx):  
  delay from scheduled time of Tx to actual Tx
- [tx_to_rx](/rail/3.1.0/rail-api/sl-rail-state-timing-t#tx-to-rx):  
  delay from Tx to Rx in auto state transition
- [rx_to_tx](/rail/3.1.0/rail-api/sl-rail-state-timing-t#rx-to-tx):  
  delay from Rx to Tx in auto state transition

All of these are configurable with
[sl_rail_set_state_timing()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-state-timing).
By default, all of them are set to a delay the chip can guarantee. This is
somewhere between 100 µs and 150 µs, depending on the part number.

You can set it to 0, which is best effort. It is the fastest possible though not
guaranteed switch time. It is however consistent within the same major part
number (e.g., all EFR32xG23), rail version and radio config, so it can be used
for tight timings.

Normal (not scheduled) Rx/Tx will also use the above configuration, but they
have some additional delay because the MCU has to process the command, and might
need to change the channel, which could take longer.

_Calling
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx)
while the radio is in receive mode is not an Rx to Tx transition: It will first
go to idle, then Tx._

There are two other delays that are not configurable:

- anything to idle
- Rx to Rx (i.e., return to Rx on the same channel, after receiving a packet)

Anything to idle usually takes about 20 µs, while Rx to Rx is about 10
µs, these are always best effort delays.

###### Search Timeout

You can change two search timeouts as well with
[sl_rail_set_state_timing()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-state-timing):

- [rx_search_timeout](/rail/3.1.0/rail-api/sl-rail-state-timing-t#rx-search-timeout)defines the length of time the radio will search for a packet when coming from  
  idle.
- [tx_to_rx_search_timeout](/rail/3.1.0/rail-api/sl-rail-state-timing-t#tx-to-rx-search-timeout)defines length of time the radio will search for a packet when coming from Tx.

Both of these means that Rx will turn off automatically if the radio does not
receive a sync word until the timeout. The timeout will trigger a
[SL_RAIL_EVENT_RX_TIMEOUT](/rail/3.1.0/rail-api/events#sl-rail-event-rx-timeout)
event. This is especially useful in the second case, e.g., you can set up to
wait 5 ms for acknowledgment. If you combine it with
[sl_rail_set_state_timing()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-state-timing),
you can configure a 5 ms Rx window 1 ms after transmitted packets.

##### Energy Modes and Sleep

By default, RAIL timers only work in EM0 and EM1. When configured correctly,
RAIL can use an RTC, which enables the timers to work almost seamlessly in EM2.

The hardware provides very accurate synchronization with RTC. Since RTC runs
much slower than the radio timer (1-32 kHz vs 1 MHz), this is not as simple as
saving the value of both timers at the same time: It saves the timer's value
when RTC changes its value, eliminating errors caused by the synchronization.

For details, see the [article about timer
synchronization](/rail/3.1.0/rail-training-timersync).

##### API Introduced in this Article

###### Functions

- [sl_rail_get_time()](/rail/3.1.0/rail-api/system-timing#sl-rail-get-time)
- [sl_rail_set_time()](/rail/3.1.0/rail-api/system-timing#sl-rail-set-time)
- [sl_rail_get_tx_packet_details()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-packet-details)
- [sl_rail_get_tx_time_frame_end()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-time-frame-end)
- [sl_rail_get_tx_time_preamble_start()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-time-preamble-start)
- [sl_rail_get_tx_time_sync_word_end()](/rail/3.1.0/rail-api/transmit#sl-rail-get-tx-time-sync-word-end)
- [sl_rail_get_rx_packet_details()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-details)
- [sl_rail_get_rx_time_frame_end()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-time-frame-end)
- [sl_rail_get_rx_time_preamble_start()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-time-preamble-start)
- [sl_rail_get_rx_time_sync_word_end()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-time-sync-word-end)
- [sl_rail_set_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-set-timer)
- [sl_rail_get_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-get-timer)
- [sl_rail_cancel_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-cancel-timer)
- [sl_rail_is_timer_expired()](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-expired)
- [sl_rail_is_timer_running()](/rail/3.1.0/rail-api/system-timing#sl-rail-is-timer-running)
- [sl_rail_config_multi_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-config-multi-timer)
- [sl_rail_set_multi_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-set-multi-timer)
- [sl_rail_get_multi_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-get-multi-timer)
- [sl_rail_cancel_multi_timer()](/rail/3.1.0/rail-api/system-timing#sl-rail-cancel-multi-timer)
- [sl_rail_is_multi_timer_running()](/rail/3.1.0/rail-api/system-timing#sl-rail-is-multi-timer-running)
- [sl_rail_is_multi_timer_expired()](/rail/3.1.0/rail-api/system-timing#sl-rail-is-multi-timer-expired)
- [sl_rail_start_scheduled_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-scheduled-tx)
- [sl_rail_start_scheduled_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-scheduled-rx)
- [sl_rail_set_state_timing()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-state-timing)

###### Types and Enums

- [sl_rail_time_t](/rail/3.1.0/rail-api/system-timing#sl-rail-time-t)
- [sl_rail_tx_packet_details_t](/rail/3.1.0/rail-api/sl-rail-tx-packet-details-t)
- [sl_rail_rx_packet_details_t](/rail/3.1.0/rail-api/sl-rail-rx-packet-details-t)
- [sl_rail_packet_time_position_t (SL_RAIL_PACKET_TIME_AT_PREAMBLE_START /  
  SL_RAIL_PACKET_TIME_AT_SYNC_END / SL_RAIL_PACKET_TIME_AT_PACKET_END)](/rail/3.1.0/rail-api/system-timing#sl-rail-packet-time-position-t)
- [sl_rail_time_mode_t (SL_RAIL_TIME_DELAY / SL_RAIL_TIME_ABSOLUTE /  
  SL_RAIL_TIME_DISABLED)](/rail/3.1.0/rail-api/system-timing#sl-rail-time-mode-t)
- [sl_rail_timer_callback_t](/rail/3.1.0/rail-api/system-timing#sl-rail-timer-callback-t)
- [sl_rail_multi_timer_t](/rail/3.1.0/rail-api/sl-rail-multi-timer-t)
- [sl_rail_multi_timer_callback_t](/rail/3.1.0/rail-api/system-timing#sl-rail-multi-timer-callback-t)
- [sl_rail_scheduled_tx_config_t](/rail/3.1.0/rail-api/sl-rail-scheduled-tx-config-t)
- [sl_rail_scheduled_rx_config_t](/rail/3.1.0/rail-api/sl-rail-scheduled-rx-config-t)
- [SL_RAIL_EVENT_RX_SCHEDULED_RX_END](/rail/3.1.0/rail-api/events#sl-rail-event-rx-scheduled-rx-end)
- [SL_RAIL_EVENT_RX_TIMEOUT](/rail/3.1.0/rail-api/events#sl-rail-event-rx-timeout)
- [sl_rail_state_timing_t](/rail/3.1.0/rail-api/sl-rail-state-timing-t)
- [sl_rail_scheduled_tx_during_rx_t (SL_RAIL_SCHEDULED_TX_DURING_RX_POSTPONE_TX /  
  SL_RAIL_SCHEDULED_TX_DURING_RX_ABORT_TX)](/rail/3.1.0/rail-api/transmit#sl-rail-scheduled-tx-during-rx-t)

### Basics

#### Debugging

EFR32 Wireless Geckos, like any modern MCU, supports on-chip debugging. However,
when debugging radio problems, on-chip debugging is often inadequate. Generally,
the problem is that some bugs originate from the real time nature of the radio.
When stopping the radio at a breakpoint, you change the behavior of the target.
Also, you might need information from multiple targets at the same time. In this
article, we recommend RAIL/EFR32 debug techniques for these problems as well as
other RAIL-specific debug features.

##### RAILtest

While the original goal for RAILtest was to test the RAIL library, it can be a
useful tool for software development as well. In most cases, you probably want
to concentrate on either receiving or transmitting, and need something to play
the role of the other side. RAILtest can be simply used for that. Just set up
the desired config, and it will immediately start in receive mode, printing the
received messages with timestamps (useful for checking synchronized transmits).
It doesn't just print; it has a command line interface to change almost anything
in RAIL. Some of the most useful commands for testing:

- `rx 0` turns off the radio, while `rx 1` reenables it in receive mode
- `tx <N>` sends N message or if N=0, it will send messages until you call `tx  
  0` again
- `settxdelay <N>` changes the delay between transmitted packets
- `setchannel <N>` changes the channel to N
- `setconfigindex <N>` will change the radio config to the given number in a  
  multi-PHY setup
- `status` prints a statistics (e.g., number of received packets) since the  
  device booted
- `resetcounters` zeroes out the statistics for the `status` command
- `setrxoption 3` can be used to disable CRC check while `setrxoptions 0`  
  reenables it
- `setfixedlength <N>` sets the configured packet length to N, for both Tx and  
  Rx, even if the radio config is variable length
- `settxpayload` can change the packet RAILtest transmits. The first parameter  
  is the offset and all following parameters will be written continuously
- `settxlength <N>` changes how many bytes will be written into the Tx FIFO  
  before transmission (note that it does not actually change the transmitted  
  length)
- `settxtransitions` and `setrxtransitions` can be used to configure automatic  
  state transitions. Do disable going back to Rx, call it both with the argument  
  `i i` (i as idle)
- `settxtone 1` transmits an unmodulated carrier on the channel until `settxtone  
  0` is called
- `getrssi` prints out the current RSSI measured on the antenna
- `startavgrssi <N>` measures RSSI for N µs
- `settxstream` can be used to transmit various periodic modulated signal,  
  including PN9 pseudorandom and '01' pattern
- `setgpiooutpin` can be used to drive a pin low or high, e.g., to drive an  
  external PA. For example, `setgpiooutpin C 3 0`  will drive portC3 down
- `setdebugsignal` outputs an internal debug signal to GPIO, this is discussed  
  in detail below
- `reset` resets the part

For further details, refer to [RAILtest User's Guide](/rail/3.1.0/railtest-users-guide).

##### Debugging with SWD

EFR32 provides SWD as the debug interface. You can use breakpoints and read
register values when the MCU is halted, just like any other EFM32. However, you
should be careful when using this tool for debugging the radio.

Keep in mind that the radio is fast; if you put a breakpoint to the RAIL event
handler, you can stop the MCU while it's receiving/transmitting a packet, which
could result in bugs that normally wouldn't happen, e.g., the timestamps could
be completely wrong, or you can run into buffer overflow/buffer underflow
events.

You could also see some strange phenomena when debugging the radio; that is, you
might see that the values stored in the memory have changed, even though the MCU
is halted. That is caused by the radio co-processor of EFR32 (sometimes called
sequencer), which is used to help with time-critical event handling of the
radio, and shares some memory with the main MCU.

Generally, we would recommend not putting breakpoints into the RAIL event
handler (of course, it is fine to do it if you don't care about execution after
the breakpoint); set temporary flags instead and stop the application in the
main loop when it's safe to check the values. Another good technique is to put
past events into a queue:

```c
volatile sl_rail_events_t event_queue[5];

void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  // Handle events
  for(int i=1;i<5;i++){
    event_queue[i-1] = event_queue[i];
  }
  event_queue[4] = events;
}
```

This helps a lot to figure out the flow that resulted in the problem you're
debugging.

##### Assertion

RAIL provides an assertion mechanism. For example, if you try to set a channel
on a frequency that is not available from the radio configuration, you'll get a
`SL_RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY` assert. If `RAIL Utility, Callbacks`
component is installed, these assert will be printed to stdout by default. You
can catch these asserts by overriding `sl_rail_util_on_assert_failed` weak
function.

It's a good idea to stop normal operation on assert - in a production
application, you probably want to reset from it. If you put a breakpoint in
`sl_rail_util_on_assert_failed`, you can also see the callstack of the assert,
where you might not understand all levels (as part of it is probably in the
closed source library), but at least you can see the original source of the
assert.

Note that if nothing implements `sl_rail_util_on_assert_failed`, it defaults to
the rail-lib implementation, which is an infinite loop. Unless you have a
watchdog, this can be harmful in production.

##### Debugging with GPIOs and PRS Channels

You probably already used this technique to debug time-critical problems: toggle
a GPIO when something happens, and use a logic analyzer or an oscilloscope to
analyze it. EFR32 can help further with radio specific PRS (Peripheral Reflex
System) channels that are wired to GPIOs. If a GPIO is configured for a given
PRS signal, it will go high when the signal is active; i.e., if you configure
`PRS_RAC_TX` to a GPIO, the signal will be high during transmission. You can
find a list of the available radio PRS signals below.

PRS signals can be extremely useful when working on multiple devices:

![Logic Analyzer Snapshot of
PRS](/rail-training-debugging/0.2/images/logicanalyzer.png)

In the logic analyzer capture above (of a PRS-modified duty cycle example), you
can see that device 2 starts transmitting, and how device 1 locks on that
signal.

PRS signals also can be used to measure state transition times, which is often
important in time-critical applications. Note, however, that even though the
`RXSTATE` signal is driven high, the radio and RAIL could still need some time
to complete the state transition, so it might be possible that you can't detect
a signal at the beginning of the Rx window, or you're already leaving Rx mode
when an event is triggered, making it useless. The magnitude of this error
however is small only a few µs.

###### Setting up PRS Signals with PRS Debug Signal Support Component

Simplicity Studio 6's **PRS Debug Signal Support** (in earlier SDKs, **Flex -
RAIL PRS Support**) component offers an easy way to set up the radio PRS
signals. After installing the component, you can create multiple component
instances. Each instance corresponds to a PRS signal where you can select the
PRS signal source and the output pin. In the picture below, we created an
instance named `dout` and we set Modem data out to pin PC09.
(Before configuring the pin, check the pin tool, datasheet, and schematic
to ensure it does not conflict with other assigned functions.)

![RAIL PRS Support component
instance](/rail-training-debugging/0.2/images/rail-prs-support-v6.png)

Note that while this article is intended for proprietary developers, the above
component and the radio PRS debug signal system is available with any stack. The
only possible caveat is that some PRS channels might be used with certain
stacks. E.g., PRS channel 7 is usually used for [RAIL timer
synchronization](/rail/3.1.0/rail-training-timersync).

###### Setting up PRS Signals Without PRS Debug Signal Support Component

It can be also useful to set up the PRS signals directly from the source code.
The implementation is different for the device generations.

For Series 1:

```c
#include "em_cmu.h"
#include "em_prs.h"

// Useful Pins that work on most boards
// Pin,  Ch, Loc, Board gen     (conflict)  WSTK_P?     EXP_HEADER?
// PC10,  9,  15  Series1       (I2C)       WSTK_P12    EXP_HEADER15
// PC11, 10,   5  Series1       (I2C)       WSTK_P13    EXP_HEADER16
// PF02,  0,   2  xG1/xG13/xG14 (SWO)       WSTK_P28
// PF03,  1,   2  xG1/xG13/xG14 (TDI)       WSTK_P10    EXP_HEADER13
// PF04,  2,   2  xG1/xG13/xG14 (LED0)      WSTK_P8     EXP_HEADER11
// PF05,  3,   2  xG1/xG13/xG14 (LED1)      WSTK_P32
// PF06,  0,   6  xG1/xG13/xG14 (BTN0)      WSTK_P34
// PF07,  1,   6  xG1/xG13/xG14 (BTN1)      WSTK_P36
// PC09, 11,   2  xG12                      WSTK_P10    EXP_HEADER13
// PD09,  3,   8  xG12                      WSTK_P02    EXP_HEADER05
// PD10,  4,   1  xG12                      WSTK_P04    EXP_HEADER07
// PD11,  5,   1  xG12                      WSTK_P06    EXP_HEADER09
// PD12,  6,  14  xG12                      WSTK_P08    EXP_HEADER11

// Set PRS_RAC_TX to PC10
// EXP15: PC10, Ch9, Loc15
CMU_ClockEnable(cmuClock_PRS, true);
CMU_ClockEnable(cmuClock_GPIO, true);
GPIO_PinModeSet(gpioPortC, 10, gpioModePushPull, 0);
PRS_ConnectSignal(9, prsTypeAsync, PRS_RAC_TX);
PRS_GpioOutputLocation(9, 15);
```

For Series 2:

```c
#include "em_cmu.h"
#include "em_prs.h"

// PRS Channel 0-5 can be routed to port A/B and Channel 6-11 to port C/D
// Set PRS_RACL_TX to PC04
CMU_ClockEnable(cmuClock_PRS, true);
CMU_ClockEnable(cmuClock_GPIO, true);
PRS_ConnectSignal(8, prsTypeAsync, PRS_RACL_TX);
PRS_PinOutput(8, prsTypeAsync, gpioPortC, 4);
GPIO_PinModeSet(gpioPortC, 4, gpioModePushPull, 0);
```

###### Setting up PRS Signals with RAILtest

In RAILtest, you can set up the PRS signals using the `setDebugSignal` serial
command. For example, to route `TXACTIVE` to pin PC11 use:

```c
setDebugSignal PC11 TXACTIVE
```

You can use `setDebugSignal help me` to list available GPIOs and signals.

###### Radio PRS Signals

For Series1:

|Signal|RAILtest name|Summary|
|---|---|---|
|PRS_RAC_ACTIVE|RACACTIVE|Radio enabled|
|PRS_RAC_TX|TXACTIVE|Transmit mode enabled|
|PRS_RAC_RX|RXACTIVE|Receive mode enabled|
|PRS_RAC_LNAEN|LNAEN|LNA enabled for RX|
|PRS_RAC_PAEN|PAEN|PA enabled for TX|
|PRS_MODEM_FRAMEDET|FRAMEDETECT|Frame detected (Syncword received)|
|PRS_MODEM_PREDET|PREAMBLEDETECT|Preamble detected|
|PRS_MODEM_TIMDET|TIMINGDETECT|Timing detected|
|PRS_MODEM_FRAMESENT|FRAMESENT|Frame sent|
|PRS_MODEM_SYNCSENT|SYNCSENT|Syncword sent|
|PRS_MODEM_PRESENT|N/A|Preamble sent|
|PRS_MODEM_PRESENT+1|CUSTOM_PRS 0x56 0x6|Modem clock out|
|PRS_MODEM_PRESENT+2|CUSTOM_PRS 0x56 0x7|Modem data out|

For Series2:

|Signal|RAILtest name|Summary|
|---|---|---|
|PRS_RACL_ACTIVE|RACACTIVE|Radio enabled|
|PRS_RACL_TX|TXACTIVE|Transmit mode enabled|
|PRS_RACL_RX|RXACTIVE|Receive mode enabled|
|PRS_RACL_LNAEN|LNAEN|LNA enabled for Rx|
|PRS_RACL_PAEN|PAEN|PA enabled for Tx|
|PRS_MODEML_FRAMEDET|FRAMEDETECT|Frame detected (Syncword received)|
|PRS_MODEM_PREDET|PREAMBLEDETECT|Preamble detected|
|PRS_MODEMH_TIMDET|TIMINGDETECT|Timing detected (not valid for most PHYs)|
|PRS_MODEM_FRAMESENT|FRAMESENT|Frame sent|
|PRS_MODEMH_SYNCSENT|SYNCSENT|Syncword sent|
|OFDMFRAMEDETECT_PRSMUXLSB|OFDMFRAMEDETECT|OFDM Frame detected (Syncword received)|
|OFDMEOF_PRSMUXLSB|OFDMEOF|OFDM End of Frame|
|OFDMFRAMESENT_PRSMUXLSB|OFDMFRAMESENT|OFDM Frame sent|
|OFDMSYNCSENT_PRSMUXLSB|OFDMSYNCSENT|OFDM Syncword sent|
|OFDMSYMBOLCLK_PRSMUXLSB|OFDMSYMBOLCLK|OFDM Symbol clock out|
|PRS_MODEMH_PRESENT|N/A|Preamble sent|
|PRS_MODEML_DCLK|CUSTOM_PRS 0x56 0x5|Modem clock out|
|PRS_MODEML_DOUT|CUSTOM_PRS 0x56 0x6|Modem data out|

The last two signals are direct outputs of the modem (just before modulation for
Tx and after demodulation for RX). On Series 1 devices, they don't have proper
names, so the recommended way to access them is to increment
`PRS_MODEM_PRESENT`. If you are working with RAILtest, they can be accessed as
custom PRS. In this case, instead of `0x56`, use:

- `0x26` on xG1,
- `0x56` on xG12-xG14,
- `0x2B` on xG21,
- `0x2A` on xG22,
- `0x29` on xG23 and newer

Note that especially on Series 2 devices, some debug signals might not work as
expected, or even meaningless. `PRS_MODEML_DOUT` for example behaves differently
on rx depending on the radio config while `PRS_MODEMH_TIMDET` also depends on
the PHY but in most cases its behavior is undefined. For software debugging
however, these signals are rarely needed.

#### Calibrations

To reach the maximum performance of the radio, you should enable and implement
calibrations. In this document, we will talk about the details on how to enable
and implement calibrations, when they can be avoided, and in what situations
should they be implemented.

##### Enable All Calibrations

Generally, you should enable all calibrations. They do have some drawbacks, and
they can be avoided in some cases, but unless you're sure you don't need them,
it's best to enable all of them.

If you open an example in Simplicity Studio, the RAIL initialization components
will enable calibrations partially. However, the application still needs to
implement the calibration callback:

```c
if( events & SL_RAIL_EVENT_CAL_NEEDED ){
  sl_rail_calibrate(rail_handle, NULL, SL_RAIL_CAL_ALL_PENDING);
}
```

See the [Event Handling and Automatic State
Transitions](/rail/3.1.0/rail-training-event) tutorial if
you're unsure how and where to use this code.

If you want to change this default "enable everything behavior", you can change
them in the components **RAIL Utility, Initialization** (for image rejection and
temperature calibration) and **RAIL Utility, Power Amplifiers** (for PA
calibration). Alternatively, you can also call
[sl_rail_enable_pa_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-enable-pa-cal)
and/or
[sl_rail_config_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-config-cal)
in your application's init code.

In the following sections, we'll look into the 3 calibrations available on
EFR32.

##### PA Calibration

###### Why Is It Needed?

The Power Amplifier (PA) has some part-to-part variations at low-power levels.
To compensate this, Silicon Labs measures the PA during manufacturing and stores
a few calibration constants on the DI page.

On Series 2 devices, PA calibration is enabled by default. On some devices, the
API can be used to disable it, and on others, like on EFR32xG23, this API has no
effect, and only exists for compatibility reasons.

On Series 1 devices, the 2.4 GHz Low Power PA is not affected by the PA
calibrations.

###### When to Perform This Calibration?

Call
[sl_rail_enable_pa_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-enable-pa-cal)
before calling
[sl_rail_config_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-config-cal).

###### How Long Does It Take?

Virtually no time. It's just loading some constants from the DI page, not an
actual calibration.

###### What if I Don't Use It?

When you set to transmit at low power, your output power might be different from
part-to-part.

###### Are There Any Drawbacks?

By default, during PA ramp-up, the radio ramps the PA current to a fixed value,
which always takes the same time (but results to different power output).

![ramping plot without
calibration](/rail-training-calibration/0.1/images/ramp-nocal.png)

With calibration, the slope will be the same, but it can reach the target output
power either faster or slower. To guarantee the scheduling timing, RAIL will set
up the slowest ramp time as a delay for the ramp-up. This means that ramping
will take slightly longer, and it might reach the top early.

![ramping plot with
calibration](/rail-training-calibration/0.1/images/ramp-cal.png)

Since we're talking about microseconds here, it's usually not an issue, unless
for some reason, you need to be aware of ramping shape and time.

###### How to Do It?

The simplest way is the implementation above.

##### Temperature Calibration

###### Why Is It Needed?

The Voltage Controlled Oscillator (VCO) must be temperature-compensated to
generate the expected frequency. This will be performed automatically when the
radio enters either the Tx or Rx state from idle, but it might be needed when
the radio is in Rx for a long duration with big temperature changes.

###### When to Perform This Calibration?

Generally speaking, when RAIL requests it through
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed).
RAIL will request calibration when the temperature changes by 70 °C.

###### How Long Does It Take?

Under 100 µs.

###### What if I Don't Use It?

There's no need for it if your device does not stay in Rx mode (without channel
change), while the temperature can change by a lot.

If you don't calibrate when requested, your receiver frequency might change to
the point where reception will be impossible.

###### Are There Any Drawbacks?

It's not possible to receive packets while the calibration is running.

###### How to Do It?

Call
[sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate)
or
[sl_rail_calibrate_temp()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-temp)
from the
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed)
event if
[sl_rail_get_pending_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-get-pending-cal)
returns
[SL_RAIL_CAL_TEMP](/rail/3.1.0/rail-api/calibration#sl-rail-cal-temp).

##### Image Rejection Calibration

Also known as IR or IQ calibration.

###### Why Is It Needed?

EFR32 implements a superheterodyne receiver, which fundamentally receives
signals from two frequency bands: one IF (Intermediate Frequency) above the
Local Oscillator (LO) frequency - wanted band, and one IF below the LO frequency

- image band (the wanted band can be programmed to be below the LO, in which  
  case image band is above the LO). Image band reception is not desired. It could  
  cause reception issues if there's something on the image band, e.g. another  
  channel or some completely different RF transmission.

The receiver is designed in a way that there is inherently suppression on the
image band. The suppression of the image however can be further improved by
performing an on-chip calibration. Note that the calibration does not improve
receiver sensitivity, and it's not even used for Tx; it only improves signal
suppression on the image frequency in Rx mode.

![image frequency](/rail-training-calibration/0.1/images/ir-figure.png)

###### When to Perform This Calibration?

Once, for each subGHz radio configuration, on each RF path, in the lifetime of
the chip. This means it's enough to calibrate during manufacturing, store the
result, and apply it later - but it has to be done on every part. In fact, we do
this measurement for 2.4 GHz 802.15.4 and BLE and store it in the DI page of the
chip. The internal calibration process is not available on 2.4 GHz, but the
stored values are quite good for any radio configuration on that band. However,
we can't provide calibration values for all the possible sub-GHz radio
configurations.

###### How Long Does It Take?

The calibration itself takes about 200 ms. Loading a stored value is just a
register write, so it's nearly instantaneous.

###### What if I Don't Use It?

You will be able to receive from the image frequency easier (i.e., sensitivity
on the image band will be better, but very likely still not as good as on the
wanted band). This can be harmful, for example if the image frequency is a
neighboring channel.

###### Are There Any Drawbacks?

Loading a stored value has no drawback. The calibration itself takes quite a
long time, and it needs about 3 kB code memory (in Flex 3.0.2, with GCC 7.2.1,
on Series 1). On EFR32xG23 and newer parts, it should need less code memory, as
part of the algorithm is implemented in the hardware. However, it still needs
about 2.3 kB (in Flex 4.3.1, with GCC 10.3.1).

###### How to Do It?

The easiest way is the automatic implementation above. RAIL will request
calibration when you call
[sl_rail_config_channels()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-config-channels).
However, you can also trigger calibration manually, e.g., at boot.

_There are a few more details that are important in multi-phy or multiprotocol
environments. We will discuss it in [the multiphy
article](/rail/3.1.0/rail-training-multiphy-examples)._

_IR calibration requires the radio Tx looped back to its Rx, and this cannot be
easily done in some configurations. If all of these are true for you, please
contact our support team on how to implement IR calibrations:_

- _you have a Series 1 device (such as EFR32xG1/xG12/xG13/xG14)_
- _the matching has split Tx/Rx configuration (practically in case of using  
  FEM)_
- _the target frequency is above 462 MHz_

###### Related Variables in the Radio Configuration

IR Calibration is configured by a variable from `rail_config.c`, and the end
result is cached in a variable of `rail_config.c` For details, see the [article
on the `rail_config.c`
file](/rail/3.1.0/rail-training-railcfg), specifically the
section _IR Calibration helpers_.

###### Using the Alternate APIs

If you can use a "manufacturing test" firmware to run the IR calibration and
store it, and only load the value from the end-product application, you can
remove the significant code space required by the IR calibration by using the
alternate API:

```c
if( events & SL_RAIL_EVENT_CAL_NEEDED ){
  sl_rail_cal_mask_t pending = sl_rail_get_pending_cal(rail_handle);
  if ( pending & SL_RAIL_CAL_ONETIME_IR_CAL ){
    sl_rail_apply_ir_calibration(rail_handle, &stored_ir_value, SL_RAIL_ANTENNA_AUTO);
  } else { //if not IR, it must be temperature on EFR
    sl_rail_calibrate_temp(rail_handle);
  }
}
```

In the manufacturing firmware, you can use
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir)
to get the IR calibration value. If you never call
[sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate)
or
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir)
in your application, the calibration code will be removed freeing up code space.

###### IR Calibrations with Multiple RF Paths (heading level 7)

Some Series 2 devices (e.g., EFR32xG23) have an internal RF switch to support
two RF paths.

With these parts, the above recommended APIs calibrate the antenna which was
selected with the last parameter.

###### Antenna Diversity (heading level 7)

If you use the RF switch for antenna diversity, it is recommended to calibrate
for both antennas, one by one:

```c
sl_rail_calibrate_ir(rail_handle, NULL, SL_RAIL_ANTENNA_0);
sl_rail_calibrate_ir(rail_handle, NULL, SL_RAIL_ANTENNA_1);
```

Using
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir)
with `SL_RAIL_ANTENNA_AUTO` is recommended on parts with internal switch, if you
do not want to use antenna diversity. This always calibrates the antenna
configured for use, so it is less error-prone.

###### Different Matching (heading level 7)

Another common usecase is to have multiple matching circuits (e.g., one for 433
MHz and another for 915 MHz) on the same device, and maybe also with an external
switch to use the same antenna. In practice, you will use the two paths with
different PHYs.

In this case, it is recommended to rely on RAIL's storage of calibration values
for multi-PHY configs (see the [Multi-PHY
article](/rail/3.1.0/rail-training-multiphy-examples) for
more details). However, you have to be careful to select the right matching and
antenna for the given PHY before performing the calibration with
[sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate)
or
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir).

###### Stack-Specific IR Calibration

###### Bluetooth Low-Energy and OpenThread (heading level 7)

Since BLE and OpenThread operate on the 2.4 GHz band, as it was described above,
IR calibration is performed by applying the calibration value from the DI page.

###### Zigbee (heading level 7)

In case of the Zigbee, the IR calibration is performed at one time, once the
radio starts using a band (2.4 GHz, 863 MHz or 915 MHz) first time from the last
boot.

On 2.4 GHz band it is a simple memory write. On sub-GHz bands the IQ calibration
differs on different device generations:

- EFR32xG1 ICs are supplied with the proper calibration stored in the DI page,  
  similarly to the 2.4 GHz band calibration.
- All other parts run IR calibration when the device starts using these bands,  
  and the results are retained until reboot.

###### Z-Wave (heading level 7)

The calibration in the Z-Wave stack is done automatically, during PHY load,
implemented in the stack.

##### API Introduced in This Article

###### Functions

- [sl_rail_enable_pa_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-enable-pa-cal)
- [sl_rail_config_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-config-cal)
- [sl_rail_apply_ir_calibration()](/rail/3.1.0/rail-api/calibration#sl-rail-apply-ir-calibration)
- [sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate)
- [sl_rail_calibrate_temp()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-temp)
- [sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir)
- [sl_rail_get_pending_cal()](/rail/3.1.0/rail-api/calibration#sl-rail-get-pending-cal)

###### Types and Enums

- [sl_rail_cal_mask_t](/rail/3.1.0/rail-api/calibration#sl-rail-cal-mask-t)
- [SL_RAIL_CAL_ALL](/rail/3.1.0/rail-api/calibration#sl-rail-cal-all)
- [SL_RAIL_CAL_ALL_PENDING](/rail/3.1.0/rail-api/calibration#sl-rail-cal-all-pending)
- [SL_RAIL_CAL_ONETIME_IR_CAL](/rail/3.1.0/rail-api/calibration#sl-rail-cal-onetime-ir-cal)
- [SL_RAIL_CAL_TEMP](/rail/3.1.0/rail-api/calibration#sl-rail-cal-temp)
- [SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed)

#### Power Manager Integration

In this article, we describe what are the supported RAIL features in different
energy modes, and how high energy efficiency can be achieved with appropriate
software. Furthermore, we give a general overview of how RAIL leverages the
Power Manager's services.

##### Introduction

The radio must always run off of a High-Frequency Crystal Oscillator (HFXO) that
drives the RAIL's internal timer for high accuracy protocol timing. It is
essential to keep this clock running during any active radio operation such as
active transmission and reception. As a result, the radio is active only in EM0
and EM1/EM1P as the HFXO clock is running only in these - highest - Energy
Modes (EM).

The Power Manager is a platform-level software module that manages the system's
energy modes. Its primary purpose is to transition the system to the
lowest-energy mode, consequently reducing the overall current consumption, when
the processor has nothing to execute and there is no peripheral requesting
higher energy modes. Additionally, it ensures strict control of the
power-intensive resources, just like the high-frequency external oscillator.

You can instruct the Power Manager to enable/disable energy mode transitions by
specifying EM level requirements. You can also register listeners at any point
of your software to get notification on the energy mode transitions via the
Power Manager's notification mechanism.

For complete documentation on the Power Manager service, visit [the platform
documentation
page](https://docs.silabs.com/gecko-platform/latest/platform-service/power-manager).

##### Best Practices for using RAIL with Power Manager

###### Benefits of Using Power Manager

The Power Manager makes your application energy-friendly more effectively and it
provides a neat API to interface with. As some of the Silicon Labs software
modules might tightly integrate Power Manager (e.g., the [Sleep
Timer](https://docs.silabs.com/gecko-platform/latest/platform-service/sleeptimer)
service and RAIL), your application's energy mode requirements can be managed in
the same way as those do. That makes complex decisions on the energy mode
requirements of the entire software much more coherent.

The Power Manager offers a notification system that keeps the "subscribers"
informed on energy mode changes providing the perfect opportunity to react to
the EM transitions as soon as possible.

###### Enabling Power Manager and Timer Synchronization in RAIL

The
[sl_rail_init_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-init-power-manager)
configures RAIL to use Power Manager. If it is initialized, RAIL automatically
request the lowest energy mode sufficient for proper radio operation. To stop
this feature, call
[sl_rail_deinit_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-deinit-power-manager).
However, removing the energy mode requirements is not done automatically as it
is discussed in the following section.

If you have to schedule radio operations more precisely during the sleep
periods, you also need to call the
[sl_rail_config_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-config-sleep)
API with the `SL_RAIL_CONFIG_TIMERSYNC_ENABLED` parameter. If the
synchronization is not needed, use the `SL_RAIL_CONFIG_TIMERSYNC_DISABLED`
option. Details on how this synchronization works are [documented in a later
article](/rail/3.1.0/rail-training-timersync).

Installing the **Power Manager Integration** component under **RAIL-SDK**
configures RAIL to use Power Manager as well as enables timer synchronization.

###### Radio Yielding Practice

When RAIL's Power Manager integration is enabled, any operation that requires
the radio to be in Rx or Tx will request the power mode needed for that, usually
EM1.
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1),
which stops any of these operations, will release that power mode request.

In case the radio returns to idle automatically however, e.g., at Tx complete,
the application must explicitly release the power mode by calling
[sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio)
or
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1).

Timers also require EM1, at least before their callback is called, so calling
[sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio)
(or Idle) from a timer callback is also necessary.

To summarize, you will need to call
[sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio)
or
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
from the rail timer callbacks and event handler to make sure RAIL releases the
requested power mode. In the event handler, Yielding is mainly necessary at Tx
completion and Rx completion, if automatic state transitions are set to idle.
There are other events however that reports that radio or timer is not needed
anymore, such as `SL_RAIL_EVENT_RSSI_AVERAGE_DONE` and
`SL_RAIL_EVENT_TX_SCHEDULED_TX_MISSED`.

_Note that this could mean that you have to enable some events just to yield the
requested energy mode, typically the events in the groups
`SL_RAIL_EVENTS_RX_COMPLETION` and `SL_RAIL_EVENTS_TX_COMPLETION`._

###### EM4 Limitation

Because waking up from the lowest - EM4 - energy mode resets the MCU entirely,
this scenario does not fit into how the Power Manager operates. Therefore
entering and leaving the lowest energy mode is not supported by the Power
Manager. Still, this mode can be requested in the application as well as
restoring previous states is also the application's duty. Keep in mind that
entering EM4 aborts all ongoing and scheduled radio operations and makes time
synchronization impossible.

##### RAIL without Power Manager

If you've installed the Power Manager service in your application, but it is not
initialized to be used by RAIL (or the Power Manager is temporarily
deinitialized), you should manually manage the energy mode requirements matching
the radio's needs.

As discussed above, any active radio operation requires EM1(P) or EM0 energy
mode. If RAIL does not initialize Power Manager, call
`sl_power_manager_add_em_requirement()` and
`sl_power_manager_remove_em_requirement()`  with the required energy mode before
starting the radio operation and after the associated radio event has been
handled, respectively.

Synchronization requires EM2 because this is the highest energy mode with active
low-frequency oscillators running.
[sl_rail_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-sleep)
and [sl_rail_wake()](/rail/3.1.0/rail-api/sleep#sl-rail-wake)
APIs must be called for performing time synchronization. Find more
implementation details on the [sleep API
documentation](/rail/3.1.0/rail-api/sleep).

Entering lower energy modes than required breaks the active radio operation or
the synchronization mechanism.

##### API Introduced in this Article

###### Functions

- [sl_rail_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-sleep)
- [sl_rail_wake()](/rail/3.1.0/rail-api/sleep#sl-rail-wake)
- [sl_rail_init_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-init-power-manager)
- [sl_rail_deinit_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-deinit-power-manager)
- [sl_rail_config_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-config-sleep)
- [sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio)

###### Types and Enums

- [sl_rail_sleep_config_t (SL_RAIL_CONFIG_TIMERSYNC_DISABLED /  
  SL_RAIL_CONFIG_TIMERSYNC_ENABLED)](/rail/3.1.0/rail-api/sleep#sl-rail-sleep-config-t)
- [sl_rail_timer_sync_config_t](/rail/3.1.0/rail-api/sl-rail-timer-sync-config-t)

#### Idle Modes

The function
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
takes a mode argument, with which you select one of the four available methods
of idling the radio to use. Though the [API documentation briefly describes each
mode](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-mode-t),
it might be difficult to understand their differences without seeing examples
and use cases. This document aims to help you more clearly understand each mode.

##### General Recommendations

In most cases, `SL_RAIL_IDLE` is the recommended mode to use with this API.
`SL_RAIL_IDLE_ABORT` is helpful when you want to also abort an ongoing
("active") Tx or Rx operation.

On the other hand, `SL_RAIL_IDLE_FORCE_SHUTDOWN` is not recommended for use, and
`SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS` should be handled with care.

##### SL_RAIL_IDLE

The mode `SL_RAIL_IDLE` turns off the radio after the current operation is
finished. It also cancels any transmit or receive scheduled in the future.
Current operations that won't be aborted include:

- active transmit, which starts when the first bit (usually preamble) is  
  transmitted and ends when the last bit (usually CRC) is transmitted.
- active receive, which starts at sync word detect, and ends when the last bit  
  is received (which depends on the decoded length of the packet).

##### SL_RAIL_IDLE_ABORT

The mode `SL_RAIL_IDLE_ABORT` works the same as `SL_RAIL_IDLE`, but it will also
abort active operations. However, `SL_RAIL_IDLE_ABORT` will always wait for a
stable state before turning off the radio, e.g. if the radio was preparing to
enter Rx mode and is waiting for the PLL to lock, RAIL will wait until the Tx
state is reached before idling the radio.

##### SL_RAIL_IDLE_FORCE_SHUTDOWN

Unlike `SL_RAIL_IDLE_ABORT` (which waits for a stable radio state),
`SL_RAIL_IDLE_FORCE_SHUTDOWN` immediately forces the radio off. As this is an
abrupt transition, it may corrupt data in the receive or transmit buffers. This
buffer corruption can only be resolved by resetting the FIFO, which loses data,
and can also consume additional time.

In our experience, it's almost always slower than `SL_RAIL_IDLE_ABORT`, so the
costs typically outweigh the benefit of using `SL_RAIL_IDLE_FORCE_SHUTDOWN`
(except when recommended by our support team for diagnostic purposes).

##### SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS

The mode `SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS` works the same as
`SL_RAIL_IDLE_FORCE_SHUTDOWN`, but it also clears any pending events. For more
details on scenarios where this can be useful, see the [article on RAIL
interrupt safety](/rail/3.1.0/rail-training-thread-safety).

### Further Topics

#### Timer Synchronization and Sleep

##### Why Timer Synchronization is Needed

RAIL internal timebase provides timing used for both timestamping and scheduled
transmit/receive operations. However, since the hardware timer from which the
RAIL timebase is derived from is the chip's high frequency oscillator (HFXO), it
is therefore not available in deep sleep mode (EM2 and lower).

Additionally, the RAIL timebase cannot be derived from a low frequency
oscillator as the resolution they provide isn't sufficient. However, accuracy is
only required in active transmission or reception. When the radio transceiver is
inactive, which is the case in low power energy modes, low frequency clock
accuracy is accurate enough. This raises the problem of high frequency/accuracy
time base recovery, which is necessary for radio functions when waking up from
deep sleep modes.

A mechanism allowing clock conversion from low to high frequency clock domain
can be used to recover the radio transceiver timebase. It involves one of the
EFR32's Real Time Counter (RTC) which is a hardware timekeeping feature that
remains functional in EM2. The RAIL driver software makes sure the low and high
frequency time domains are kept synchronized.

Synchronization between high and low frequency clock domain isn't a trivial
problem: the typical frequency of the RTC is 32.768 kHz, which indicates a 30
µs resolution (and it might be much worse if RTC is prescaled). If we save
the value of both timers at the same time, we immediately have up to 30 µs
error, and the same error again when we restore the RAIL timebase. That can
amount to 60 µs in some cases, which is catastrophic for highly time
sensitive protocols like BLE. For example, the BLE Inter-Frame Space (IFS) is
150 µs for indication, so 60 µs represents 40% timing error.

The solution to that problem is to save/restore the RAIL timer when the RTC
timer ticks. This way, the worst case error is twice the RAIL timer resolution,
which is 0.5us/2us, depending on the hardware (2us for EFR32xG1, 0.5us for all
others).

_Note:  This refers to the hardware timer used to generate the RAIL timebase.
The resolution of the RAIL timebase itself is 1us for all Series 1 and 2 chip
except for the EFR32xG1 family that has a resolution of 2us (same as the
hardware timer it relies on)._

##### Implementation in RAIL

Not only RAIL synchronizes the RAIL and RTC timers before entering deep sleep
and after wakeup. It also uses RTC compare to set up an interrupt, which will
wake up the MCU for the next radio operation (a PRS channel is reserved for this
purpose).

If RAIL has been configured to use the power manager, calling
[sl_rail_init_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-init-power-manager)
at initialization will automatically perform timer synchronization if the EM
transitions is performed by the power manager. Calls to
[sl_rail_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-sleep)
and [sl_rail_wake()](/rail/3.1.0/rail-api/sleep#sl-rail-wake)
are unsupported in such a scenario. Power manager support in RAIL can be
terminated by calling the
[sl_rail_deinit_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-deinit-power-manager)
routine.

The following steps indicate how the functionality works:

1. The application code start by calling[sl_rail_init_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-init-power-manager)  
   and  
   [sl_rail_config_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-config-sleep)  
   during init.
2. The application code schedules a radio operation (e.g. scheduled Tx). RAIL  
   requests EM2 from power manager.
3. The power manager decides to enter EM2, and notifies all modules that need  
   it, including RAIL.
4. RAIL synchronizes its hardware and the RTC timers.
5. RAIL sets up an RTC timer interrupt to trigger before the already set RAIL  
   timer corresponding to the scheduled RX would trigger.
6. RAIL internal hardware timer is turned off.
7. The chip enters EM2 sleep.
8. RTC wakes up the MCU.
9. The power manager restarts the main oscillator and other required clocks.  
   10. The power manager notifies all modules that need it, including RAIL that the  
   chip is returned from EM2.  
   11. RAIL synchronizes the timers.  
   12. RAIL timer is turned back on. RAIL requests EM1 from the power manager as  
   we're close to the scheduled radio operation.

![Timer Sync clock ticks](/rail-training-timersync/0.1/images/timersync-ticks.png)

Note that the internal RAIL hardware timer is still needed to start the actual
radio operation, so step 11 must be finished before the RAIL timer should be
turned back on. This means RAIL must know the time it takes to perform steps
8-11, and set the RTC timer earlier by this amount, to guarantee that the RAIL
timer is running by the time the radio operation must start. This time must be
identified by the application if power manager is not being used.

Calling the
[sl_rail_config_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-config-sleep)
routine before the first synchronization is mandatory for timer synchronization:
this function enables (`SL_RAIL_CONFIG_TIMERSYNC_ENABLED`) or disables
(`SL_RAIL_CONFIG_TIMERSYNC_DISABLED`) timer synchronization in RAIL, depending
on the `sl_rail_sleep_config_t` value in the `sl_rail_timer_sync_config_t`
argument. This will be handled internally by the power manager. With this
argument the used RTCC and PRS channel can also be specified. The set of the
available RTC timers varies on different chip families. You can select the
appropriate RTC timer in the Sleep Timer component's configuration. The default
values are:

- PRS channel 7
- A platform specific RTC (Usually ProRTC, if not available, compare channel 0  
  of RTC/RTCC)

It is recommended to use the power manager driven synchronization mechanism.
However, if you are interested in using low energy modes without using the power
manager, you can visit the old [RAIL Tutorial: Timer Synchronization and
Sleep](https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2018/10/18/rail_tutorial_timer-UhxW)
article or the examples codes provided in
[docs.silabs.com](/rail/3.1.0/rail-api/sleep).

###### Prerequisites

For the operations above, RAIL needs:

- The RTC timer should be free to use (for the synchronization).
- An RTC compare channel should be free to use (for waking up the MCU).
- A PRS channel is needed (so the synchronization can happen exactly when the  
  RTC ticks).

The RTC timer is automatically initialized and the synchronization is
managed by the `Sleep Timer` service component, while the `Power Manager`
component handles the EM transitions when it is possible.

Series 2 parts have a dedicated RTC timer for this purpose.

##### API Introduced in this Article

###### Functions

- [sl_rail_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-sleep)
- [sl_rail_wake()](/rail/3.1.0/rail-api/sleep#sl-rail-wake)
- [sl_rail_init_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-init-power-manager)
- [sl_rail_deinit_power_manager()](/rail/3.1.0/rail-api/sleep#sl-rail-deinit-power-manager)
- [sl_rail_config_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-config-sleep)

###### Types and Enums

- [sl_rail_sleep_config_t (SL_RAIL_CONFIG_TIMERSYNC_DISABLED /  
  SL_RAIL_CONFIG_TIMERSYNC_ENABLED)](/rail/3.1.0/rail-api/sleep#sl-rail-sleep-config-t)
- [sl_rail_timer_sync_config_t](/rail/3.1.0/rail-api/sl-rail-timer-sync-config-t)

#### Tx/Rx Options

RAIL provides some useful options when transmitting and receiving packets. In
this document, we're going to cover those. Also, the _Listen Before Talk_ as
well as the _Address Filtering_ features will be discussed in this article.

##### Tx Options

The main Tx options should be passed to RAIL using the
[sl_rail_tx_options_t](/rail/3.1.0/rail-api/transmit#sl-rail-tx-options-t)
parameter of the `sl_rail_start_tx()` APIs. The available options are
practically implemented as a bitmask type:

- `SL_RAIL_TX_OPTION_WAIT_FOR_ACK`: Waits for ACK after transmitting a packet.  
  I.e., the radio will automatically switch to Rx mode after Tx (disregarding  
  auto state transitions) with a given timeout.
- `SL_RAIL_TX_OPTION_REMOVE_CRC`: Ignores the config's CRC setting and does not  
  transmit CRC.
- `SL_RAIL_TX_OPTION_SYNC_WORD_ID`: If set, Tx will use the second configured  
  sync word. If unset, it will use the first one.
- `SL_RAIL_TX_OPTION_ANTENNA0`: Uses antenna 0 (usually used when 2 antennas are  
  available for antenna diversity).
- `SL_RAIL_TX_OPTION_ANTENNA1`: Uses antenna 1 (usually used when 2 antennas are  
  available for antenna diversity).
- `SL_RAIL_TX_OPTION_ALT_PREAMBLE_LEN`: Uses an alternative preamble length  
  configured by the  
  [sl_rail_set_tx_alt_preamble_length()](/rail/3.1.0/rail-api/transmit#sl-rail-set-tx-alt-preamble-length)  
  API.
- `SL_RAIL_TX_OPTION_CCA_PEAK_RSSI`: Uses peak RSSI measurement in CCA instead  
  of averaging (detailed later).
- `SL_RAIL_TX_OPTION_CCA_ONLY`: With this option the transmit after the CCA  
  should be started manually (detailed later).
- `SL_RAIL_TX_OPTION_RESEND`: If the Tx FIFO has a single, complete packet in  
  it, this option can be used the send it over on over without reloading the  
  FIFO.
- `SL_RAIL_TX_OPTION_CONCURRENT_PHY_ID`: Selects the Tx PHY when concurrent mode  
  is used in the Wi-SUN stack.

_If both `SL_RAIL_TX_OPTION_ANTENNA0/1` option is not set, the active antenna
will be the one, which was selected by the last Tx/Rx operation._

_`SL_RAIL_TX_OPTION_CCA_PEAK_RSSI` isn't supported on EFR32xG1 platforms._

The usual groups are also defined: `SL_RAIL_TX_OPTIONS_ALL`,
`SL_RAIL_TX_OPTIONS_NONE` and `SL_RAIL_TX_OPTIONS_DEFAULT` (which is the same as
`SL_RAIL_TX_OPTIONS_NONE`).

##### Rx Options

Rx options can be configured using
[sl_rail_config_rx_options()](/rail/3.1.0/rail-api/receive#sl-rail-config-rx-options),
which takes two `sl_rail_rx_options_t` parameter, `mask` and `options`. This
way, it's easy to change the options individually, without tweaking the rest.
The available options are:

- `SL_RAIL_RX_OPTION_STORE_CRC`: By default, RAIL does not store the CRC, only  
  checks it. By enabling this, it will store it as well. It can be used for  
  example for sniffer applications.
- `SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS`: Frames will be received even if it  
  failed CRC check. When enabled, the result of the CRC check will be stored in  
  the `sl_rail_rx_packet_details_t.crc_passed` field.
- `SL_RAIL_RX_OPTION_ENABLE_DUALSYNC`: Enables the detection of both sync word.
- `SL_RAIL_RX_OPTION_TRACK_ABORTED_FRAMES`: RAIL aborts frame reception when it  
  filters it using the address filter. With this option enabled, it will receive  
  the full frame (but still generates the correct error event) so the network  
  analyzer can display it (through PTI).
- `SL_RAIL_RX_OPTION_REMOVE_APPENDED_INFO`: Disables the storage of the appended  
  info. Appended info is used to store the base of  
  [sl_rail_rx_packet_details_t](/rail/3.1.0/rail-api/sl-rail-rx-packet-details-t),  
  like timestamp and RSSI. If not needed, it can be disabled, saving some buffer  
  space.
- `SL_RAIL_RX_OPTION_ANTENNA0`: Uses antenna 0 (usually used when 2 antennas are  
  available for antenna diversity).
- `SL_RAIL_RX_OPTION_ANTENNA1`: Uses antenna 1 (usually used when 2 antennas are  
  available for antenna diversity).
- `SL_RAIL_RX_OPTION_ANTENNA_AUTO`: Uses both antennas, with antenna diversity  
  (must be configured before using it).
- `SL_RAIL_RX_OPTION_DISABLE_FRAME_DETECTION`: Disables the frame detection  
  system. Useful, if you only want to check the energy of a channel, and do not  
  want to receive frames, because it would break the application's state  
  machines.
- `SL_RAIL_RX_OPTION_CHANNEL_SWITCHING`: Enables concurrent listening on two  
  IEEE 802.15.4 channels, with duty cycling. It requires a specially tuned radio  
  config and only available on a few platforms.
- `SL_RAIL_RX_OPTION_FAST_RX2RX`: Speeds up returning to receive mode after  
  finished (or aborted) receiving a packet. However, it will generate an Rx  
  error event if packet reception is completed while the previous packet is  
  still processing.
- `SL_RAIL_RX_OPTION_ENABLE_COLLISION_DETECTION`: Enables collision detection  
  required by the Wi-SUN stack.

_`SL_RAIL_RX_OPTION_IGNORE_CRC_ERRORS` affects also on ACK packets and Auto
State transition: packets with CRC error will be handled as successfully
received packets._

_`SL_RAIL_RX_OPTION_ENABLE_DUALSYNC` is not available for certain combinations
of chips, PHYs, and protocols. Also, it is not possible to listen only for
SYNC1 but not for SYNC0._

_`SL_RAIL_RX_OPTION_ANTENNA_AUTO` is not a unique value, it's actually
`SL_RAIL_RX_OPTION_ANTENNA0|SL_RAIL_RX_OPTION_ANTENNA1`_

The usual groups are also defined: `SL_RAIL_RX_OPTIONS_ALL`,
`SL_RAIL_RX_OPTIONS_NONE` and `SL_RAIL_RX_OPTIONS_DEFAULT` (which is the same as
`SL_RAIL_RX_OPTIONS_NONE`).

Some options, like the antenna selections will restart receive mode (if changed
in receive mode).

##### Listen Before Talk Options

Listen before talk setups are often required in protocols, and a good idea to
implement in some proprietary protocols as well. It solves most collisions
between transmissions.

Listen before talk operations are built up from 3 tasks:

- CCA (Clear Channel Assessment): the "listen" itself, where the radio is in Rx,  
  measuring RSSI, and decides for or against transmission
- Backoffs: randomized delays between CCA operations
- Transmission: this is the 'talk' part, in which the radio sends the  
  preconfigured packet

Measuring RSSI means averaging during a predefined period in most cases.
However, setting the `SL_RAIL_TX_OPTION_CCA_PEAK_RSSI` option makes it available
to use the peak instead of the mean RSSI value.

Generally, the radio starts with CCA: If the RSSI is below threshold, it starts
transmitting. If not, it waits a random backoff period and tries CCA again. The
radio should repeat this with increasing backoff periods, until successful
transmission or timeout.

CCA period on EFR32 is derived from symbol time, so the minimum and maximum
configurable values can differ from radio config to radio config.

The backoffs are implemented on the same timer that handles the scheduling, so
it could cause problems if you start a listen before start operation from a
scheduled Rx. Also, scheduled listen before talk Tx operations are not
supported.

###### CSMA/CA

The most common listen before talk protocol is CSMA/CA (Carrier-sense Multiple
Access with Collision Avoidance), which is fully supported by the EFR32
hardware. CSMA/CA defines backoffs as a random number with even distribution
between `0` and `unit * (2^BE - 1)`, where `BE` is the backoff exponent, which
increments with each retries.

To trigger a CSMA/CA transmission, you can start transmitting with
[sl_rail_start_cca_csma_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-csma-tx)
instead of `sl_rail_start_tx()`. The API has an extra argument, with the type of
[sl_rail_csma_config_t](/rail/3.1.0/rail-api/sl-rail-csma-config-t),
that configures the CSMA/CA parameters:

- `csma_min_bo_exp` and `csma_max_bo_exp` are setting the minimum and maximum  
  backoff exponent (i.e., the first value of `BE` will be `csma_min_bo_exp`, and  
  `BE` increments up to `csma_max_bo_exp`).
- `csma_tries` sets the number of tries (i.e., how many CCA should be performed  
  before reporting back a busy channel).
- `cca_threshold_dbm` sets a threshold for comparing against the measured RSSI  
  during the CCA; if the measured RSSI exceeds the threshold the channel will be  
  judged busy.
- `cca_backoff_us` is the backoff `unit` in μs.
- `cca_duration_us` sets the duration the CCA should take in μs (i.e., how long  
  it should measure the RSSI).
- `csma_timeout_us` sets the timeout in μs: if the CSMA/CA operation exceeds  
  this timeout it will stop. This is useful, since due to the random backoffs,  
  the CSMA/CA duration can vary. Set it to `0` to disable the timeout.

_`cca_backoff_us` will be truncated if it is higher than 511._ _Setting
`csma_tries` to 0 will disable CSMA/CA: calling `sl_rail_start_cca_csma_tx()` or
`sl_rail_start_tx()` has the same result._

There's also a special setup: if `csma_min_bo_exp` and `csma_max_bo_exp` are
both set to 0, that means a fixed backoff configuration. In this case, the
backoff will always take the time set in `cca_backoff_us`. With fixed backoff
the `cca_backoff_us` won't be truncated.

###### LBT

Another common listen before talk protocol is the obviously named LBT. It is
defined in ETSI EN 300 220-1, under the Polite Spectrum Access chapter.

LBT defines backoffs as a `unit * BO`, where `BO` is a random number with even
distribution between a minimum and maximum.

LBT is not supported by the EFR32 hardware, it is converted to a CSMA/CA
configuration in RAIL. Because of this, if you can choose between the two, you
should choose CSMA/CA.

_Note that LBT can be configured with a minimum backoff limit, while CSMA/CA's
minimum backoff period is always 0. This is not supported by the hardware, so
LBT is implemented with a bit of cheating. The CCA period is set to the
configured `period + unit * minBO`. It doesn't really matter if the CCA period
is longer, and this guarantees that the minimum backoff is fulfilled._

_Another limitation is that the maximum backoff must be power of 2, so the
configured backoff will be rounded to the closest power of 2._

Much like CSMA/CA, LBT has its own `start_tx` API,
[sl_rail_start_cca_lbt_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-lbt-tx),
which has a familiar config struct,
[sl_rail_lbt_config_t](/rail/3.1.0/rail-api/sl-rail-lbt-config-t) to
configure the LBT parameters:

- `lbt_min_bo_rand` and `lbt_max_bo_rand` are setting the limits of the random  
  backoff, just like with CSMA/CA
- `lbt_tries` sets the number of tries, similarly to CSMA/CA
- `lbt_backoff_us` is the backoff `unit` in μs
- `lbt_threshold_dbm` is a similar threshold what we've seen in CSMA/CA
- `lbt_duration_us` sets the duration the CCA should take in μs
- `lbt_timeout_us` sets the same timeout as CSMA/CA

_Setting `lbt_tries` to 0 will disable LBT, just like with CSMA/CA._

###### Custom Listen Before Talk

A single CCA operation can be started using `SL_RAIL_TX_OPTION_CCA_ONLY` and
with `lbt_tries` set to 1. With this and software timers, a custom listen before
talk protocol can be implemented. Additionally, the RSSI API
([sl_rail_get_rssi()](/rail/3.1.0/rail-api/receive#sl-rail-get-rssi)
and
[sl_rail_start_average_rssi()](/rail/3.1.0/rail-api/receive#sl-rail-start-average-rssi))
can be also used for similar purposes.

##### Address Filtering

EFR32 supports hardware based address filtering, as long as the address is
stored in the same location in all the frames (unlike 802.15.4, which is only
supported through the [protocol specific
API](/rail/3.1.0/rail-api/ieee802-15-4)). EFR32 supports **2
address fields** (e.g., for group and device address), both can be **up to 8
Bytes long**. Both fields can be configured for **up to 4 addresses** (e.g., for
broadcast, unicast and 2 multicast address). Any combination can be allowed on
these two fields, e.g., enable `address1` for `field0` only if `field1` has
`address1`, or if `field0` has `address2`, anything is allowed on `field1`.

Enabling the address filter starts with configuring it, using:

```c
sl_rail_addr_config_t addr_config = {
    .offsets = {2, 0},
    .sizes = {4, 0},
    .match_table = SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD,
};
sl_rail_config_address_filter(rail_handle, &addr_config);
```

Its only parameter (apart from the usual `rail_handle`) is `sl_rail_addr_config_t`.
`sl_rail_addr_config_t` configures:

- `offsets[(2)]`, which sets the offset of the addresses in the frame. For the  
  first field, from the end of sync word; for the second field, from the end of  
  the first field. Note that this means that the fields cannot overlap.
- `sizes[(2)]`, which sets the size of the fields in byte. Setting it to 0  
  disables the field.
- `match_table`, which configures the enabled combinations of the fields.

If you only use a single field, you can safely use
[SL_RAIL_ADDR_CONFIG_MATCH_TABLE_SINGLE_FIELD](/rail/3.1.0/rail-api/address-filtering#sl-rail-addr-config-match-table-single-field).
If you need both address fields, you should understand how the match table
works. That is out of the scope of this article, but you can rely on the [API
documentation](/rail/3.1.0/rail-api/address-filtering).

Next, you load the addresses, using:

```c
uint8_t address[4] = {0xAA, 0xBB, 0xCC, 0xDD};
sl_rail_set_address_filter_address(rail_handle, 0, 1, address, true);
```

Which will enable the address 0xAABBCCDD on field 0, index 1, in enabled state.
Make sure your address length matches what you configured for the field. You can
later disable (and re-enable) it with:

```c
sl_rail_enable_address_filter_address(rail_handle, false, 0, 1);
```

Note that this API is referencing the address by its field and index. If you
want to enable/disable addresses based on the value, i.e., the address itself,
you should track which index is used for each address.

Finally, to enable (or disable) the whole address filter, use:

```c
sl_rail_enable_address_filter(rail_handle, true);
```

Once address filter is enabled, you can get notifications on filtered frames
using the
[SL_RAIL_EVENT_RX_ADDRESS_FILTERED](/rail/3.1.0/rail-api/events#sl-rail-event-rx-address-filtered)
event.

##### API Introduced in this Article

###### Functions

- [sl_rail_set_tx_alt_preamble_length()](/rail/3.1.0/rail-api/transmit#sl-rail-set-tx-alt-preamble-length)
- [sl_rail_config_rx_options()](/rail/3.1.0/rail-api/receive#sl-rail-config-rx-options)
- [sl_rail_start_cca_csma_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-csma-tx)
- [sl_rail_start_cca_lbt_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-lbt-tx)
- [sl_rail_config_address_filter()](/rail/3.1.0/rail-api/address-filtering#sl-rail-config-address-filter)
- [sl_rail_set_address_filter_address()](/rail/3.1.0/rail-api/address-filtering#sl-rail-set-address-filter-address)
- [sl_rail_enable_address_filter_address()](/rail/3.1.0/rail-api/address-filtering#sl-rail-enable-address-filter-address)
- [sl_rail_enable_address_filter()](/rail/3.1.0/rail-api/address-filtering#sl-rail-enable-address-filter)

###### Types and Enums

- [sl_rail_tx_options_t](/rail/3.1.0/rail-api/transmit#sl-rail-tx-options-t)
- [sl_rail_rx_options_t](/rail/3.1.0/rail-api/receive#sl-rail-rx-options-t)
- [sl_rail_csma_config_t](/rail/3.1.0/rail-api/sl-rail-csma-config-t)
- [sl_rail_lbt_config_t](/rail/3.1.0/rail-api/sl-rail-lbt-config-t)
- [sl_rail_addr_config_t](/rail/3.1.0/rail-api/sl-rail-addr-config-t)

#### FIFO Mode

Like most embedded radio platforms, EFR32 provides a way to download/upload
packets during reception/transmission, respectively. So, for example, while
you're sending the first couple of bytes of your frame, you can still upload the
end of the frame.

Since the radio is using ring buffers in this mode, this makes it possible to
handle longer frames than what fits into the buffer, and nowadays, this is
pretty much the only reason to use FIFO mode. A typical use case for example is
a protocol, where almost all of the frames fits into 128B buffer, but in rare
cases, the protocol must handle 512B long frames. In this article, the examples
will present how to do that. When creating a Tx ring buffer, make sure its size
is a power of two and keep it between 64 and 4096 bytes.

Another case when FIFO mode is required are some Direct and IQ modes. Setting up
those are detailed in a [dedicated
article](/rail/3.1.0/rail-developers-guide-direct-mode), but
FIFO handling is the same as documented here.

##### Advanced Packet Mode Features

If you have to look into the packet during reception (e.g., because you will use
[sl_rail_set_fixed_length()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-set-fixed-length)
to handle a frame length coding which is not supported by hardware), you
shouldn't use FIFO mode. Instead, you can use
[sl_rail_peek_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-peek-rx-packet)
to look into the packet, but still keeping it in the buffer, and only
downloading it when you got the full frame.

If you need longer packets, you can customize both the Tx and Rx FIFO length,
via
[sl_rail_set_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-tx-fifo)
and
[sl_rail_set_rx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-fifo).

If you want to have multiple frames in the buffer, there's also no reason to use
FIFO mode: you can handle multiple frames without problems using packet mode.
Before transmit, you can use the same APIs
([sl_rail_set_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-set-tx-fifo)
and
[sl_rail_write_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-write-tx-fifo))
to write multiple packets, while you can store the packet_handles in Rx mode and
keep them in buffer using
[sl_rail_hold_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-hold-rx-packet)
(except with DMP, but that would make the use of FIFO mode difficult as well).

##### Differences in FIFO Mode

Switching to FIFO mode doesn't actually do anything on the transmit side (since
RAIL 2.0), but changing the receiver to FIFO mode slightly changes the behavior
of the receive buffer:
[sl_rail_get_rx_packet_info()](/rail/3.1.0/rail-api/packet-information#sl-rail-get-rx-packet-info)
(the usual way to access the received packet) won't work. You must use
[sl_rail_read_rx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-read-rx-fifo).
Also, RAIL won't provide information on the frame length, and you should be
careful to read exactly as many bytes as your frame; otherwise you might corrupt
the next packet: E.g., if you leave the end of the packet in the FIFO, you will
probably download it as the beginning of the next packet, corrupting that frame
as well.

##### Enabling FIFO Mode

The easiest way to enable FIFO mode is on the **RAIL Utility, Initialization**
component:

![FIFO setup](/rail-training-special-data-modes/0.1/images/fifo-v6.png)

This calls
[sl_rail_config_tx_data()](/rail/3.1.0/rail-api/data-management#sl-rail-config-tx-data)
and
[sl_rail_config_rx_data()](/rail/3.1.0/rail-api/data-management#sl-rail-config-rx-data)
during init with the following parameters:

```c
sl_rail_tx_data_config_t tx_data_config = {
  .tx_source = SL_RAIL_TX_DATA_SOURCE_PACKET_DATA,
  .tx_method = SL_RAIL_DATA_METHOD_FIFO_MODE, //doesn't do anything
};
sl_rail_rx_data_config_t rx_data_config = {
  .rx_source = SL_RAIL_RX_DATA_SOURCE_PACKET_DATA,
  .rx_method = SL_RAIL_DATA_METHOD_FIFO_MODE,
};
sl_rail_config_tx_data(rail_handle, &tx_data_config);
sl_rail_config_rx_data(rail_handle, &rx_data_config);
```

However, to properly use FIFO mode, you probably want to know when the FIFO
fills up/runs out of data. This is configured as below:

```c
sl_rail_set_tx_fifo_threshold(rail_handle, TX_BUFFER_SIZE / 10);
sl_rail_set_rx_fifo_threshold(rail_handle, RX_BUFFER_SIZE - RX_BUFFER_SIZE / 10);
sl_rail_config_events(rail_handle, SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY | SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL,
                      SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY | SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL);
```

This sets the thresholds to 10% from being empty/full (for Tx and Rx,
respectively), which is usually a good value, although you might want to
increase it at high data rates (RX_BUFFER_SIZE should be 512B with the default
**RAIL Utility, Initialization**, if you did not customize the receive FIFO via
sl_rail_config_t or sl_rail_set_rx_fifo()). Finally, it enables the two
"threshold reached" events.

##### Using FIFO Mode: Transmit

On the transmit side, the idea is to fill the buffer completely, start the
transmission, and fill the remaining when needed:

```c
#define PACKET_LENGTH 1024
uint8_t packet_to_send[PACKET_LENGTH];
volatile uint16_t tx_offset;
void start_tx(){
  tx_offset = sl_rail_write_tx_fifo(rail_handle, packet_to_send, PACKET_LENGTH, false);
  sl_rail_start_tx(rail_handle, 0, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);
}

void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events){
  if ( (events & SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY) && ( tx_offset < PACKET_LENGTH ) ){
    tx_offset += sl_rail_write_tx_fifo(rail_handle, packet_to_send+tx_offset, PACKET_LENGTH-tx_offset, false);
  }
}
```

This is just the related code; you probably have more events handled. If you
look at the calls of
[sl_rail_write_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-write-tx-fifo),
you can see that we always try to write the whole (remaining) packet, and do not
check how much space we have in the FIFO. We could do that, using
[sl_rail_get_tx_fifo_space_available()](/rail/3.1.0/rail-api/data-management#sl-rail-get-tx-fifo-space-available),
but it's not necessary.
[sl_rail_write_tx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-write-tx-fifo)
will automatically stop when the FIFO is full, and return with the number of
bytes successfully written. We do the same in the event, but we're adjusting
both the source and the size with `tx_offset`. The condition `tx_offset < PACKET_LENGTH` is important, because the FIFO events do not check packet
lengths. unless you have multiple packets in the buffer, you'll get an
[SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](/rail/3.1.0/rail-api/events#sl-rail-event-tx-fifo-almost-empty)
every time when you have just threshold amount of bytes remaining of your packet
(since it's normal to have an empty buffer if you don't want to send anything).

##### Using FIFO Mode: Receive

The receive side is basically the opposite of the transmit side:

```c
#define PACKET_LENGTH 1024
uint8_t packet_to_receive[PACKET_LENGTH];
volatile uint16_t rx_offset = 0;

void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events){
  if ( events & SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL ){
   rx_offset += sl_rail_read_rx_fifo(rail_handle, packet_to_receive+rx_offset, PACKET_LENGTH - rx_offset);
  }
  if ( events & SL_RAIL_EVENTS_RX_COMPLETION ){
   if ( events & SL_RAIL_EVENT_RX_PACKET_RECEIVED ){
    if ( rx_offset < PACKET_LENGTH ){
    rx_offset += sl_rail_read_rx_fifo(rail_handle, packet_to_receive+rx_offset, PACKET_LENGTH - rx_offset);
    }
    sl_rail_rx_packet_details_t packet_details = {
       .is_ack = false,
       .time_received = {
        .time_position = SL_RAIL_PACKET_TIME_AT_SYNC_END,
        .total_packet_bytes = PACKET_LENGTH,
       },
    };
    sl_rail_get_rx_packet_details(rail_handle, SL_RAIL_RX_PACKET_HANDLE_NEWEST, &packet_details);
   }
   rx_offset = 0;
 }
}
```

We start with an empty `packet_to_receive`, and the first thing we receive will
be a single or multiple
[SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](/rail/3.1.0/rail-api/events#sl-rail-event-rx-fifo-almost-full)
(alternatively,
[SL_RAIL_EVENT_RX_SYNC_0_DETECT](/rail/3.1.0/rail-api/events#sl-rail-event-rx-sync-0-detect)/[SL_RAIL_EVENT_RX_SYNC_1_DETECT](/rail/3.1.0/rail-api/events#sl-rail-event-rx-sync-1-detect)
could be handled to set up `packet_to_receive` for reception).

Each time we get that event, we download as much from the FIFO as we can, and
adjust the offset (again, we could check the amount of data in the FIFO using
[sl_rail_get_rx_fifo_bytes_available()](/rail/3.1.0/rail-api/data-management#sl-rail-get-rx-fifo-bytes-available),
but it's not necessary). When we get the
[SL_RAIL_EVENT_RX_PACKET_RECEIVED](/rail/3.1.0/rail-api/events#sl-rail-event-rx-packet-received),
we probably still have some data remaining in the FIFO, so we download that.

Then we get the `packet_details`, just like we do for a normal packet. **This
step is very important** if you can't reset the FIFO between packets. If you
leave the appended info in the FIFO, it will remain there and will be difficult
to figure out where the next packet starts.

Finally, we reset the offset to be ready for the next packet, both on successful
receive and errors.

Since this was a fixed length setup, there was no need to figure out the length.
In variable length mode, you probably want to download the length field only
first, set up a global variable with the length, and continue just like the
above sample.

##### API Introduced in this Article

###### Functions

- [sl_rail_peek_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-peek-rx-packet)
- [sl_rail_read_rx_fifo()](/rail/3.1.0/rail-api/data-management#sl-rail-read-rx-fifo)
- [sl_rail_config_tx_data()](/rail/3.1.0/rail-api/data-management#sl-rail-config-tx-data)
- [sl_rail_config_rx_data()](/rail/3.1.0/rail-api/data-management#sl-rail-config-rx-data)
- [sl_rail_set_tx_fifo_threshold()](/rail/3.1.0/rail-api/data-management#sl-rail-set-tx-fifo-threshold)
- [sl_rail_set_rx_fifo_threshold()](/rail/3.1.0/rail-api/data-management#sl-rail-set-rx-fifo-threshold)
- [sl_rail_get_tx_fifo_space_available()](/rail/3.1.0/rail-api/data-management#sl-rail-get-tx-fifo-space-available)
- [sl_rail_get_rx_fifo_bytes_available()](/rail/3.1.0/rail-api/data-management#sl-rail-get-rx-fifo-bytes-available)

###### Types and Enums

- [sl_rail_tx_data_config_t](/rail/3.1.0/rail-api/sl-rail-tx-data-config-t)
- [sl_rail_rx_data_config_t](/rail/3.1.0/rail-api/sl-rail-rx-data-config-t)
- [sl_rail_data_method_t](/rail/3.1.0/rail-api/data-management#sl-rail-data-method-t)  
  (SL_RAIL_DATA_METHOD_FIFO_MODE / SL_RAIL_DATA_METHOD_PACKET_MODE)
- [SL_RAIL_EVENT_TX_FIFO_ALMOST_EMPTY](/rail/3.1.0/rail-api/events#sl-rail-event-tx-fifo-almost-empty)
- [SL_RAIL_EVENT_RX_FIFO_ALMOST_FULL](/rail/3.1.0/rail-api/events#sl-rail-event-rx-fifo-almost-full)

#### Low duty Cycle Mode

##### Introduction and Motivation

Low Duty Cycle (LDC, sometimes just Duty Cycle) by definition means switching
something periodically on and off. However, in the context of low power radios,
we usually use it for receive mode only. In this case, the radio is switching
between a low power, long duration sleep state and short active states, wherein
the radio is in receive state looking for valid preamble. In this way, the radio
is able to save a huge amount of power.

Furthermore this operation is automatic, meaning no MCU intervention is needed
for scheduling receive intervals, saving more energy. Typically an interrupt
line or events are used to indicate a valid packet's arrival.

###### Synchronous and Asynchronous Duty Cycling

Duty cycling radio protocols can be sorted into asynchronous or synchronous
protocols. Asynchronous means that the receiver doesn't know when the
transmitter would send a packet, while in synchronous mode. As its name implies,
there is temporal synchronization between the two connected parts; the messages
will be sent at a specified time.

Some widely used protocols use LDC (e.g. Bluetooth low energy) in synchronized
networks. By spending energy and time for synchronization, the receiver can
receive all the packets while it is in sleep state most of the time.

However, in some cases, the overhead required by the synchronization doesn't
worth it, e.g. if you need to receive messages from a transmitter that rarely
sends anything. In such cases, you probably want to use asynchronous duty
cycling on the receiver, but in such cases the transmitter cannot predict when
the receiver is listening. The goal of this KBA is to solve this problem, and
explain **how asynchronous LDC works**.

In this document, the theoretical configuration of LDC will be illustrated with
application examples (general use cases), and at last some implementation notes
will be shown for both EZRadioPRO and EFR32 devices.

##### Theory of LDC

The main idea behind the LDC is to move the power consumption of Rx to the Tx
side. Though in LDC mode, both side are strongly dependent to each other focus
on the Rx side first and assume an optimal Tx.

###### Rx Side Considerations - Preamble Detection Period

To minimize the receiver's side average power consumption, the time spent in
active state should be minimized. What's the minimum time to keep the receiver
on? When and how could the receiver detect an incoming message? What is this
event? There are [more
options](https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2016/01/22/ezradiopro_auto_freq-8oA7)
for the receiver to detect an incoming message, but we concentrate only to the
preamble detection case.

In preamble detection duty cycle mode the radio periodically wakes up for a
short duration to look for a preamble. When a valid preamble is detected, the
radio remains in receive state until the packet is fully received (or an error
detected during reception).

Note that the original goal of the preamble is to achieve bit synchronization of
the incoming signal (or to restore the clock signal in other words). Therefore,
the preamble should always be at least as long as it needs to be to reliably
achieve this task. Most radio's datasheets
([Si4460/1/3/4](https://www.silabs.com/documents/public/data-sheets/Si4464-63-61-60.pdf)
p. 28.) recommend selecting preamble length and preamble detection threshold
(aka. preamble detection period), which is a minimal value to achieve 0% PER.

Define the following receiver time terms:

- **Tpdp**: preamble detection period
- **Tron**: receiver's active state time (it should be longer, than the preamble  
  detection period)
- **Tsleep**: receiver's sleep state time

and ignore other timing constraints, like wake-up time, radio state transition
time, etc.

From this point, assume optimal Rx, and focus on the Tx side.

###### Tx Side Consideration - Application Examples - LDC in Asynchronous Networks

There is tradeoff between the Rx side's and the Tx side's power consumption:
longer sleep period infer longer transmission time (see the examples section).

There are two widely used scenario to ensure package reception on the receiver
side in asynchronous networks, one called as "Duty cycle" mode, and the other is
the "Master-slave" or "Master blast" mode.

###### Duty-cycle Mode (heading level 7)

This mode requires a packet with a very long preamble at the transmitter side.
For the simplest example, assume the active time (Ton) and the sleep period (Ts)
are given. In this case, the transmitter should have at least

**Tpream** = 2 * **Tron** + **Tsleep**

long preamble to make sure all packets will be received, independent of the
receiver state when the transmission started. The rest of the packet is
transmitted in **Trest** time.

In the worst case scenario, the transmitter starts transmitting slightly after
the receiver wakes up, and does not provide long enough preamble for detection
(Tpdp) in this wake-on period, continues the transmission during the receiver is
in sleep state (Tsleep), and for the next active period (Tpdp+Trest), where the
receiver finally detects the packet. This is shown in the picture below.

![scenario - Duty-cycle
mode](/rail-training-low-duty-cycle/0.1/images/duty-cycle-mode.png)

Compared to the case when the receiver is always in receive state, Duty-cycle
mode saves approximately the duty-cycle proportion of power on the receiver
side.

###### (Unsynchronized) Master-slave Mode (heading level 7)

The master term refers to the transmitter and the slave term to the receiver(s).

This mode has a similar idea, but instead of one packet with long period it uses
transmit burst with short packets back to back, which transmit time, **Tburst**,
should fit to Tpream determined in the Duty-cycle mode (the preamble length is
much shorter in this mode but it has to fit to Tpdp time at least, and we will
call it Tpream). Usually the rest of the packet (syncword, header, payload, CRC,
etc.) is for Trest time in the air.

![scenario - Master-slave
mode](/rail-training-low-duty-cycle/0.1/images/master-slave-mode.png)

The slave must be in active state at least 2 * Tpream + Trest = Tron long, which
is higher than in the Duty-cycle mode for ensuring packet reception for every
case.

###### Comparison of Applications (heading level 7)

The downside of Duty cycle mode comes up when the radio wakes on the beginning
of the preamble. This implies a long active period due to waiting for the whole
packet. Furthermore, the radio has to handle if the preamble is lost, then
reacquired due to interference. Finally, it's fairly easy for a malicious source
to cause problems; it's easy to generate an infinite preamble.

On the other hand, with Master-slave mode the receiver only needs to be active
for as long as it receives a single, short packet. The downside of Master-slave
mode is that the receiver must be in active state as long as the longest
possible packet is; otherwise it could miss the preamble of the packet.

Therefore the selection of application strongly depends on the protocol, or
rather, the used protocol needed to define the LDC application mode.

###### Possible Improvements in Master-slave Mode

With Master-slave mode, it is possible to improve the performance and energy
consumption. For example, the transmitter could check for an ACK after each
transmit. If the transmission was acknowledged, the transmitter can stop. The
drawback with this is that this only works with a single receiver, and the
active period of the receiver should be extended to include the time the
transmitter spends to wait for an ACK.

Another method to improve Master-slave mode is to use a specific "wake-up"
message, and not the actual data. This wake-up message only tells the receiver
when the actual data will be transmitted and the receiver can wake-up again for
that. This worsens the power consumption on both receiver and transmitter side,
but the data length doesn't affect the active time on the slave any more.

##### Note About Preamble Detection Selection

Low detection threshold may lead to misdetection and sensitivity loss, but
halting the receiver longer in active state increases energy consumption.

Therefore the threshold should be good enough to achieve the required packet
error rate. Note that the data rate may also impact on the threshold selection.

##### Implementation on EZRadioPRO

EZRadioPro devices have a low frequency (32 KHz) clock system, called as WUT
(Wake-Up Timer). It can be operated from an external or an internal clock source
(see in the API documentation for **GLOBAL_CLK_CFG** register, **CLK_32_SEL**
bit fields). The radio uses this clock during sleep state for generating wake-up
signal (the WUT activity distinguishes between sleep and standby states),
thereby WUT supports LDC mode (and Low Battery Detection as well) by hardware.

Registers with **GLOBAL_WUT** prefix related to this timer. Both the sleep
period and the active period (documentation calls it LDC period) should be set
with a mantissa (**WUT_M** and **WUT_LDC** bitfields) and a common exponent
(**WUT_R** bitfields). The active period may be less than the configured LDC
period, when a packet arrived before its expiration (as shown in the second
picture). We signed LDC period as Tron and sleep period as Tsleep.

Next to the periods, the preamble detection threshold should be configured. It
determines the number of valid preamble bits the radio must receive to qualify a
valid preamble. A shorter Preamble Detection Threshold may be chosen if
occasional false detections can be tolerated. This threshold can be set through
the **PREAMBLE_CONFIG_STD_1** register's **RX_THRESHOLD** bitfields, and all the
other preamble related settings are located in the 0x10 Group of the registers.

After issuing a **START_RX** command, the radio's high frequency crystal should
be started up, and the PLL requires some calibration time (see
[AN585](https://www.silabs.com/documents/public/application-notes/AN585.pdf)
p.1.). This should be take into consideration to set the receive time correctly.

Further documentation:

- LDC EZRadioPRO can be found in the  
  [AN585](https://www.silabs.com/documents/public/application-notes/AN585.pdf),  
  which describes Master-slave mode more in depth.
- [How does preamble detection threshold  
  work](https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2009/01/26/how_does_preamblede-it0O).
- [Detection of the absence of a  
  signal](https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2016/01/22/ezradiopro_auto_freq-8oA7).
- [How to set Tx preamble length and preamble detection  
  period](https://www.silabs.com/community/wireless/proprietary/knowledge-base.entry.html/2016/01/22/ezradiopro_auto_freq-EbXn),  
  for a frequency hopping application, but it can still used for an LDC  
  application as well.

##### Implementation on EFR32

EFR32 devices have LDC (although this feature called as Duty Cycle mode)
implemented as part of Channel Hopping feature. The theory is similar to that,
which was described for EZRadioPRO devices, but here is a simpler
implementation, only two relevant APIs should to know:

- [sl_rail_config_rx_duty_cycle()](/rail/3.1.0/rail-api/rx-channel-hopping#sl-rail-config-rx-duty-cycle):  
  configures the mode and timing for the Duty Cycle operation
- [sl_rail_enable_rx_duty_cycle()](/rail/3.1.0/rail-api/rx-channel-hopping#sl-rail-enable-rx-duty-cycle):  
  enables radio's receiver  
  ([sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)  
  or  
  [sl_rail_start_scheduled_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-scheduled-rx)  
  API should be called after this).
- [SL_RAIL_EVENT_RX_DUTY_CYCLE_RX_END](/rail/3.1.0/rail-api/events#sl-rail-event-rx-duty-cycle-rx-end):  
  event triggered after a complete active-sleep period, where  
  ([sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)  
  or  
  [sl_rail_start_scheduled_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-scheduled-rx)  
  should be called again

For complete documentation, visit the [API
documentation](/rail/3.1.0/rail-api/rx-channel-hopping).

Note that the APIs do not put the MCU itself into sleep state. The easiest way
to do that is to use the Power Manager service, which is fully supported by
RAIL. This is documented in the [Power Manager
article](/rail/3.1.0/rail-training-power-manager).

Notes:

- The sl_rail_config_rx_duty_cycle() and the sl_rail_enable_rx_duty_cycle() APIs are not  
  supported on the EFR32XG1 family of chips, and in multiprotocol applications.
- The sl_rail_config_rx_duty_cycle() and the sl_rail_enable_rx_duty_cycle() APIs  
  must not be called while the radio is on.
- There is a Duty Cycle example in the RAIL SDK, demonstrating the APIs above.

#### Interrupt and Thread Safety in RAIL

In embedded software development, some of the most complicated debug challenges
are caused by calling non-reentrant functions in interrupt context. Hence, it's
in the developer's best interest to carefully design their application to avoid
these scenarios.

To do so, however, requires sufficiently detailed knowledge of the interrupts
and API functions - which are not accessible in a closed-source product like
RAIL. This document aims to provide the information required to develop
interrupt- and thread-safe applications in RAIL.

##### Thread Safety

In an application without a task scheduler, only an interrupt request can
interrupt the main program. If you use a preemptive scheduler, like the
scheduler available in most embedded OSes, higher priority tasks can interrupt
lower priority tasks as well. Regardless, when looking at the RAIL APIs, the
same concerns are present in either case:

- Is it safe to interrupt this API?
- Is it safe to call this API from a thread/interrupt which interrupted  
  something?

##### The Event Handler

RAIL uses an event handler, which is set up by
[sl_rail_init()](/rail/3.1.0/rail-api/general#sl-rail-init).
In our examples, it's usually called `sl_rail_util_on_event()`. This function is
called by the RAIL library, and it's **almost always called from an interrupt
handler**. This means the event handler should be used with care:

- It should be kept in mind that interrupts are disabled when the event handler  
  is running, so the function must not take long to return.
- More importantly, the function might be interrupting the main loop (or some  
  other task).

_Note that the first point above might not be completely true if interrupt
priorities are used, in which case only interrupts at the same and lower
priorities are disabled. However, the event handler will never be interrupted by
another event handler as all RAIL interrupts must be used at the same priority._

##### General Rules for the RAIL API

First, let's collect the general rules of the API, and we'll detail exceptions
in later points:

1. Calling any RAIL API from the main thread (or a single OS thread) is  
   **safe**.
2. Calling any API from multiple threads is **unsafe**, except for DMP.
3. Calling most APIs from an interrupt handler is **safe** (see exceptions  
   below).

##### Dynamic Multiprotocol (DMP)

In general, if you have a multi-threaded application, you should use RAIL from a
single thread. The exception to this guidance is DMP, where in most cases each
protocol runs in its own thread. In this scenario, using RAIL from each thread
is safe, as each protocol has its own `rail_handle`. So, a more generalized
wording of rule 2 is:

_Calling any API from multiple threads is only safe if each thread has a
dedicated `rail_handle`, and each thread only accesses RAIL with its own
handle._

The few APIs that don't use `rail_handle` - like
[sl_rail_get_time()](/rail/3.1.0/rail-api/system-timing#sl-rail-get-time),
[sl_rail_sleep()](/rail/3.1.0/rail-api/sleep#sl-rail-sleep) , or
[sl_rail_wake()](/rail/3.1.0/rail-api/sleep#sl-rail-wake) - can be
called from any thread.

##### Interrupt Safety in General

In general, calling an API which changes the radio state (i.e., between Rx, Idle
and Tx) can be risky. **The simplest way to write interrupt safe application is
to not call state changing APIs from any interrupt handler, including the RAIL
event handler.** This can be achieved by setting a flag or changing a state
variable in the event handler instead of calling an API directly:

```c
typedef enum  {
  S_IDLE,
  S_START_RX,
  S_START_TX,
} state_t;

volatile state_t state;
volatile sl_rail_time_t last_event;

int main(){
  //init code

  state = S_START_TX;
  while(1){
    switch(state){
      case S_START_TX:
        sl_rail_start_tx(rail_handle, 0, SL_RAIL_TX_OPTIONS_DEFAULT, NULL);
        state = S_IDLE;
        break;
      case S_START_RX:
        sl_rail_start_rx(rail_handle, 0, NULL);
        state = S_IDLE;
        break;
      default:
        break;
    }
  }
  return 0;
}

void sl_rail_util_on_event(sl_rail_handle_t rail_handle, sl_rail_events_t events)
{
  last_event = sl_rail_get_time(rail_handle);
  if ( events & SL_RAIL_EVENTS_TX_COMPLETION ){
    state = S_START_RX;
    sl_rail_set_tx_power(rail_handle, 200);
  }
}
```

Note that some RAIL APIs were called from the event handler, but none of those
were state changing APIs.

##### Interrupt Safety with State Changing APIs

In some (usually time critical) cases however, it's not possible to avoid
calling state changing APIs from the event handler (or other interrupt handler).
State changing APIs are not always risky: Some APIs might be safe, as long as
they don't interrupt another specific API.

Hence, in the following list, we identify the risky API after first specifying
which initially-running (i.e., "interrupted") API makes it risky (and how).
We've included in this list some interrupt combinations that might be "safe",
but the end result is not predictable - i.e., the radio might be in Rx or in
Idle, depending on which API is called first.

- Interrupting `sl_rail_start_<something>()` with another  
  `sl_rail_start_<something>()` is risky, especially if they would start on  
  different channels.
- Interrupting `sl_rail_idle(handle, <something>, true)` with any  
  `sl_rail_start_<something>()` is risky.
- Interrupting `sl_rail_idle(handle, <something>, false)` with any  
  `sl_rail_start_<something>()` is safe, but the end result is not predictable  
  (i.e., the radio will either be in Idle, or start the requested operation).
- Interrupting `sl_rail_start_<something>()` with `sl_rail_idle()` is safe but  
  the end result is not predictable, and might cause strange events (see the  
  next section for details).
- Interrupting `sl_rail_stop_tx_stream()` with any `sl_rail_start_<something>()`  
  is **very** risky (the radio might remain in test configuration and start  
  transmitting/receiving).
- Interrupting `sl_rail_stop_tx()` is safe. Interrupting `sl_rail_stop_tx()`  
  with `sl_rail_start_<something>()` is safe but the end result is not  
  predictable (i.e., the radio will either be in Idle, or start the requested  
  operation).
- Interrupting anything with `sl_rail_stop_tx()` is safe (see next section for  
  important clarification). Interrupting `sl_rail_start_tx()` with  
  `sl_rail_stop_tx(handle, SL_RAIL_STOP_MODE_ACTIVE)` is safe, but not  
  predictable.
- Interrupting anything with `sl_rail_stop_tx_stream()` is safe. Interrupting  
  `sl_rail_start_tx_stream()` with `sl_rail_stop_tx_stream()` is safe but not  
  predictable.

##### sl_rail_idle in the Event Handler

Calling
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
or `sl_rail_stop_tx(rail_handle, SL_RAIL_STOP_MODE_ACTIVE)` from the event
handler might cause strange results. For example, let's say you're receiving on
a channel and want to detect preambles using the event
`SL_RAIL_EVENT_RX_PREAMBLE_DETECT` and `SL_RAIL_EVENT_RX_PREAMBLE_LOST`. The
following scenario may unfold:

- Preamble lost interrupt is received, so (at least) other radio interrupts are  
  temporarily disabled.
- You enter the event handler with `SL_RAIL_EVENT_RX_PREAMBLE_LOST`.
- At this point, the radio detects a preamble. The interrupt is logged, but the  
  handler cannot run since the interrupts are masked.
- Still in the event handler, you decide to turn off the radio with  
  `sl_rail_idle(railHandle, SL_RAIL_IDLE_ABORT, true)`.
- The radio turning off will generate a preamble lost interrupt.
- The radio is now off, and you return from the event handler.
- Interrupts are enabled again, so the pending preamble detect interrupt handler  
  starts running.
- You enter the event handler with `SL_RAIL_EVENT_RX_PREAMBLE_DETECT` and  
  `SL_RAIL_EVENT_RX_PREAMBLE_LOST` both set at the same time.

So you end up with a preamble detect event, even though the radio is **off**.
This is usually harmless, since you always have the `_LOST` or `_ABORTED` event
as well, but this demonstrates why your design must carefully consider in what
order to handle events.

The easiest way to avoid this conflicted outcome is to disable the events that
might cause problems when turning off the radio.

Another way to avoid this issue is to use `sl_rail_idle(rail_handle,
SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true)`, which will clear the pending
interrupts. However, using
[SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-force-shutdown-clear-flags)
has other drawbacks. It does force the radio state machine to idle state, and it
might corrupt the transmit or receive FIFOs - in which case it must clear them,
losing all data that might already be in there. It could also take more time to
finish running than
[SL_RAIL_IDLE_ABORT](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-abort).

##### Critical Blocks

One usual way to avoid internal safety issues is to create critical (a.k.a.
atomic, although in case of EFR32, their meaning can be different) blocks, in
which interrupts are disabled, in the main thread to make sure some code segment
is never interrupted. However, this can create other problems, so it should be
used carefully. There's no general rule to avoid this kind of "collateral
damage", but here's an example that should be avoided:

RSSI averaging is running, and just before it finishes, we interrupt it with
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx)
which is called from a critical block. The following race condition could
happen:

- We enter the critical block, interrupts are disabled.
- RSSI averaging done interrupt is received, but the interrupt handler won't  
  start since interrupts are masked.
- StartTx turns off the radio, prepares it for transmit, then starts  
  transmitting.
- We leave the critical block, interrupts are enabled again.
- RSSI averaging done interrupt handler runs at this point which will turn off  
  the radio, aborting the current transmit.

One way to avoid the problem above is to clear interrupts in the critical block.
This can be done by using `sl_rail_idle(handle,
SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS, true)` at the beginning of the critical
block, but the drawbacks of doing so (mentioned above) should be kept in mind.
In general, it's better to avoid risky interrupts without using critical blocks
in the main thread.

##### Using FORCE_SHUTDOWN

In the two sections above we mentioned two usecases where
`SL_RAIL_IDLE_FORCE_SHUTDOWN_CLEAR_FLAGS` can be useful. In general however,
`SL_RAIL_IDLE` or `SL_RAIL_IDLE_ABORT` is a sufficient and preferred way to stop
transmitting/receiving - therefore the `FORCE_SHUTDOWN` modes should be only
used when they are really needed (as in the specific scenarios described here).
For more details, see the [article on the idle
modes](/rail/3.1.0/rail-training-idle).

#### Understanding RAIL Config Files

While this is a RAIL software documentation, it could be useful for a hardware
engineer who's working on a radio setup as well. It helps if you have some
knowledge of RAIL, but only basic C knowledge is a requirement.

Silicon Labs provides tools to generate RAIL config files, but it could be
useful to understand how they work.

##### The Generated Files

The radio configurator an advanced configurator (meaning it's not just an editor
GUI for a header file) in Simplicity Studio v5, which generates 3 files into the
`<project_dir>/autogen` folder:

- rail_config.c
- rail_config.h
- radioconf_generation_log.json

###### The Log

The file `radioconf_generation_log.json` provides some information on the
generated output. For example, the bandwidth is usually not an input from the
radioconf file, but a calculated value. That is reported in this file as
`Acquisition Channel Bandwidth`.

###### The Header

The configurator generates rail_config.h containing a few lines apart from
header comments and guards and includes:

```c
#define PROTOCOL_ACCELERATION_BUFFER protocolAccelerationBuffer
extern uint32_t protocolAccelerationBuffer[];

#define RAIL0_CHANNEL_GROUP_1_PHY_STUDIO_868M_GMSK_500KBPS
#define RAIL0_CHANNEL_GROUP_1_PROFILE_BASE
#define RADIO_CONFIG_XTAL_FREQUENCY 39000000UL

extern const RAIL_ChannelConfig_t *channelConfigs[];
```

The first two lines defines a layer to give access for the application to the
`protocolAccelerationBuffer` variable. The `protocolAccelerationBuffer` is used
for DMP switches, to accelerate channel hopping mechanism. This buffer can be
removed in most cases, but the compiler should optimize it out if it is not
used.

The `RAIL0_` macros provide some information to the application code on what is
set up on the radioconf file.

`RADIO_CONFIG_XTAL_FREQUENCY` tells that the config was created for a 39 MHz
crystal, while the last line externs a variable to access the configuration from
the application.

The most important file, rail_config.c, will be analyzed in the subsequent
sections. It's recommended to open a rail_config.c file for reference when
reading this article.

##### Callback Functions

The configurator generates the following callback functions, with empty body:

```c
uint32_t RAILCb_CalcSymbolRate(RAIL_Handle_t railHandle)
uint32_t RAILCb_CalcBitRate(RAIL_Handle_t railHandle)
void RAILCb_ConfigFrameTypeLength(RAIL_Handle_t railHandle, const RAIL_FrameType_t *frameType)
```

These callbacks are implemented in RAIL as weak functions, but were used only
in a config generated by an older configurator. Since they're not needed with
the new configurator, these functions override the internal RAIL functions
saving code space.

##### The Config Array(s)

The largest part of the code is encoded into a config array (or arrays in case
of a multi-PHY config), that looks like this:

```c
const uint32_t Protocol_Configuration_modemConfigBase[] = {
  0x01040FF0UL, (uint32_t) phyInfo,
    /* 0FF4 */ 0x00000000UL,
    /* 0FF8 */ 0x0003C000UL,
    // more address-value pairs
  0xFFFFFFFFUL,
};
```

These are essentially address-value pairs decoded and loaded to the correct
place by RAIL.

Keep in mind that these are EFR32 _generation_ specific arrays.
For example, you cannot use an array on an xG13 device if it was generated for xG1.
However, you can use the same config for devices from different families (MG, BG
or FG) as long as the generation is the same. For more information, see [EFR32 Migration Guide for Proprietary Applications](/rail/3.1.0/efr32-migration-guide-for-proprietary-apps).

##### Helper Arrays

Some features, like the "3 out of 6" encoder, or the OOK dynamic slicer, need
helper arrays that are referenced by a pointer in the main config array.

Some parts also need such helper arrays, e.g., xG23 generates a
`hfxoRetimingConfigEntries` to configure minimal interference between the HFXO
and the Local Oscillator of the receiver.

These arrays are usually passed either in the `phyInfo` or the main config
array.

##### PHY Info Array

One of the values of the config array is a pointer to another array called
`phyInfo`. This holds information of the config for RAIL. For example, the
function `sl_rail_get_bit_rate()` returns the bitrate for the config. While it
can be calculated from the config values, it's faster and even takes less code
space to store it in the `phyInfo`.

##### IR Calibration Helpers

_For details on the IR calibration, refer to the [Calibration
article](/rail/3.1.0/rail-training-calibration)._

The radio configurator generates an array and a struct that is connected to the
IR calibration, and they look like this:

```c
static const uint8_t irCalConfig[] = {
  20, 41, 2, 0, 0, 49, 17, 0, 0, 0, 1, 0, 2, 100, 0, 1, 1, 47, 0, 0, 7
};

static RAIL_ChannelConfigEntryAttr_t channelConfigEntryAttr = {
  //a lot of #ifdef macros
};
```

The first one, `irCalConfig` tells RAIL how to run the IR calibration on this
PHY. This array is passed as part of the **PHY Info Array**. The second one,
`channelConfigEntryAttr` is used to cache the calibration result. Although it looks complex,
it's really just a couple of `uint32_t`, depending on how many IQ receive and
transmit paths the part have.

When you run
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir),
[sl_rail_apply_ir_calibration()](/rail/3.1.0/rail-api/calibration#sl-rail-apply-ir-calibration)
or
[sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate),
it will store the IR calibration result `channelConfigEntryAttr`. If you load a
channel with the `channelConfigEntryAttr` value of `0xFFFFFFFFUL`, it will
trigger the event
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed).
This variable is passed as part of
[RAIL_ChannelConfigEntry_t](/rail/3.1.0/rail-api/rail-channel-config-entry-t).

##### Channel Entry Configuration

[RAIL_ConfigChannels()](/rail/3.1.0/rail-api/radio-configuration#rail-config-channels)
takes a
[RAIL_ChannelConfig_t](/rail/3.1.0/rail-api/rail-channel-config-t)
argument. It is defined in the config file, and usually looks like this:

```c
const RAIL_ChannelConfig_t Protocol_Configuration_channelConfig = {
  .phyConfigBase = Protocol_Configuration_modemConfigBase,
  .phyConfigDeltaSubtract = NULL,
  .configs = Protocol_Configuration_channels,
  .length = 1U,
  .signature = 0UL,
  .xtalFrequencyHz = 39000000UL,
};
```

The first argument is the base configuration: It is loaded immediately when you
call
[RAIL_ConfigChannels()](/rail/3.1.0/rail-api/radio-configuration#rail-config-channels).
The second parameter is part of RAIL 2.x multi-PHY features, we'll return to
that later. The third parameter is a pointer to and array of
[RAIL_ChannelConfigEntry_t](/rail/3.1.0/rail-api/rail-channel-config-entry-t).
The fourth parameter parameter is the number of elements in the previous array.
Signature is used only on modules, and the last parameter is the crystal
frequency in Hz, obviously.

The channel entry is an array of structs, looking like this (with a single
element):

```c
const RAIL_ChannelConfigEntry_t channels[] = {
  {
    .phyConfigDeltaAdd = NULL,
    .baseFrequency = 868000000,
    .channelSpacing = 1000000,
    .physicalChannelOffset = 0,
    .channelNumberStart = 0,
    .channelNumberEnd = 20,
    .maxPower = RAIL_TX_POWER_MAX,
    .attr = &entryAttr
#ifdef RADIO_CONFIG_ENABLE_CONC_PHY
    .entryType = 0,
#endif
#ifdef RADIO_CONFIG_ENABLE_STACK_INFO
    .stackInfo = NULL,
#endif
    .alternatePhy = NULL,
  },
};
```

The first parameter is again part of the multi-PHY features. `maxPower` serves
as a limit of the transmit power on some channels to meet regulatory
standards. Note that it's in deci-dBm, so unless it's set to
`RAIL_TX_POWER_MAX`, you'll need the **RAIL Utility, PA** component or the PA
conversion functions implemented to convert it. `attr` points to the `entryAttr`
struct, which is part of the IR calibration system, see above. The final 3
arguments are used by some of our stacks, and rarely used in proprietary setup.

The remaining parameters set the frequency and the channel numbers. The
frequency of a given `channelNumber` is calculated with this formula:

```c
channelFrequency = baseFrequency + channelSpacing * ( channelNumber - physicalChannelOffset )
```

Note that you cannot set the frequency beyond a limit without changes in the
configuration. These limits depend on the part, so please rely on the
configurator's help. If you set the frequency beyond the configuration's
capability, you'll get a `RAIL_ASSERT_FAILED_SYNTH_VCO_FREQUENCY` assert.

`channelNumberStart` and `channelNumberEnd` sets the limits of the entry, i.e.,
the first and the last channel.

##### API introduced in this Article

###### Types and Enums

- [RAIL_ChannelConfig_t](/rail/3.1.0/rail-api/rail-channel-config-t)
- [RAIL_ChannelConfigEntry_t](/rail/3.1.0/rail-api/rail-channel-config-entry-t)

### Multiprotocol

#### Introduction to Multi-PHY and Multiprotocol

To get the most out of this article, some familiarity with the radio
configurator is required, and it's also recommended that you understand the
basics of radio protocol stacks (i.e. the [OSI
model](https://en.wikipedia.org/wiki/OSI_model)).

---

With a customizable radio, the Wireless Gecko is a great option to support any
radio configuration you need. You can set it up for standard IEEE 802.15.4,
Bluetooth Low Energy, WMBus, or even the protocol used by your garage door
opener. However, what if you need more than one of those standards? With single
protocol radios, this requires a distinct 15.4 radio chip, a Bluetooth chip, and
so on for each supported standard. Alternatively, with a single Wireless Gecko,
you can store multiple "setups" in your device and switch between them. The only
limitation is that it's still a single radio - you can't use multiple "setups"
on the radio at the same time.

The best way to manage the sharing of this single radio resource depends on the
particular use case targeted by your application. We provide different solutions
(discussed below) to help you identify an optimal approach for your design.

##### Channel-based Multi-PHY

The most common use case in proprietary wireless is the need to support different
PHY configurations. For example:

- You always handle received packets the same way, but you have to receive at  
  multiple bitrates
- You have an asymmetric protocol, i.e. the Rx configuration is not the same as  
  the Tx configuration
- You need wider bandwidth for CSMA/CA than your normal Rx mode to pass  
  regulatory standards
- You have to handle different packet formats, but not at the same time: the  
  upper layers of the stack decide which one to use
- Although the PHYs are technically the same, there is a power limitation on a  
  given channel to pass regulatory standards
- The PHYs are technically the same, but the channel map is uneven - it's not  
  possible to configure it using channel spacing

In these cases, Channel-based Multi-PHY is the best solution. It's called
Channel-based, because in RAIL, you only need to change the channel to change
the PHY. Channel-based Multi-PHY setups can be tested with RAILtest by selecting
the channel with the `setChannel` serial command.

##### Protocol-based Multi-PHY

This is not as widely used as Channel-based Multi-PHY, but it's the next logical
step. The typical use cases:

- DMP applications.
- Your device will support multiple regions, and you choose one during  
  configuration, but the device will rarely switch between those.
- Your device will support multiple protocols, but the device will rarely switch  
  between those.

For these, we recommend Protocol-based Multi-PHY. In this case, you can switch
between protocols by calling
[sl_rail_config_channels()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-config-channels)
, which will load the whole configuration.

You can test your Protocol-based Multi-PHY setup using RAILtest. You can change
between protocols using the `setConfigIndex` serial command.

##### Channel Change Performance

We generally recommend the Channel-based multi-PHY approach, especially when
quick channel switch time is required.

If you have significant differences between channel groups, channel changing
that involves a channel group change will take somewhat longer. In most cases,
this is not too significant, but you should measure and calculate with it if you
need short channel switch times (PRS channels can be used for measuring this
time, see [the document about
debugging](/rail/3.1.0/rail-training-debugging)).

Also, if you have 3 channel groups, and only a single field is different between
A and B, but C is very different compared to the other two, channel change
between A and B will take the same time as channel change between C and A or C
and B. This is because the radio configurator searches the common config between
all 3 channel groups, and the remaining will be loaded on each channel group
change.

If you have a lot of channel groups in the protocol, this could also cause a
small but measurable delay during channel change. It takes some time for RAIL to
look up the channel group which includes the requested channel. This is because
RAIL does a simple search from the first channel group on every channel group
change, for historical reason.

All of these delays are a result of the implementation in RAIL. See the
[Understanding RAIL config files](/rail/3.1.0/rail-training-railcfg) article for more
details.

You can find a setup guide for some of the mentioned Multi-PHY solution use
cases in the [Multi-PHY Use cases and
Examples](/rail/3.1.0/rail-training-multiphy-examples)
article.

##### Dynamic Multiprotocol (DMP) between RAIL-based Protocols

If you have full protocol stacks that are completely independent, it makes sense
to develop the PHY and Link layer independently as well. These layers
communicate with RAIL, and the cleanest solution to this problem is Dynamic
Multiprotocol. Typical use case:

- One protocol is used to communicate with key fobs, while another is used to  
  communicate in a home automation network

In Dynamic Multiprotocol, the RAIL scheduler decides which protocol is active.

Dynamic Multiprotocol is more capable than Multi-PHY, but also more complex, so
it has some drawbacks when compared to Multi-PHY:

- Protocol change takes 450us on EFR32xG1x. This is a fixed worst-case delay,  
  because the RAIL scheduler must plan time-sharing of the radio resource using  
  calculations on a known sufficient time span in order to accommodate protocol  
  switches. The time differs on Series 2 parts, but in general, longer than even  
  protocol-based Multi-PHY, since it is set for worst case.
- It requires the multiprotocol version of the RAIL library, which has a bigger  
  memory footprint (both RAM and code) than the single protocol version.

##### Dynamic Multiprotocol between RAIL-based and other Silicon Labs Stack Protocols

The use case for this is straightforward:

- If you need Bluetooth and a RAIL-based protocol in the same application

At the moment, Silicon Labs only provides such a DMP solution based on the
Bluetooth stack and RAIL. You can access it by installing the Bluetooth SDK and
starting one of the DMP applications. See [Dynamic Multiprotocol Development with Bluetooth and Proprietary Protocols on RAIL](/rail/3.1.0/multiprotocol-dynamic-ble-proprietary-on-rail).

##### Other Multiprotocol Solutions

You can find other types of multiprotocol mentioned in some Silicon Labs
documents, but they are rarely used:

- Programmable multiprotocol means multiple firmware images for each protocol, and  
  the protocol is decided during the manufacturing process, i.e. a device is  
  either programmed to be a Bluetooth or a Zigbee device.
- Switched multiprotocol means two firmware images, one for each protocol. A  
  bootloader loads the firmware needed for the protocol, and the two firmware can  
  communicate with each other in a shared NVM storage. Protocol switching in  
  switched multiprotocol is rather slow, and using DMP is almost always a better  
  choice.
- Concurrent multiprotocol means that the PHY and maybe the lower layers of the  
  stacks are the same, but the upper layers are different. E.g. You can run Zigbee  
  and Thread on the same channel at the same time.

##### Related Documentation

- [Dynamic Multiprotocol Development with Bluetooth and Proprietary Protocols on RAIL](/rail/3.1.0/multiprotocol-dynamic-ble-proprietary-on-rail)
- [Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide)
- [Multiprotocol Fundamentals](https://docs.silabs.com/multiprotocol/latest/multiprotocol-fundamentals/)

#### Multi-PHY Use cases and Examples

In this article, we go through a couple of Multi-PHY examples and their setups
using the Radio Configurator. If you haven't already, please read [Introduction
to Multi-PHY and
Multiprotocol](/rail/3.1.0/rail-training-dmp-intro) first to
understand the various Multi-PHY and Multiprotocol capabilities of the Wireless
Geckos. Some basic understanding of radio configs and the Radio Configurator is
also required. You can find a more detailed description of the new Radio
Configurator in
[Proprietary Radio Configurator Guide](/rail/3.1.0/proprietary-radio-configurator-guide).

The article includes short videos to demonstrate how to set up the given
use case.

##### Channel-based Multi-PHY

The main idea behind Channel-based Multi-PHY is to create channel groups, each
of which can have different PHYs. Changing between these channel groups is
handled by RAIL: from the RAIL API, you can load the required PHY just by
selecting a channel.

A PHY configuration exposes elements of the radio configurator for each of the
channel groups in the selected protocol. Channel groups can be added with the
![ChannelGroupIcon](/rail-training-multiphy-examples/0.1/images/channel-group-icon.png)
icon. When you add an element to the channel-based configuration, it will
initially inherit the PHY from the root protocol. Inside each channel group, the
root protocol values can be overridden by toggling the "Customized" button or by
selecting a predefined PHY.

###### Different Bitrate

Let's say you need to work on the same 915MHz frequency, but on both 100kb/s and
500kb/s (with deviation 50kHz and 250kHz, respectively). Typically, this is used
as an extension of a protocol that originally only supported the lower bitrate:
The default bitrate is 100kb/s, but it's possible to switch to 500kb/s after a
handshake.

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zGuz153GBfzeCBrz0)

In the above setup, channel 0 uses 100kb/s bitrate, while channel 1 uses 500
kb/s. Note that the channels are on the exact same frequency, but their
configuration is slightly different - you might call these _virtual channels_.
From RAIL, you can change between these virtual channels just as regular
channels. If you call `sl_rail_start_rx(rail_handle, 0, NULL)` it will search
for 100kb/s packets, while  `sl_rail_start_rx(rail_handle, 1, NULL)` will search
for 500kb/s packets.

###### Different Packet

Let's say your protocol defines a variable length data packet (1st byte is
length) and a fixed, 2B long ACK packet.

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zHhzF8lamzeCBrz0)

In the above setup, channel 0 is for data packets, while channel 1 is for ACK
packets (both Tx and Rx) - on the same frequency, so these are _virtual
channels_ just like in the previous example. A transmitting device would send a
data packet on channel 0, then start listening on channel 1 for ACK, while a
receiving device would receive on channel 0, and transmit an ACK on channel 1
after successful reception.

Note that the only difference between the PHYs is the length decoding algorithm
itself. On the configurator GUI, we have two separate and complete
configurations, but when generated, the configurator will detect what the
difference is, and only generate a few lines of difference.

###### Asymmetric Protocol (Wireless M-Bus T Mode)

Wireless M-Bus T mode defines a different protocol based on the direction:

- **Meter -> Other (M2O)**: 868.95MHz, 3of6 encoding, 100kb/s
- **Other -> Meter (O2M)**: 868.3MHz, Manchester encoding, 32.768kb/s

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zIBznlp4WzeCBrz0)

The above example implements the "Other device" (typically collector). It
receives M2O on channel 0 and transmits O2M on channel 1. The implementation
required two pre-defined PHYs without any further modifications.

_Transmitting modeT M2O messages requires other tricks on the EFR32xG1x parts,
see
[Using RAIL for Wireless M-Bus Applications with EFR32](/rail/3.1.0/rail-wmbus-apps-with-efr32)
for details_.

###### Wide Bandwidth for CSMA/CA

Some regulatory standards also standardize the bandwidth for CSMA/CA, but your
protocol would have better sensitivity with a narrower bandwidth. The trick here
is to understand that this is actually a subset of the Asymmetric protocol
use case: Since CSMA/CA will listen on the same channel that you will use for
transmitting and the bandwidth setting in the configurator only affects receive
performance, you can define a virtual channel with your setup with the required
wider bandwidth:

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zGOzCjAE5zeCBrz0)

In the above example, channel 0 uses the bandwidth recommended by the
configurator, while channel 1 has a fixed, wide bandwidth. You would receive on
channel 0 with high sensitivity, and transmit on channel 1. The CSMA/CA
preceding the transmit would also happen on channel 1 using the fixed, wide
bandwidth.

You can check the bandwidths in the `autogen/radioconf_generation_log.json`
file: 4.8kHz for channel 0 and 100kHz for channel 1.

###### Uneven Channel Spacing

Channel groups can be used in "single-PHY" mode as well: one example of that is
setting up uneven channel spacing. Let's say you have to receive on 868.0MHz,
868.33MHz and 868.4MHz - so the channel spacing is 330kHz and 70kHz at the same
time. You obviously can't configure this with a single channel spacing field,
but you can with channel groups:

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zIvzsdjqQzeCBrz0)

With the above setup, you will have channels 0, 1 and 2 on the required
frequencies.

###### How Channel-based Multi-PHY Actually Works

See the Multi-PHY capabilities chapter in the [Understanding RAIL config files](/rail/3.1.0/rail-training-railcfg) article.

##### Protocol-based Multi-PHY

The main idea behind Protocol-based Multi-PHY is to create multiple - completely
independent - configs, and use
[sl_rail_config_channels()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-config-channels)
to select the required one.

The order of protocols will be used in the generated `channelConfigs[]` array,
i.e. the first protocol in the list will have index 0 and so on.

A protocol can be added to the config with the
![protocolButton](/rail-training-multiphy-examples/0.1/images/protocol-icon.png)
icon.

###### Multiple Regions

Let's say your device operates on the 868MHz 500kb/s pre-configured PHY in
Europe, and on the 915MHz 100kb/s pre-configured PHY in North America.

[VIDEO](https://www.brainshark.com/siliconlabs/vu?pi=zHizmFfWIzeCBrz0)

With the above setup, calling `sl_rail_config_channels(rail_handle,
channelConfigs[0], NULL)` will load the European config, while
`sl_rail_config_channels(rail_handle, channelConfigs[1], NULL)` will load the
North American config.

###### Configuration for a DMP Setup

The above setup can also be used in a Dynamic Multiprotocol setup. You'll need
two rail handles, let's call them rail_handle_868 and rail_handle_915. During
the initialization of the 868MHz protocol, you'll call
`sl_rail_config_channels(rail_handle_868, channelConfigs[0], NULL)`, and during
the initialization of the 915MHz protocol, you'll call
`sl_rail_config_channels(rail_handle_915, channelConfigs[1], NULL)`. From this
point, RAIL will automatically load the required config using the RAIL
scheduler.

##### IR Calibration in Multi-PHY Configs

_If you're not sure what IR calibration is, please refer to the [Calibration](/rail/3.1.0/rail-training-calibration) article_.

###### Configuration and Cache Variables in rail_config.c

_This section is copied from the [Understanding RAIL Config
Files](/rail/3.1.0/rail-training-railcfg) article._

The radio configurator generates two elements - an array and a struct - that are
involved in IR calibration. They look like this:

```c
static const uint8_t generated_irCalConfig[] = {
  24, 69, 3, 6, 4, 16, 1, 1, 1, 3, 1, 6, 0, 16, 39, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0
};

RAIL_ChannelConfigEntryAttr_t generated_entryAttr = {
  { 0xFFFFFFFFUL }
};
```

The first one, `generated_irCalConfig`, tells RAIL how to run the IR calibration
on this PHY. This array is passed as part of the **PHY info array**. The second
one, `generated_entryAttr` is used to cache the calibration result. When you run
[sl_rail_calibrate_ir()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate-ir)
,
[sl_rail_apply_ir_calibration()](/rail/3.1.0/rail-api/calibration#sl-rail-apply-ir-calibration)
or
[sl_rail_calibrate()](/rail/3.1.0/rail-api/calibration#sl-rail-calibrate),
it will store the IR calibration result here. If you load a channel with the
special entryAttr value of
[SL_RAIL_CAL_INVALID_VALUE](/rail/3.1.0/rail-api/calibration#sl-rail-cal-invalid-value),
it will trigger the event
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed).
This is passed as part of the channel entry configuration.

###### IR Calibration in Protocol-based Multi-PHY

IR calibration should be performed for all protocols. This will be requested
from the application through the
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed)
event. After the calibration is performed on each protocol, RAIL can use the
cached results from these prior operations. When doing so, the calibration
values will be applied automatically and near-instantaneously.

###### IR Calibration in Channel-based Multi-PHY

The radio configurator will automatically detect if channel groups are similar
enough to use a common calibration (e.g. only the packet is different). In these
cases, both `irCalConfig` and `entryAttr` will be the same. Calibration should
be performed on each channel group that has its own `irCalConfig` and
`entryAttr`. RAIL will detect this and request calibration through
[SL_RAIL_EVENT_CAL_NEEDED](/rail/3.1.0/rail-api/events#sl-rail-event-cal-needed)
if you select a channel group that has a different IR calibration setup and
[SL_RAIL_CAL_INVALID_VALUE](/rail/3.1.0/rail-api/calibration#sl-rail-cal-invalid-value)
in `entryAttr`. Once calibration is performed on each channel group that needs
it, RAIL can then cache these values for future use. As in Protocol-based
Multi-PHY, with cached results the calibration values will be applied
automatically and near-instantaneously.

###### Calibration on Multi-PHY at Startup

In some cases, using the `SL_RAIL_EVENT_CAL_NEEDED` event to calibrate is not
viable, and you might want to explicitly request calibration on everything at
startup. To do that, you should:

- loop through all protocols
- loop through all channel groups that have their own `irCalConfig` and  
  `entryAttr`

For the latter, you should check the generated rail_config.c. There's no easy
way to figure out which channel to calibrate from code. To loop through the
channel groups, you can use the API
[sl_rail_prepare_channel()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-prepare-channel)
to trigger the PHY loading. The calibration code will likely look something like
this:

```c
#define NUMBER_OF_GROUPS 5
const int16_t calibration_channels[NUMBER_OF_GROUPS] = {0, 10, 25, 50, 65};

for(uint8_t i=0; i<NUMBER_OF_GROUPS;i++){
  sl_rail_prepare_channel(rail_handle, calibration_channels[i]);        
  sl_rail_calibrate_ir(rail_handle, NULL);
}
```

In the above example, we have 5 channel groups that require calibration
(`NUMBER_OF_GROUPS`). The first channel of each channel group is stored in
`calibration_channels`.

If you have more protocols, you can simply load them using
[sl_rail_config_channels()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-config-channels).
Note that the first channel of the protocol is automatically configured, so
[sl_rail_prepare_channel()](/rail/3.1.0/rail-api/radio-configuration#sl-rail-prepare-channel)
is only needed for Channel-Based Multi-PHY.

##### Multi-PHY in Connect

The Connect stack has some limitations on Multi-PHY features:

- It doesn't support Protocol-Based Multi-PHY: Connect always loads the first  
  protocol (`channelConfigs[0]`)
- It doesn't support PA change, so Multi-PHY channels should use the same  
  frequency band (i.e. either 2.4GHz or sub-GHz)

#### Dynamic Multiprotocol (DMP) in RAIL

Before reading this article, make sure to read the [Introduction to Multi-PHY
and Multiprotocol](/rail/3.1.0/rail-training-dmp-intro), as
DMP is often misunderstood and used in applications that could be better served
by multi-PHY. We recommend that you (at least) browse through all the other
training articles before reading this (DMP) document, since DMP affects most
APIs in one way or another.

Note that this article will not provide you with all of the knowledge required
for DMP development. Rather, it will summarize what's already documented, and
highlight differences between RAIL single protocol and multiprotocol operations.

Some chapters below are not important if you need RAIL-Bluetooth DMP, but even
in that case, most chapters are still relevant because they describe RAIL
development in a DMP environment.

##### What is Dynamic Multiprotocol

Dynamic multiprotocol time-slices the radio and rapidly changes configurations
to enable different wireless protocols to simultaneously operate reliably in the
same application.

A typical use case involves a RAIL-based proprietary protocol and the Silicon
Labs Bluetooth stack running on the same chip at the same time. Since Bluetooth
communication is periodic and therefore predictable, other protocols can
use the radio between Bluetooth communication bursts. However, it's also helpful
to use DMP when all involved protocols are proprietary RAIL-based, to benefit
from the code clarity provided by the separate RAIL instances.

From a firmware perspective, RAIL-DMP works on the principle that each protocol
operates as is scheduled "alone" on the radio transceiver. A bit in a similar
fashion that a process on the computer running and not being necessarily aware
that other processes are scheduled at the same time.

Multiple RAIL protocol instances can be "created". Each instance can use the
driver in the same way, and do so almost independently.

However, from a hardware perspective the chip has only a single instance of the
radio. As such, RAIL-DMP is similar to multitasking: the same resource must be
shared among multiple "tasks" demanding its time. This sharing is managed by
the radio scheduler.

###### "Static" Multiprotocol

Static multiprotocol is a common requirement in IoT. For example, you only need
Bluetooth for commissioning, and while Bluetooth is enabled, you don't need the
main protocol running. For this use case, we also recommend DMP. However
development is much simpler for it. You only need to initialize DMP and make
sure to call
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
before switching protocols. So you only need to read the [Setting up a Project
for RAIL-RAIL
DMP](/rail/3.1.0/rail-training-dmp/#setting-up-a-project-for-rail-rail-dmp)
chapter here. Everything else is just recommended.

##### The Radio Scheduler

The radio scheduler's job is to give (or revoke) radio hardware access to (or
from) the protocols running on it. To accomplish this, it implements
cooperative, preemptive multitasking.

- It's cooperative: Protocols should tell the scheduler when and for how long  
  they need the radio, and protocols should yield the radio when not using it  
  anymore.
- It's preemptive: Protocols should define priority to each radio task, and the  
  scheduler will abort tasks if a higher priority radio task must run.

Note that the radio scheduler schedules only radio tasks. Although DMP is often
used with an RTOS (like FreeRTOS), **RTOS tasks and Radio tasks - despite the
common name - are very different terms**. To make this less confusing, our
documentation sometimes uses _radio operation_ instead of _radio task_.

For the radio scheduler to calculate the time required for a given radio
operation, it must know how much time it takes to change radio access from one
protocol to another. Therefore, in DMP, **a protocol change always takes a fixed
amount of time**. This is defined by `TRANSITION_TIME_US`, and could differ from
part to part. As of writing this article, it is between 430-510us.

This transition time can be [tuned and
overridden](/rail/3.1.0/rail-api/rail-multiprotocol#understanding-the-protocol-switch-time).

##### Setting up a Project for RAIL-RAIL DMP

_If you need RAIL+Bluetooth DMP, follow
[Dynamic Multiprotocol Development with BLE and Proprietary Protocols on RAIL](https://docs.silabs.com/bluetooth/latest/multiprotocol-dynamic-ble-proprietary-on-rail/).
This chapter describes how to set up DMP in a RAIL-only project._

To use DMP, you should first switch to the multiprotocol RAIL library, under
plugins. Since DMP has a bigger memory footprint (both RAM and code), it's
provided in a library which is not enabled in single protocol examples.

![DMP
component](/rail-training-dmp/0.1/images/dmp-plugin-v6.png)

Next, you'll need PHY configurations for your protocols. You can either use
Protocol Based Multi-PHY (see [the Multi-PHY usecases and examples
article](/rail/3.1.0/rail-training-multiphy-examples) for
details), or you can use embedded protocols, e.g. IEEE 802.15.4 2.4GHz 250kbps
by calling
[sl_rail_ieee802154_config_2p4_ghz_radio()](/rail/3.1.0/rail-api/ieee802-15-4#sl-rail-ieee802154-config-2p4-ghz-radio)
or configuring the **RAIL Utility, Initialization** component accordingly.

###### RTOS

RTOS is not technically required for RAIL DMP, although it's highly
recommended to clearly separate protocols. And for RAIL+Bluetooth DMP, we
actually only support RTOS-enabled projects. Therefore, RTOS will not be
discussed in this article; it doesn't impact how you use RAIL APIs in RAIL-only
DMP.

###### RAM Allocation

RAIL requires RAM allocated for each initialized protocol, to store its state
variables. Since GSDK v4.0, the multiprotocol RAIL library automatically
allocates RAM for two protocols. For more than two protocols, call
[`sl_rail_add_state_buffer_3(SL_RAIL_EFR32_HANDLE)`](/rail/3.1.0/rail-api/general#sl-rail-add-state-buffer3)
before initializing the 3rd protocol (or earlier). For even more protocols, use
[`sl_rail_add_state_buffer_4(SL_RAIL_EFR32_HANDLE)`](/rail/3.1.0/rail-api/general#sl-rail-add-state-buffer4)
and the generic `sl_rail_add_state_buffer()`.

Note that
[SL_RAIL_EFR32_HANDLE](/rail/3.1.0/rail-api/general#sl-rail-efr32-handle)
is a special RAIL handle, which can be used if a RAIL handle is needed before
[sl_rail_init()](/rail/3.1.0/rail-api/general#sl-rail-init),
like the above case.

Before GSDK v4.0, RAM was allocated in the application and needed to be passed
to
[sl_rail_init()](/rail/3.1.0/rail-api/general#sl-rail-init).

###### RAIL Initialization

Since GSDK v3.x, we recommend using the component **RAIL Utility, Initialization**
to initialize RAIL. This is an instancable component; you can create multiple
instances for RAIL-RAIL DMP.

It's a good idea to select the correct radio config for each instance using this
component. E.g., depicted below, we selected the second protocol of the radio
configurator, `channelConfigs[1]`. This is also the location where we could
easily select IEEE 802.15.4 PHY.

![PHYsetup](/rail-training-dmp/0.1/images/phy-setup-v6.png)

If you wish not to use the component, initializing RAIL can be done exactly the
same as single protocol. You will find some DMP related arguments, but those are
ignored since GSDK v4.0 (they were used for memory allocation before 4.0).

###### RAIL API Calls and Code Separation

RAIL APIs are the same for all protocols, and their
[sl_rail_handle_t](/rail/3.1.0/rail-api/general#sl-rail-handle-t)
argument decides which protocol is called. The RAIL handle can be obtained via
`sl_rail_util_get_handle(SL_RAIL_UTIL_HANDLE_INST0)` where `INST0` is the name
of the init component instance, with all uppercase.

It is highly recommended to implement each RAIL protocol in separate C files.
Otherwise, it can be difficult to follow which call is intended for which
protocol.

###### Assertion

RAIL assertion, i.e., the
[sl_railcb_assert_failed()](/rail/3.1.0/rail-api/assertions#sl-railcb-assert-failed)
should be common for all protocols. If you add RAIL next to BLE for example, you
should disable this assert in your own protocol, as it is handled in the stack.
This can be done in the **RAIL Utility, Callbacks** component.

![assertion](/rail-training-dmp/0.1/images/assertion-v6.png)

###### Other APIs

Most of the RAIL APIs work exactly the same as in single protocol mode. However,
you should be careful with:

- protocol independent APIs, i.e. the ones that don't have a `rail_handle`  
  argument
- APIs that affect the state of the radio scheduler, i.e. schedule or stop a  
  radio task

##### Protocol Independent APIs

There are a few APIs that always work the same way, regardless of which protocol
they were called from:

- `sl_rail_set_time()`/`sl_rail_get_time()`: the timebase (which is also used  
  for timestamping) is common for all protocols. It is not recommended to call  
  `sl_rail_set_time()` in a DMP application (and calling it in a single protocol  
  application can still be dangerous).
- `sl_rail_config_multi_timer()`: MultiTimer mode is a requirement in DMP, so  
  it's enabled by default and cannot be disabled.
- `sl_rail_sleep()`/`sl_rail_wake()`: Sleep management should be handled  
  protocol-independently (e.g. in the idle task of the RTOS).

There are some other APIs that don't require `rail_handle`, but they usually
need a packet handler or timer handler, and so are still tied to a protocol.

##### Scheduling a Finite Radio Task

The following APIs will trigger the radio scheduler to schedule a finite length
new radio task:

- [sl_rail_start_scheduled_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-scheduled-rx)
- [sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx)
- [sl_rail_start_scheduled_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-scheduled-tx)
- [sl_rail_start_cca_csma_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-csma-tx)
- [sl_rail_start_cca_lbt_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-cca-lbt-tx)
- [sl_rail_start_average_rssi()](/rail/3.1.0/rail-api/receive#sl-rail-start-average-rssi)

(Note that
[sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)
and
[sl_rail_start_tx_stream()](/rail/3.1.0/rail-api/diagnostic#sl-rail-start-tx-stream)
are not listed, as these as these are **not finite** length tasks.)

All the above APIs have the optional argument
[sl_rail_scheduler_info_t](/rail/3.1.0/rail-api/sl-rail-scheduler-info-t).
In single protocol mode, this argument is ignored, and can be NULL. In
multiprotocol mode, this is the base of the scheduling, with its 3 members:

- `priority`: 0 to 255, 0 being the highest. Equal priority does not preempt
- `slip_time`: maximum time the task can be delayed due to other protocols, in  
  us
- `transaction_time`: the time the task takes, in us

When the radio hardware is available, none of these scheduler info arguments are
used. However, if two tasks are scheduled at the same time, the radio scheduler
will try to stagger the operations using `slip_time` in order to satisfy both
tasks. If that fails, the lower `priority` task will not get access to the
radio.

It is also possible that an application schedules a high priority radio task
when a conflicting lower priority task has already started. In that case, the
lower priority task will be aborted (possibly in the middle of frame
transmission).

If
[sl_rail_scheduler_info_t](/rail/3.1.0/rail-api/sl-rail-scheduler-info-t)
is `NULL`, the scheduler will assume all parameters to be 0, i.e. highest
priority, with no slipTime. It is highly recommended to **not** use this
feature, and it's only mentioned here to simplify debugging.

**Each protocol can schedule at most a single finite task.**

For more details on the radio scheduler, see the [Dynamic Multiprotocol User’s Guide](https://docs.silabs.com/connect/latest/multiprotocol-dynamic-ug/03-radio-scheduler-examples/) and the [Multiprotocol description in the RAIL API
doc](/rail/3.1.0/rail-api/rail-multiprotocol).

##### Yielding

After each radio task, the application **must** yield the radio. That can be
achieved by calling
[sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio)
or
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1).
The latter also turns off the radio, which should have already occurred for
finite tasks. Manual yielding is required because the scheduler doesn't know
about any automatic follow-up tasks (like ACKs). You might want to yield
immediately after receiving a packet, or you may instead want to wait for the
auto ACK to go out.

Since yielding the radio will also call the radio scheduler to start/schedule
the next radio task, you must first capture everything you need that might be
overwritten by another protocol after yield, even in interrupt context. For
example, timestamps of a transmitted packet must be accessed before yielding.

A Tx operation scheduled in the future can be cancelled using
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
or
[sl_rail_stop_tx()](/rail/3.1.0/rail-api/transmit#sl-rail-stop-tx),
where the latter doesn't yield the radio. An Rx operation scheduled in the
future can only be cancelled using
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1).

##### Background Rx

[sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)
receives special handling in the radio scheduler, as it schedules an infinite
task - namely, background Rx. The main difference when compared to finite tasks
is that an infinite task sets the "default" state of the radio. It can be
aborted by higher priority finite tasks, but it will be resumed automatically
after the higher priority task is finished. For background Rx, this practically
means that the radio will automatically return to Rx after Tx or packet
reception, and you don't have to use auto state transitions like you do in
single protocol mode. (Currently, the only infinite task supported by RAIL is
background Rx).

Keep in mind that RAIL does not store the channel of background Rx. If you
interrupt background Rx with a finite task on a different channel, the channel
of the background Rx will change as well. E.g. if you're receiving in channel 0,
then transmit on channel 1, the radio will "return" to receiving on channel 1.
To change the background Rx channel back to 0, simply call
[sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)
again after you yield the radio.

[sl_rail_start_rx()](/rail/3.1.0/rail-api/receive#sl-rail-start-rx)
has the same
[sl_rail_scheduler_info_t](/rail/3.1.0/rail-api/sl-rail-scheduler-info-t)
configuration as the finite tasks, but depends only on the `priority` member -
which, in general, should be the lowest priority used by the protocol.

Background Rx can be aborted using
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1),
which also yields the radio. In DMP mode, it's recommended to only use
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)
to stop background Rx.

It is also possible to change the priority of the background RX using
[sl_rail_set_task_priority()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-set-task-priority) -
this is useful e.g. to increase the priority during packet reception, or after
a particular packet.

##### TxStream

[sl_rail_start_tx_stream()](/rail/3.1.0/rail-api/diagnostic#sl-rail-start-tx-stream)
is called a debug task, which must have the highest priority, because it can't
be aborted. Otherwise, it works similarly to infinite tasks.

This API is different from all others as it doesn't use
[sl_rail_scheduler_info_t](/rail/3.1.0/rail-api/sl-rail-scheduler-info-t).
Since a stream can't really be aborted, the radio scheduler will handle this
with the highest priority and no slip time.

Stream can be stopped with
[sl_rail_stop_tx_stream()](/rail/3.1.0/rail-api/diagnostic#sl-rail-stop-tx-stream),
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1),
or
[sl_rail_yield_radio()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-yield-radio),
although it is recommended to use
[sl_rail_stop_tx_stream()](/rail/3.1.0/rail-api/diagnostic#sl-rail-stop-tx-stream)`
for clarity.

##### Auto State Transitions

You might wonder, "what's the point of auto state transitions in DMP, if
background Rx changes the default state to Rx?" The added value of auto state
transitions is that the resulting state will inherit the original state's
priority.

For example, you probably want the ACK reception on the same priority as the
transmission itself, so you can set
[sl_rail_set_tx_transitions()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-tx-transitions)
to set up receive after the transmission for the ACK, and configure a timeout
for it using
[sl_rail_set_state_timing()](/rail/3.1.0/rail-api/state-transitions#sl-rail-set-state-timing).

If you have automatic state transition set up, you should only yield the radio
after the whole operation (e.g. ACK reception or timeout) is finished. It's
highly recommended to have automatic timeouts to prevent a high priority
infinite task, but if you haven't set up timeouts, you can cancel the receive
and yield the radio using
[sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1).

To summarize:

- In RAIL single protocol, the default state is always idle, and auto state  
  transitions should be used to always return the radio to Rx. In DMP,  
  background Rx should be used for this.
- In single protocol mode, Rx state started by auto state transition is the same  
  as Rx state started by StartRx. In DMP, auto state transitions are intended  
  for ACK, as they inherit the (usually high) priority of the preceding task.

For more details, see the [Dynamic Multiprotocol User’s Guide](https://docs.silabs.com/connect/latest/multiprotocol-dynamic-ug/05-implementing-multiprotocol-with-rail/).

##### MultiTimers

RAIL includes a timer virtualization service, called MultiTimer. Since its
memory footprint is not negligible, this feature is disabled by default in
single protocol mode. However, in multiprotocol mode, it is always enabled,
since multiple timers are required for the multiple protocols. Therefore, using
MultiTimers in your protocol implementations has no drawback in DMP.

##### FIFOs

DMP maintains separate Tx FIFO memory locations for the used protocols; however,
the Rx FIFO and Packet Queue is common for all of them (with the default **RAIL
Utility, Initialization** implementation, however you can create individual
instances for the protocols). This means that the Rx FIFO is cleared during
protocol switch, to avoid information leaking from one protocol to the other.
This also means that the FIFO **must** be downloaded before yielding the radio.
In practical terms, this means that it's recommended to download received packet
in the event handler, and the use of the
[sl_rail_hold_rx_packet()](/rail/3.1.0/rail-api/receive#sl-rail-hold-rx-packet)
API should be avoided.

##### Error Handling

In single protocol RAIL, you generally need to implement the following error
handling:

- `sl_rail_start_xyz()`/`sl_rail_start_scheduled_xyz()` might return an error.  
  If no error were returned, the operation was either finished, or an event will  
  be triggered.
- The event handler, where either a success or error event can be triggered,  
  e.g.  
  [SL_RAIL_EVENT_TX_PACKET_SENT](/rail/3.1.0/rail-api/events#sl-rail-event-tx-packet-sent)  
  or  
  [SL_RAIL_EVENT_TX_CHANNEL_BUSY](/rail/3.1.0/rail-api/events#sl-rail-event-tx-channel-busy).

In DMP, there's a third error case to handle above the previous two: You should
always handle
[SL_RAIL_EVENT_SCHEDULER_STATUS](/rail/3.1.0/rail-api/events#sl-rail-event-scheduler-status),
where you might receive an error by calling
[sl_rail_get_scheduler_status()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-get-scheduler-status).

This was implemented because when you call e.g.
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx),
the radio scheduler just creates task. When that task is running, it will
actually call the single protocol
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx),
and if that returns an error, it will trigger an
[SL_RAIL_EVENT_SCHEDULER_STATUS](/rail/3.1.0/rail-api/events#sl-rail-event-scheduler-status)
event.

[sl_rail_get_scheduler_status()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-get-scheduler-status) returns two errors:

- [sl_rail_scheduler_status_t](/rail/3.1.0/rail-api/multiprotocol#sl-rail-scheduler-status-t)
- [sl_rail_status_t](/rail/3.1.0/rail-api/general#sl-rail-status-t)

The first one is difficult to understand if you just read the documentation.
It's cleaner if you check it in `rail_types.h`.

The upper 4 bits, masked by `SL_RAIL_SCHEDULER_TASK_MASK` reports the task the
error is originated from. For example, `SL_RAIL_SCHEDULER_TASK_SINGLE_TX` means
the radio scheduler was working on a
[sl_rail_start_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-tx)
task.

The lower 4 bits, masked by `SL_RAIL_SCHEDULER_STATUS_MASK` is the error itself,
which can have one of the `SL_RAIL_SCHEDULER_STATUS_*` errors (see the [API
doc](/rail/3.1.0/rail-api/multiprotocol#sl-rail-scheduler-status-t)
for details).

Usually an application will need to implement
`SL_RAIL_SCHEDULER_STATUS_SCHEDULE_FAIL` and
`SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED` specifically. These could normally
happen, resulted by conflicts with other radio tasks. The first one means the
task is impossible to schedule due to other tasks, while the latter means that
the task started, but was interrupted by a higher priority task. _Note that
these errors happen rarely so one must carefully implement the error handling in
a DMP app based on what could theoretically happen._

The other errors mean more serious problems.
`SL_RAIL_SCHEDULER_STATUS_TASK_FAIL` means the internal, single protocol call of
the API returned an error. In this case, the second parameter is also
meaningful. RAIL saves the returned error into
[sl_rail_status_t](/rail/3.1.0/rail-api/general#sl-rail-status-t)
parameter.

`SL_RAIL_SCHEDULER_STATUS_INTERNAL_ERROR` shouldn't happen, but is theoretically
possible, so should be handled. Finally `SL_RAIL_SCHEDULER_STATUS_UNSUPPORTED`
is currently only reported if the
[sl_rail_get_scheduler_status()](/rail/3.1.0/rail-api/multiprotocol#sl-rail-get-scheduler-status)
is called with the single protocol RAIL library.

So, for example `SL_RAIL_SCHEDULER_TASK_SCHEDULED_TX |
SL_RAIL_SCHEDULER_STATUS_EVENT_INTERRUPTED` means that a task, requested by
[sl_rail_start_scheduled_tx()](/rail/3.1.0/rail-api/packet-tx#sl-rail-start-scheduled-tx)
was interrupted by a higher priority operation.

##### Debugging

When debugging DMP, Rx/Tx PRS channels are still useful. See the [article about
debugging](/rail/3.1.0/rail-training-debugging) for details.

For DMP based code, writing out to a GPIO when a protocol is
scheduled/unscheduled is really useful. This can be easily done by setting a
GPIO on
[SL_RAIL_EVENT_CONFIG_SCHEDULED](/rail/3.1.0/rail-api/events#sl-rail-event-config-scheduled)
and clearing it on
[SL_RAIL_EVENT_CONFIG_UNSCHEDULED](/rail/3.1.0/rail-api/events#sl-rail-event-config-unscheduled).

##### Recommendations and Practices

Although these practices are important for DMP applications, you should consider
applying them in single protocol applications as well, to simplify a potential
future port to DMP:

- Since  
  [sl_rail_idle()](/rail/3.1.0/rail-api/state-transitions#sl-rail-idle-1)  
  also yields the radio, it should be rarely used in DMP.
- Use the scheduling Rx/Tx features as much as possible - i.e. don't use timers  
  and start Rx/Tx at timer interrupt, use the corresponding RAIL schedule API  
  instead. This helps the radio scheduler to resolve conflicts with the  
  configured `slip_times`, or at least promptly let the application know about an  
  unavoidable conflict.
- Set the `slip_time`/`transaction_time` correctly. Again, this helps the radio  
  scheduler to resolve conflicts.
- Implement careful error handling in the  
  [SL_RAIL_EVENT_SCHEDULER_STATUS](/rail/3.1.0/rail-api/events#sl-rail-event-scheduler-status)  
  event

##### How Not to Use DMP

Using multiple DMP instances for multiple radio tasks (e.g., one protocol for
advertising, one for connection, or one for Tx, one for Rx) is bad design: while
it works, each protocol instance has a significant memory footprint, and
switching time between protocols is much slower than switching Rx/Tx inside a
protocol. At the moment, it is recommended to use DMP only for serving separate
protocol stacks.

Using DMP to handle multiple PHYs for the same protocol stack is also not
recommended: Multi-PHY is a much better solution for that, see the [introduction
to Multi-PHY and Multiprotocol
article](/rail/3.1.0/rail-training-dmp-intro) for more
details.

##### Related Documentation

- [Dynamic Multiprotocol User’s Guide](https://docs.silabs.com/connect/latest/multiprotocol-dynamic-ug/)  
  - You can skip the chapters that won't affect your design. For example, if you don't    
    plan to use Zigbee, you can skip the Zigbee chapters. This article somewhat    
    overlaps with the Dynamic Multiprotocol User’s Guide as we provide a short summary of the basics here.
- [Dynamic Multiprotocol Development with Bluetooth and Proprietary Protocols on RAIL in GSDK v3.x and Higher](https://docs.silabs.com/bluetooth/latest/multiprotocol-dynamic-ble-proprietary-on-rail/)  
  - Read it if you plan to use Bluetooth - RAIL DMP, as it presents how to    
    create Bluetooth - RAIL examples.
- [The Multiprotocol description in the API  
  doc](/rail/3.1.0/rail-api/rail-multiprotocol) - It is the  
  concentrated description of the Radio Scheduler, and also  
  overlaps with this article.

If you find any conflicts between this article and the above documents, give
those documents priority as they will more quickly receive updates to track new
RAIL DMP features and guidance.