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

zephyr_library_named(nrf-802154-platform)
zephyr_interface_library_named(zephyr-802154-interface)

if (CONFIG_NRF_802154_RADIO_DRIVER)
  target_sources(nrf-802154-platform
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/radio/platform/nrf_802154_random_zephyr.c
      ${CMAKE_CURRENT_SOURCE_DIR}/sl_opensource/platform/nrf_802154_gpiote_crit_sect.c
      ${CMAKE_CURRENT_SOURCE_DIR}/sl_opensource/platform/nrf_802154_clock_zephyr.c
      ${CMAKE_CURRENT_SOURCE_DIR}/sl_opensource/platform/nrf_802154_gpiote_zephyr.c
      ${CMAKE_CURRENT_SOURCE_DIR}/sl_opensource/platform/nrf_802154_irq_zephyr.c
      ${CMAKE_CURRENT_SOURCE_DIR}/sl_opensource/platform/nrf_802154_temperature_zephyr.c
  )

  target_compile_definitions(zephyr-802154-interface
    INTERFACE
      # CCA mode options
      NRF_802154_CCA_CORR_LIMIT_DEFAULT=${CONFIG_NRF_802154_CCA_CORR_LIMIT}
      NRF_802154_CCA_CORR_THRESHOLD_DEFAULT=${CONFIG_NRF_802154_CCA_CORR_THRESHOLD}
      NRF_802154_CCA_ED_THRESHOLD_DEFAULT=${CONFIG_NRF_802154_CCA_ED_THRESHOLD}
  )

  if (CONFIG_NRF_802154_CCA_MODE_ED)
    target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_CCA_MODE_DEFAULT=NRF_RADIO_CCA_MODE_ED)
  elseif (CONFIG_NRF_802154_CCA_MODE_CARRIER)
    target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_CCA_MODE_DEFAULT=NRF_RADIO_CCA_MODE_CARRIER)
  elseif (CONFIG_NRF_802154_CCA_MODE_CARRIER_AND_ED)
    target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_CCA_MODE_DEFAULT=NRF_RADIO_CCA_MODE_CARRIER_AND_ED)
  elseif (CONFIG_NRF_802154_CCA_MODE_CARRIER_OR_ED)
    target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_CCA_MODE_DEFAULT=NRF_RADIO_CCA_MODE_CARRIER_OR_ED)
  endif()
endif ()

if (CONFIG_NRF_802154_SERIALIZATION)
  target_sources(nrf-802154-platform
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/serialization/platform/nrf_802154_serialization_crit_sect.c
      ${CMAKE_CURRENT_SOURCE_DIR}/serialization/platform/nrf_802154_spinel_log.c
      ${CMAKE_CURRENT_SOURCE_DIR}/serialization/platform/nrf_802154_spinel_backend_ipc.c
      ${CMAKE_CURRENT_SOURCE_DIR}/serialization/platform/nrf_802154_spinel_response_notifier.c
  )
endif ()

if (CONFIG_NRF_802154_SER_RADIO)
    target_sources(nrf-802154-platform
      PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/serialization/platform/nrf_802154_init_net.c
    )
endif ()

target_compile_definitions(zephyr-802154-interface
  INTERFACE
    # Radio driver shim layer uses raw api
    NRF_802154_USE_RAW_API=1

    # Number of slots containing short addresses of nodes for which
    # pending data is stored.
    NRF_802154_PENDING_SHORT_ADDRESSES=${CONFIG_NRF_802154_PENDING_SHORT_ADDRESSES}

    # Number of slots containing extended addresses of nodes for which
    # pending data is stored.
    NRF_802154_PENDING_EXTENDED_ADDRESSES=${CONFIG_NRF_802154_PENDING_EXTENDED_ADDRESSES}

    # Number of buffers in receive queue.
    NRF_802154_RX_BUFFERS=${CONFIG_NRF_802154_RX_BUFFERS}

    NRF_802154_TX_STARTED_NOTIFY_ENABLED=1

    # ACK timeout
    NRF_802154_ACK_TIMEOUT_ENABLED=1
)

if (CONFIG_NRF_802154_ENCRYPTION)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_ENCRYPTION_ENABLED=1)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_SECURITY_WRITER_ENABLED=1)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_IE_WRITER_ENABLED=1)
else ()
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_ENCRYPTION_ENABLED=0)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_SECURITY_WRITER_ENABLED=0)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_IE_WRITER_ENABLED=0)
endif()

if (NOT CONFIG_IEEE802154_NRF5 AND NOT CONFIG_IEEE802154_NRF5_EXT_IRQ_MGMT AND CONFIG_NRF_802154_SL_OPENSOURCE)
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_INTERNAL_RADIO_IRQ_HANDLING=1)
else()
  target_compile_definitions(zephyr-802154-interface INTERFACE NRF_802154_INTERNAL_RADIO_IRQ_HANDLING=0)
endif()

set(NRF52_SERIES  ${CONFIG_SOC_SERIES_NRF52X})
set(NRF53_SERIES  ${CONFIG_SOC_SERIES_NRF53X})
set(SER_HOST      ${CONFIG_NRF_802154_SER_HOST})
set(SL_OPENSOURCE ${CONFIG_NRF_802154_SL_OPENSOURCE})

if(CONFIG_NRF_802154_SOURCE_HAL_NORDIC)
  add_subdirectory(${ZEPHYR_CURRENT_MODULE_DIR}/drivers/nrf_802154 nrf_802154)

  target_link_libraries(nrf-802154-driver-interface INTERFACE zephyr-802154-interface)
  target_link_libraries(nrf-802154-serialization-interface INTERFACE zephyr-802154-interface)
endif()


if (CONFIG_NRF_802154_RADIO_DRIVER)
  zephyr_append_cmake_library(nrf-802154-driver)
  zephyr_append_cmake_library(nrf-802154-sl)
  target_link_libraries(zephyr_interface INTERFACE nrf-802154-driver-interface)
  # This link is needed to resolve circular dependency between SL and platform
  target_link_libraries(nrf-802154-platform PRIVATE nrf-802154-sl)
endif ()

if (CONFIG_NRF_802154_SERIALIZATION)
  zephyr_append_cmake_library(nrf-802154-serialization)
  target_link_libraries(zephyr_interface INTERFACE nrf-802154-serialization-interface)
endif ()
