1/* 2 * Copyright 2019, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the BSD 2-Clause license. Note that NO WARRANTY is provided. 8 * See "LICENSE_BSD2.txt" for details. 9 * 10 * @TAG(DATA61_BSD) 11 */ 12 13#pragma once 14 15#include <platsupport/timer.h> 16 17#define TIMER_BASE 0xc1100000 18#define TIMER_MAP_BASE 0xc1109000 19 20#define TIMER_REG_START 0x2650 // TIMER_MUX 21 22#define TIMER_E_INPUT_CLK 8 23#define TIMER_D_INPUT_CLK 6 24#define TIMER_C_INPUT_CLK 4 25#define TIMER_B_INPUT_CLK 2 26#define TIMER_A_INPUT_CLK 0 27 28#define TIMER_D_EN BIT(19) 29#define TIMER_C_EN BIT(18) 30#define TIMER_B_EN BIT(17) 31#define TIMER_A_EN BIT(16) 32#define TIMER_D_MODE BIT(15) 33#define TIMER_C_MODE BIT(14) 34#define TIMER_B_MODE BIT(13) 35#define TIMER_A_MODE BIT(12) 36 37#define TIMER_I_EN BIT(19) 38#define TIMER_H_EN BIT(18) 39#define TIMER_G_EN BIT(17) 40#define TIMER_F_EN BIT(16) 41#define TIMER_I_MODE BIT(15) 42#define TIMER_H_MODE BIT(14) 43#define TIMER_G_MODE BIT(13) 44#define TIMER_F_MODE BIT(12) 45 46#define TIMER_I_INPUT_CLK 6 47#define TIMER_H_INPUT_CLK 4 48#define TIMER_G_INPUT_CLK 2 49#define TIMER_F_INPUT_CLK 0 50 51#define TIMESTAMP_TIMEBASE_SYSTEM 0b000 52#define TIMESTAMP_TIMEBASE_1_US 0b001 53#define TIMESTAMP_TIMEBASE_10_US 0b010 54#define TIMESTAMP_TIMEBASE_100_US 0b011 55#define TIMESTAMP_TIMEBASE_1_MS 0b100 56 57#define TIMEOUT_TIMEBASE_1_US 0b00 58#define TIMEOUT_TIMEBASE_10_US 0b01 59#define TIMEOUT_TIMEBASE_100_US 0b10 60#define TIMEOUT_TIMEBASE_1_MS 0b11 61 62#define TIMER_A_IRQ 42 63#define TIMER_B_IRQ 43 64#define TIMER_C_IRQ 38 65#define TIMER_D_IRQ 61 66 67#define TIMER_F_IRQ 92 68#define TIMER_G_IRQ 93 69#define TIMER_H_IRQ 94 70#define TIMER_I_IRQ 95 71 72typedef struct { 73 uint32_t mux; 74 uint32_t timer_a; 75 uint32_t timer_b; 76 uint32_t timer_c; 77 uint32_t timer_d; 78 uint32_t unused[13]; 79 uint32_t timer_e; 80 uint32_t timer_e_hi; 81 uint32_t mux1; 82 uint32_t timer_f; 83 uint32_t timer_g; 84 uint32_t timer_h; 85 uint32_t timer_i; 86} meson_timer_reg_t; 87 88typedef struct { 89 volatile meson_timer_reg_t *regs; 90 bool disable; 91} meson_timer_t; 92 93typedef struct { 94 void *vaddr; 95} meson_timer_config_t; 96 97int meson_init(meson_timer_t *timer, meson_timer_config_t config); 98uint64_t meson_get_time(meson_timer_t *timer); 99void meson_set_timeout(meson_timer_t *timer, uint16_t timeout, bool periodic); 100void meson_stop_timer(meson_timer_t *timer); 101