// See LICENSE for license details.

#ifndef _ISS_PLATFORM_H
#define _ISS_PLATFORM_H

#if __riscv_xlen == 32
#define MCAUSE_INT         0x80000000UL
#define MCAUSE_CAUSE       0x000003FFUL
#else
#define MCAUSE_INT         0x8000000000000000UL
#define MCAUSE_CAUSE       0x00000000000003FFUL
#endif

#define APB_BUS

#include "ehrenberg/devices/gpio.h"
#include "ehrenberg/devices/uart.h"
#include "ehrenberg/devices/timer.h"
#include "ehrenberg/devices/aclint.h"
#include "ehrenberg/devices/qspi.h"
#include "ehrenberg/devices/i2s.h"
#include "ehrenberg/devices/camera.h"
#include "ehrenberg/devices/dma.h"
#include "ehrenberg/devices/msg_if.h"

#define PERIPH(TYPE, ADDR) ((volatile TYPE*) (ADDR))

#define APB_BASE 0xF0000000

#define gpio        PERIPH(gpio_t,         APB_BASE+0x0000)
#define uart        PERIPH(uart_t,         APB_BASE+0x1000)
#define timer       PERIPH(timercounter_t, APB_BASE+0x20000)
#define aclint      PERIPH(aclint_t,       APB_BASE+0x30000)
#define irq         PERIPH(irq_t,          APB_BASE+0x40000)
#define qspi        PERIPH(qspi_t,         APB_BASE+0x50000)
#define i2s         PERIPH(i2s_t,          APB_BASE+0x90000)
#define camera      PERIPH(camera_t,       APB_BASE+0xA0000)
#define dma         PERIPH(dma_t,          APB_BASE+0xB0000)
#define msgif       PERIPH(msgif_t,        APB_BASE+0xC0000)


#define XIP_START_LOC 0xE0040000
#define RAM_START_LOC 0x80000000

// Misc

#include <stdint.h>

void init_pll(void);
unsigned long get_cpu_freq(void);
unsigned long get_timer_freq(void);

#endif /* _ISS_PLATFORM_H */