# SPDX-License-Identifier: Apache-2.0

zephyr_include_directories(.)
zephyr_sources_ifdef(CONFIG_PM power.c)
zephyr_sources(
  scfg.c
  registers.c
)

# Check for disabling header CRC.
if (NOT DEFINED CONFIG_NPCX_HEADER_ENABLE_HEADER_CRC)
    set(NPCX_HEADER_HCRC "-nohcrc")
endif()

# Check for disabling firmware CRC.
if (NOT DEFINED CONFIG_NPCX_HEADER_ENABLE_FIRMWARE_CRC)
    set(NPCX_HEADER_FCRC "-nofcrc")
endif()

if (DEFINED CONFIG_NPCX_IMAGE_OUTPUT_BIN)
  set(NPCX_BIN_NAME ${CONFIG_KERNEL_BIN_NAME}.npcx.bin)
  set_property(GLOBAL APPEND PROPERTY extra_post_build_commands
    COMMAND ${PYTHON_EXECUTABLE} ${SOC_DIR}/${ARCH}/${SOC_FAMILY}/common/ecst/ecst.py
    -i ${KERNEL_BIN_NAME}
    -o ${NPCX_BIN_NAME}
    ${NPCX_HEADER_HCRC} ${NPCX_HEADER_FCRC}
    -chip ${CONFIG_NPCX_HEADER_CHIP}
    -flashsize ${CONFIG_NPCX_HEADER_FLASH_SIZE}
    -spiclkratio ${CONFIG_NPCX_HEADER_CORE_CLOCK_SPI_CLOCK_RATIO}
    -spimaxclk ${CONFIG_NPCX_HEADER_SPI_MAX_CLOCK}
    -spireadmode ${CONFIG_NPCX_HEADER_SPI_READ_MODE}
  )
  if (DEFINED CONFIG_NPCX_IMAGE_OUTPUT_HEX)
    set(NPCX_HEX_NAME ${CONFIG_KERNEL_BIN_NAME}.npcx.hex)
    # Property magic which makes west flash choose right file.
    set_property(TARGET runners_yaml_props_target PROPERTY hex_file "${CONFIG_KERNEL_BIN_NAME}.npcx.hex")
    set_property(GLOBAL APPEND PROPERTY extra_post_build_commands
    COMMAND $<TARGET_PROPERTY:bintools,elfconvert_command>
            $<TARGET_PROPERTY:bintools,elfconvert_flag>
            $<TARGET_PROPERTY:bintools,elfconvert_flag_intarget>binary
            $<TARGET_PROPERTY:bintools,elfconvert_flag_outtarget>ihex
            $<TARGET_PROPERTY:bintools,elfconvert_flag_infile>${NPCX_BIN_NAME}
            $<TARGET_PROPERTY:bintools,elfconvert_flag_outfile>${NPCX_HEX_NAME}
            $<TARGET_PROPERTY:bintools,elfconvert_flag_final>
    )
  endif()
endif()
