Line 50... |
Line 50... |
*
|
*
|
* @return 0 if MTIME was not synthesized, 1 if MTIME is available.
|
* @return 0 if MTIME was not synthesized, 1 if MTIME is available.
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_mtime_available(void) {
|
int neorv32_mtime_available(void) {
|
|
|
if (neorv32_cpu_csr_read(CSR_MFEATURES) & (1 << CPU_MFEATURES_IO_MTIME)) {
|
if (SYSINFO_FEATURES & (1 << SYSINFO_FEATURES_IO_MTIME)) {
|
return 1;
|
return 1;
|
}
|
}
|
else {
|
else {
|
return 0;
|
return 0;
|
}
|
}
|
Line 68... |
Line 68... |
*
|
*
|
* @param[in] time New system time (uint64_t)
|
* @param[in] time New system time (uint64_t)
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_mtime_set_time(uint64_t time) {
|
void neorv32_mtime_set_time(uint64_t time) {
|
|
|
MTIME = time;
|
union {
|
|
uint64_t uint64;
|
|
uint32_t uint32[sizeof(uint64_t)/2];
|
|
} cycles;
|
|
|
|
cycles.uint64 = time;
|
|
|
|
MTIME_LO = 0;
|
|
MTIME_HI = cycles.uint32[1];
|
|
MTIME_LO = cycles.uint32[0];
|
|
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Get current system time.
|
* Get current system time.
|
Line 81... |
Line 91... |
*
|
*
|
* @return Current system time (uint64_t)
|
* @return Current system time (uint64_t)
|
**************************************************************************/
|
**************************************************************************/
|
uint64_t neorv32_mtime_get_time(void) {
|
uint64_t neorv32_mtime_get_time(void) {
|
|
|
return MTIME;
|
union {
|
|
uint64_t uint64;
|
|
uint32_t uint32[sizeof(uint64_t)/2];
|
|
} cycles;
|
|
|
|
uint32_t tmp1, tmp2, tmp3;
|
|
while(1) {
|
|
tmp1 = MTIME_HI;
|
|
tmp2 = MTIME_LO;
|
|
tmp3 = MTIME_HI;
|
|
if (tmp1 == tmp3) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
cycles.uint32[0] = tmp2;
|
|
cycles.uint32[1] = tmp3;
|
|
|
|
return cycles.uint64;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Set compare time register (MTIMECMP) for generating interrupts.
|
* Set compare time register (MTIMECMP) for generating interrupts.
|