[![](https://openthread.io/static/images/icon-github.svg)View source on GitHub](https://github.com/openthread/ot-docs/tree/main/site/en/guides/porting/index.md)
![SiLabs](https://openthread.io/static/images/contributors/ot-byline-silabs.png) **By** [Mason
Tran](https://github.com/lmnotran) Contributor from SiLabs

Porting the OpenThread stack to a new hardware platform consists of a few steps:

1. [Set up the build environment](https://openthread.io/guides/porting/set-up-the-build-environment)
2. [Define CMake Rules](https://openthread.io/guides/porting/define-cmake-rules)
3. [Implement Platform Abstraction Layer APIs](https://openthread.io/guides/porting/implement-platform-abstraction-layer-apis)
4. [Implement advanced features (Hardware Abstraction Layer)](https://openthread.io/guides/porting/implement-advanced-features)
5. [Validate the port](https://openthread.io/guides/porting/validate-the-port)
6. [Certification and README](https://openthread.io/guides/porting/certification-and-readme)

## Hardware platform requirements

OpenThread requires the following platform services:

- IEEE 802.15.4-2006 for Thread 1.1 2.4 GHz radio
  - Send and receive IEEE 802.15.4 frames
  - Generate IEEE 802.15.4 Acknowledgment frames
  - Provide Received Signal Strength Indicator (RSSI) measurements on received frames
- IEEE 802.15.4-2015 for Thread 1.2+
  - Send and receive IEEE 802.15.4-2015 frames having Header IEs or Payload IEs
  - Generate Enh-Ack frames
- A millisecond-resolution free-running timer with alarm
- Non-volatile storage for storing network configuration settings
- A true random number generator (TRNG)

## Example builds

Several example builds are provided in the OpenThread repository. For more
information, see [Platforms](https://openthread.io/platforms).

For examples of a few working ports, see [`ot-cc2538`](https://github.com/openthread/ot-cc2538), [`ot-efr32`](https://github.com/openthread/ot-efr32), and [`ot-nrf528xx`](https://github.com/openthread/ot-nrf528xx). `ot-cc2538` might be a good place to start as it only implements a single platform. `ot-efr32` and `ot-nrf528xx` are a bit more complicated as they implement support for multiple platforms.