Abstract CSR operations

This commit is contained in:
imi415 2020-05-31 20:58:05 +08:00
parent 8b4c7855cc
commit 38deee9f94
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
6 changed files with 52 additions and 7 deletions

View File

@ -31,7 +31,7 @@ BIN = $(CP) -O binary
CFLAGS += -mabi=ilp32 -march=rv32imc -g $(INCLUDES)
ASFLAGS += -mabi=ilp32 -march=rv32imc -g
LDFLAGS += -nostartfiles -specs=nano.specs -lc -lm -lnosys
LDFLAGS += -nostartfiles -specs=nosys.specs -lc -lm -lnosys
LDFLAGS += -T$(LDSCRIPT) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map -Wl,--print-memory-usage

View File

@ -1,7 +1,19 @@
#ifndef __IBEX_SYSTEM_H
#define __IBEX_SYSTEM_H
#include <stdint.h>
#define TIMER_IRQn 7
#define __csrr(csr, val) asm volatile("csrr %0, " csr "\n" : "=r"(val))
#define __csrw(csr, val) asm volatile("csrw " csr ", %0\n" : : "r"(val))
#define __csrs(csr, val) asm volatile("csrs " csr ", %0\n" : : "r"(val))
#define __csrc(csr, val) asm volatile("csrc " csr ", %0\n" : : "r"(val))
void __enable_irqs(void);
void __disable_irqs(void);
void __enable_irqn(int irq_number);
void __enable_mcount(void);
uint64_t __read_mcycle(void);
#endif

View File

@ -5,6 +5,8 @@
#include "xilinx_gpio.h"
#include "xilinx_timer.h"
#include "ibex_system.h"
// Peripheral defines
#define UART0_BASE 0x40010000
#define GPIO0_BASE 0x40000000

View File

@ -1,9 +1,37 @@
#include "ibex_system.h"
void __attribute__((naked)) __enable_irqs(void) {
asm volatile("csrs mstatus, %0\n" : : "r"(0x8));
void __enable_irqs(void) {
__csrs("mstatus", 0x08);
}
void __attribute__((naked)) __disable_irqs(void) {
asm volatile("csrc mstatus, %0\n" : : "r"(0x08));
void __disable_irqs(void) {
__csrc("mstatus", 0x08);
}
void __enable_irqn(int irq_number) {
__csrs("mie", (1U << irq_number));
}
void __enable_mcount(void) {
// CY bit in mcountinhibit
// RISC-V GCC has not implement this CSR name for now.
__csrc("0x320", 0x01);
}
void __disable_mcount(void) {
// Same as above.
__csrs("0x320", 0x01);
}
uint64_t __read_mcycle(void) {
uint32_t mcycleh = 0;
uint32_t mcycle = 0;
__csrr("mcycle", mcycle);
__csrr("mcycleh", mcycleh);
uint64_t ret = mcycleh << 31;
ret <<= 1;
ret |= mcycle;
return ret;
}

View File

@ -41,6 +41,7 @@ int main(int argc, char *argv[]) {
previous_tick = GetTick();
xilinx_gpio_toggle(&soc_gpio, 1);
printf("SysTick: %lu\r\n", GetTick());
printf("MCycle: %llu\r\n", __read_mcycle());
}
}
return 0;

View File

@ -14,8 +14,10 @@ void System_Init(void) {
SysTick = 0;
// Enable interrupts
asm volatile("csrs mie, %0\n" : : "r"(0x80)); // Enable timer interrupt
asm volatile("csrs mstatus, %0\n" : : "r"(0x8)); // Enable global interrupt
__enable_irqn(TIMER_IRQn); // Enable timer interrupt
__enable_irqs();
__enable_mcount();
// Setup systick timer
TIMER0->TCSR0 = 0x12; // Generate mode, down count, auto-reload