14
#include <drivers/amba_pnp.h>
17
#include <hal/system.h>
18
#include <kernel/irq.h>
19
#include <kernel/panic.h>
20
#include <kernel/time/clock_source.h>
21
#include <kernel/time/ktime.h>
23
#include <embox/unit.h>
25
#define SCALER_RELOAD (SYS_CLOCK / 1000000 - 1)
26
#define TIMER0_RELOAD (1000000 / 1000 - 1)
28
#define CTRL_EN (1 << 0)
29
#define CTRL_RS (1 << 1)
30
#define CTRL_LD (1 << 2)
31
#define CTRL_IE (1 << 3)
32
#define CTRL_IP (1 << 4)
33
#define CTRL_CH (1 << 5)
34
#define CTRL_DH (1 << 6)
36
#define CTRL_INITIAL (CTRL_EN | CTRL_RS | CTRL_LD | CTRL_IE)
38
#define CFG_NTIMERS(cfg_reg) (cfg_reg & 0x7)
39
#define CFG_IRQ(cfg_reg) ((cfg_reg >> 3) & 0x1f)
40
#define CFG_SI(cfg_reg) ((cfg_reg >> 8) & 0x1)
50
uint32_t scaler_counter;
56
uint32_t scaler_reload;
92
static volatile struct gptimer_regs *dev_regs;
94
static int dev_regs_init(unsigned int *irq_nr);
96
static struct time_event_device gptimer_ed;
98
static irq_return_t clock_handler(unsigned int irq_nr, void *dev_id) {
100
clock_tick_handler(dev_id);
104
static int gptimer_init(struct clock_source *cs) {
109
if (NULL != dev_regs) {
113
if (0 != dev_regs_init(&irq_nr)) {
114
panic("Unable to initialize gptimer dev_regs");
116
assert(NULL != dev_regs);
118
gptimer_ed.irq_nr = irq_nr;
120
cfg_reg = REG_LOAD(&dev_regs->cfg);
121
for (i = 0; i < CFG_NTIMERS(cfg_reg); ++i) {
122
REG_STORE(&dev_regs->timer[i].ctrl, 0x0);
125
REG_STORE(&dev_regs->scaler_reload, SCALER_RELOAD);
126
REG_STORE(&dev_regs->scaler_counter, 0);
128
return irq_attach(irq_nr, clock_handler, 0, cs, "gptimer");
131
static int gptimer_set_periodic(struct clock_source *cs);
133
static cycle_t gptimer_read(struct clock_source *cs) {
134
return TIMER0_RELOAD - REG_LOAD(&dev_regs->timer[0].counter);
137
static struct time_event_device gptimer_ed = {
138
.set_periodic = gptimer_set_periodic ,
141
static struct time_counter_device gptimer_cd = {
142
.read = gptimer_read,
146
static int gptimer_set_periodic(struct clock_source *cs) {
147
REG_STORE(&dev_regs->timer[0].reload, TIMER0_RELOAD);
148
REG_STORE(&dev_regs->timer[0].counter, 0);
149
REG_STORE(&dev_regs->timer[0].ctrl, CTRL_INITIAL);
154
static int dev_regs_init(unsigned int *irq_nr) {
157
assert(NULL != irq_nr);
158
if (-1 == capture_amba_dev(&amba_dev, AMBAPP_VENDOR_GAISLER,
159
AMBAPP_DEVICE_GAISLER_GPTIMER, false, false)) {
160
printk("can't capture apb dev venID=0x%X, devID=0x%X\n",
161
AMBAPP_VENDOR_GAISLER, AMBAPP_DEVICE_GAISLER_GPTIMER);
164
dev_regs = (struct gptimer_regs *) amba_dev.bar[0].start;
165
*irq_nr = amba_dev.dev_info.irq;
168
#elif OPTION_DEFINED(NUMBER,gptimer_base)
169
static int dev_regs_init(unsigned int *irq_nr) {
170
assert(NULL != irq_nr);
171
dev_regs = (volatile struct gptimer_regs *) OPTION_GET(NUMBER,gptimer_base);
172
*irq_nr = OPTION_GET(NUMBER,irq_num);
176
# error "Either DRIVER_AMBAPP or gptimer_base must be defined"
179
CLOCK_SOURCE_DEF(gptimer, gptimer_init, NULL,
180
&gptimer_ed, &gptimer_cd);