/* * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #define KZM_EPIT_BASE_ADDR (unsigned int)mem #define KZM_EPIT_CTRL_ADDR (KZM_EPIT_BASE_ADDR + 0x00) #define KZM_EPIT_STAT_ADDR (KZM_EPIT_BASE_ADDR + 0x04) #define KZM_EPIT_LOAD_ADDR (KZM_EPIT_BASE_ADDR + 0x08) #define KZM_EPIT_COMP_ADDR (KZM_EPIT_BASE_ADDR + 0x0C) #define KZM_EPIT_CNT_ADDR (KZM_EPIT_BASE_ADDR + 0x10) #define REG_VAL(x) *((volatile uint32_t *)(x)) #define CTRL_EN (1 << 0) /* EPIT enable */ #define CTRL_ENMOD (1 << 1) /* EPIT enable mode */ #define CTRL_OCIEN (1 << 2) /* EPIT interrupt enable */ #define CTRL_RLD (1 << 3) /* Counter reload control */ #define CTRL_SWR (1 << 17) /* Software reset */ #define CTRL_CLKSRC_SHIFT (24) /* Clock source */ #define CTRL_PRESCALE_SHIFT (4) /* Prescalar */ //#define IPG_CLK_KHZ (53200) /* Clock frequency in KHz */ #define IPG_CLK_KHZ (66000) /* Clock frequency in KHz */ #define CLKSRC_IPG (0x1) /* IPG clock */ #define CLKSRC_IPG_HIGH (0x2) /* IPG clock high frequency */ #define CLKSRC_IPG_32K (0x3) /* IPG 32K clock */ void epit_init() { printf("EPIT init\n"); REG_VAL(KZM_EPIT_CTRL_ADDR) = 0; /* Disable EPIT and reset. */ REG_VAL(KZM_EPIT_CTRL_ADDR) = CTRL_SWR; /* Select Clock source */ REG_VAL(KZM_EPIT_CTRL_ADDR) = (CLKSRC_IPG << CTRL_CLKSRC_SHIFT); /* Reload from load register */ REG_VAL(KZM_EPIT_CTRL_ADDR) |= (CTRL_RLD | CTRL_ENMOD); /* Enable interrupt */ REG_VAL(KZM_EPIT_CTRL_ADDR) |= CTRL_OCIEN; } /* Set interrupt interval, in milliseconds. */ void epit_set_interval(int interval) { REG_VAL(KZM_EPIT_LOAD_ADDR) = (IPG_CLK_KHZ * interval) ; REG_VAL(KZM_EPIT_COMP_ADDR) = 0; } void epit_start_timer(void) { REG_VAL(KZM_EPIT_STAT_ADDR) = 0x1; /* Enable timer */ REG_VAL(KZM_EPIT_CTRL_ADDR) |= CTRL_EN; } static int count = 0; void irq_handle(void) { /* Clear status bit. */ REG_VAL(KZM_EPIT_STAT_ADDR) = 0x1; irq_acknowledge(); printf("EPIT time out...%d\n", count++); } int run(void) { epit_init(); epit_set_interval(1000); epit_start_timer(); return 0; }