rockchip: rk3399: add stopwatch functions to m0
There is system timer in m0, we can use it to implement a set of stopwatch functions for measuring timeouts. Signed-off-by: Lin Huang <hl@rock-chips.com> Signed-off-by: Derek Basehore <dbasehore@chromium.org>
This commit is contained in:
parent
09f41f8ed6
commit
95c3f422d8
|
@ -53,7 +53,8 @@ INCLUDES += -Iinclude/ \
|
||||||
C_SOURCES := src/startup.c \
|
C_SOURCES := src/startup.c \
|
||||||
src/main.c \
|
src/main.c \
|
||||||
src/suspend.c \
|
src/suspend.c \
|
||||||
src/dram.c
|
src/dram.c \
|
||||||
|
src/stopwatch.c
|
||||||
|
|
||||||
# Flags definition
|
# Flags definition
|
||||||
CFLAGS := -g
|
CFLAGS := -g
|
||||||
|
|
|
@ -44,6 +44,9 @@ typedef unsigned int uint32_t;
|
||||||
#define mmio_clrsetbits_32(addr, clear, set) \
|
#define mmio_clrsetbits_32(addr, clear, set) \
|
||||||
mmio_write_32(addr, (mmio_read_32(addr) & ~(clear)) | (set))
|
mmio_write_32(addr, (mmio_read_32(addr) & ~(clear)) | (set))
|
||||||
|
|
||||||
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||||
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
#define MCU_BASE 0x40000000
|
#define MCU_BASE 0x40000000
|
||||||
#define PMU_BASE (MCU_BASE + 0x07310000)
|
#define PMU_BASE (MCU_BASE + 0x07310000)
|
||||||
#define CRU_BASE_ADDR 0x47760000
|
#define CRU_BASE_ADDR 0x47760000
|
||||||
|
@ -55,5 +58,8 @@ typedef unsigned int uint32_t;
|
||||||
|
|
||||||
void handle_suspend(void);
|
void handle_suspend(void);
|
||||||
void handle_dram(void);
|
void handle_dram(void);
|
||||||
|
void stopwatch_init_usecs_expire(unsigned int usecs);
|
||||||
|
int stopwatch_expired(void);
|
||||||
|
void stopwatch_reset(void);
|
||||||
|
|
||||||
#endif /* __RK3399_MCU_H__ */
|
#endif /* __RK3399_MCU_H__ */
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
* to endorse or promote products derived from this software without specific
|
||||||
|
* prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <m0_param.h>
|
||||||
|
#include "rk3399_mcu.h"
|
||||||
|
|
||||||
|
/* use 24MHz SysTick */
|
||||||
|
#define US_TO_CYCLE(US) (US * 24)
|
||||||
|
|
||||||
|
#define SYST_CST 0xe000e010
|
||||||
|
/* enable counter */
|
||||||
|
#define ENABLE (1 << 0)
|
||||||
|
/* count down to 0 does not cause SysTick exception to pend */
|
||||||
|
#define TICKINT (1 << 1)
|
||||||
|
/* core clock used for SysTick */
|
||||||
|
#define CLKSOURCE (1 << 2)
|
||||||
|
|
||||||
|
#define COUNTFLAG (1 << 16)
|
||||||
|
#define SYST_RVR 0xe000e014
|
||||||
|
#define MAX_VALUE 0xffffff
|
||||||
|
#define MAX_USECS (MAX_VALUE / US_TO_CYCLE(1))
|
||||||
|
#define SYST_CVR 0xe000e018
|
||||||
|
#define SYST_CALIB 0xe000e01c
|
||||||
|
|
||||||
|
unsigned int remaining_usecs;
|
||||||
|
|
||||||
|
static inline void stopwatch_set_usecs(void)
|
||||||
|
{
|
||||||
|
unsigned int cycle;
|
||||||
|
unsigned int usecs = MIN(MAX_USECS, remaining_usecs);
|
||||||
|
|
||||||
|
remaining_usecs -= usecs;
|
||||||
|
cycle = US_TO_CYCLE(usecs);
|
||||||
|
mmio_write_32(SYST_RVR, cycle);
|
||||||
|
mmio_write_32(SYST_CVR, 0);
|
||||||
|
|
||||||
|
mmio_write_32(SYST_CST, ENABLE | TICKINT | CLKSOURCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopwatch_init_usecs_expire(unsigned int usecs)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Enter an inifite loop if the stopwatch is in use. This will allow the
|
||||||
|
* state to be analyzed with a debugger.
|
||||||
|
*/
|
||||||
|
if (mmio_read_32(SYST_CST) & ENABLE)
|
||||||
|
while (1)
|
||||||
|
;
|
||||||
|
|
||||||
|
remaining_usecs = usecs;
|
||||||
|
stopwatch_set_usecs();
|
||||||
|
}
|
||||||
|
|
||||||
|
int stopwatch_expired(void)
|
||||||
|
{
|
||||||
|
int val = mmio_read_32(SYST_CST);
|
||||||
|
if ((val & COUNTFLAG) || !(val & ENABLE)) {
|
||||||
|
if (!remaining_usecs)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
stopwatch_set_usecs();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopwatch_reset(void)
|
||||||
|
{
|
||||||
|
mmio_clrbits_32(SYST_CST, ENABLE);
|
||||||
|
remaining_usecs = 0;
|
||||||
|
}
|
Loading…
Reference in New Issue