blob: d27aed5f65123fb2b05c5ef47fe568d5480b4164 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "sw/device/lib/rv_timer.h"
#include "sw/device/lib/base/log.h"
#include "sw/device/lib/dif/dif_gpio.h"
#include "sw/device/lib/handler.h"
#include "sw/device/lib/irq.h"
#include "sw/device/lib/pinmux.h"
#include "sw/device/lib/runtime/check.h"
#include "sw/device/lib/runtime/hart.h"
#include "sw/device/lib/testing/test_main.h"
#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
static dif_gpio_t gpio;
// Flag to indicate that the interrupt was seen. Declared as volatile since it
// is referenced in the ISR routine as well as in the main program flow.
static volatile bool intr_handling_success;
static const uint32_t hart = (uint32_t)kTopEarlgreyPlicTargetIbex0;
bool test_main(void) {
const uint64_t cmp = 0x000000000000000F;
pinmux_init();
// Enable GPIO: 0-7 and 16 is input, 8-15 is output
dif_gpio_config_t gpio_config = {
.base_addr = mmio_region_from_addr(TOP_EARLGREY_GPIO_BASE_ADDR)};
CHECK(dif_gpio_init(&gpio_config, &gpio) == kDifGpioOk);
CHECK(dif_gpio_output_mode_all_set(&gpio, 0xFF00) == kDifGpioOk);
irq_global_ctrl(true);
irq_timer_ctrl(true);
rv_timer_intr_enable(hart, true);
intr_handling_success = false;
rv_timer_set_us_tick(hart);
rv_timer_set_cmp(hart, cmp);
rv_timer_ctrl(hart, true);
CHECK(dif_gpio_all_write(&gpio, 0xFF00) == kDifGpioOk); // all LEDs on
while (!intr_handling_success) {
wait_for_interrupt();
}
CHECK(dif_gpio_all_write(&gpio, 0xAA00) == kDifGpioOk); // Test Completed
return true;
}
// Override weak default function
void handler_irq_timer(void) {
LOG_INFO("In Interrupt handler!");
rv_timer_ctrl(hart, false);
rv_timer_clr_all_intrs();
intr_handling_success = true;
}