drivers: timer: add LiteX timer driver
Add LiteX timer driver with bindings for this device. Signed-off-by: Filip Kokosinski <fkokosinski@internships.antmicro.com> Signed-off-by: Mateusz Holenko <mholenko@antmicro.com>
This commit is contained in:
parent
b3739169cb
commit
c0c3cdfc57
6 changed files with 116 additions and 0 deletions
73
drivers/timer/litex_timer.c
Normal file
73
drivers/timer/litex_timer.c
Normal file
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (c) 2018 - 2019 Antmicro <www.antmicro.com>
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <kernel.h>
|
||||
#include <arch/cpu.h>
|
||||
#include <device.h>
|
||||
#include <irq.h>
|
||||
#include <system_timer.h>
|
||||
|
||||
#define TIMER_BASE DT_LITEX_TIMER0_E0002800_BASE_ADDRESS
|
||||
#define TIMER_LOAD_ADDR ((TIMER_BASE) + 0x00)
|
||||
#define TIMER_RELOAD_ADDR ((TIMER_BASE) + 0x10)
|
||||
#define TIMER_EN_ADDR ((TIMER_BASE) + 0x20)
|
||||
#define TIMER_EV_PENDING_ADDR ((TIMER_BASE) + 0x3c)
|
||||
#define TIMER_EV_ENABLE_ADDR ((TIMER_BASE) + 0x40)
|
||||
|
||||
#define TIMER_EV 0x1
|
||||
#define TIMER_IRQ DT_LITEX_TIMER0_E0002800_IRQ_0
|
||||
#define TIMER_DISABLE 0x0
|
||||
#define TIMER_ENABLE 0x1
|
||||
#define TIMER_VALUE ((CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC) / 100)
|
||||
|
||||
|
||||
static u32_t accumulated_cycle_count;
|
||||
|
||||
static void litex_timer_irq_handler(void *device)
|
||||
{
|
||||
ARG_UNUSED(device);
|
||||
int key = irq_lock();
|
||||
|
||||
sys_write8(TIMER_EV, TIMER_EV_PENDING_ADDR);
|
||||
accumulated_cycle_count += sys_clock_hw_cycles_per_tick();
|
||||
z_clock_announce(1);
|
||||
|
||||
irq_unlock(key);
|
||||
}
|
||||
|
||||
u32_t z_timer_cycle_get_32(void)
|
||||
{
|
||||
return accumulated_cycle_count;
|
||||
}
|
||||
|
||||
/* tickless kernel is not supported */
|
||||
u32_t z_clock_elapsed(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int z_clock_driver_init(struct device *device)
|
||||
{
|
||||
ARG_UNUSED(device);
|
||||
IRQ_CONNECT(TIMER_IRQ, DT_LITEX_TIMER0_E0002800_IRQ_0_PRIORITY,
|
||||
litex_timer_irq_handler, NULL, 0);
|
||||
irq_enable(TIMER_IRQ);
|
||||
|
||||
sys_write8(TIMER_DISABLE, TIMER_EN_ADDR);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
sys_write8(TIMER_VALUE >> (24 - i * 8),
|
||||
TIMER_RELOAD_ADDR + i * 0x4);
|
||||
sys_write8(TIMER_VALUE >> (24 - i * 8),
|
||||
TIMER_LOAD_ADDR + i * 0x4);
|
||||
}
|
||||
|
||||
sys_write8(TIMER_ENABLE, TIMER_EN_ADDR);
|
||||
sys_write8(sys_read8(TIMER_EV_PENDING_ADDR), TIMER_EV_PENDING_ADDR);
|
||||
sys_write8(TIMER_EV, TIMER_EV_ENABLE_ADDR);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue