# Copyright 2019 The Hafnium Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("args.gni")

source_set("mini_uart") {
  sources = [
    "mini_uart.c",
  ]

  assert(gpio_base_address != 0,
         "\"gpio_base_address\" must be defined for ${target_name}.")
  assert(aux_base_address != 0,
         "\"aux_base_address\" must be defined for ${target_name}.")
  assert(core_freq_mhz != 0,
         "\"core_freq_mhz\" must be defined for ${target_name}.")
  assert(baudrate != 0, "\"baudrate\" must be defined for ${target_name}.")

  defines = [
    "GPIO_BASE=${gpio_base_address}",
    "AUX_BASE=${aux_base_address}",
    "CORE_FREQ_MHZ=${core_freq_mhz}",
    "BAUDRATE=${baudrate}",
  ]
}
