From 2237b19be941c76906f07ba50c5b439d55ef1c1c Mon Sep 17 00:00:00 2001 From: imi415 Date: Tue, 13 Apr 2021 02:23:31 +0800 Subject: [PATCH] Moved drivers to subdirectory, use vectored exception model. --- include/{ => drivers}/xilinx_gpio.h | 3 ++- include/{ => drivers}/xilinx_timer.h | 0 include/{ => drivers}/xilinx_uartlite.h | 0 include/soc_peripherals.h | 6 +++--- src/drivers/xilinx_gpio.c | 24 +++++++++++++++++++++++- src/drivers/xilinx_timer.c | 2 +- src/drivers/xilinx_uartlite.c | 2 +- src/flute_it.c | 25 ++++++++++--------------- src/main.c | 11 +++++++++-- src/system_init.c | 2 +- startup/startup.S | 10 ++++++++-- 11 files changed, 58 insertions(+), 27 deletions(-) rename include/{ => drivers}/xilinx_gpio.h (76%) rename include/{ => drivers}/xilinx_timer.h (100%) rename include/{ => drivers}/xilinx_uartlite.h (100%) diff --git a/include/xilinx_gpio.h b/include/drivers/xilinx_gpio.h similarity index 76% rename from include/xilinx_gpio.h rename to include/drivers/xilinx_gpio.h index 409fd7c..156aefe 100644 --- a/include/xilinx_gpio.h +++ b/include/drivers/xilinx_gpio.h @@ -19,5 +19,6 @@ sys_ret_t xilinx_gpio_pinmode(xilinx_gpio_handle_t *handle, uint32_t pin, uint8_ sys_ret_t xilinx_gpio_write(xilinx_gpio_handle_t *handle, uint32_t pin, uint8_t value); uint8_t xilinx_gpio_read(xilinx_gpio_handle_t *handle, uint32_t pin); sys_ret_t xilinx_gpio_toggle(xilinx_gpio_handle_t *handle, uint32_t pin); - +sys_ret_t xilinx_gpio_port_mode(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t output_mask); +sys_ret_t xilinx_gpio_port_write(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t value); #endif \ No newline at end of file diff --git a/include/xilinx_timer.h b/include/drivers/xilinx_timer.h similarity index 100% rename from include/xilinx_timer.h rename to include/drivers/xilinx_timer.h diff --git a/include/xilinx_uartlite.h b/include/drivers/xilinx_uartlite.h similarity index 100% rename from include/xilinx_uartlite.h rename to include/drivers/xilinx_uartlite.h diff --git a/include/soc_peripherals.h b/include/soc_peripherals.h index 05923ec..65fa2e8 100644 --- a/include/soc_peripherals.h +++ b/include/soc_peripherals.h @@ -1,9 +1,9 @@ #ifndef __SOC_PERIPHERALS_H #define __SOC_PERIPHERALS_H -#include "xilinx_uartlite.h" -#include "xilinx_gpio.h" -#include "xilinx_timer.h" +#include "drivers/xilinx_uartlite.h" +#include "drivers/xilinx_gpio.h" +#include "drivers/xilinx_timer.h" #include "flute_system.h" diff --git a/src/drivers/xilinx_gpio.c b/src/drivers/xilinx_gpio.c index 0fec481..640e9bc 100644 --- a/src/drivers/xilinx_gpio.c +++ b/src/drivers/xilinx_gpio.c @@ -1,4 +1,4 @@ -#include "xilinx_gpio.h" +#include "drivers/xilinx_gpio.h" sys_ret_t xilinx_gpio_init(xilinx_gpio_handle_t *handle) { handle->instance->TRI = 0xFFFFFFFF; @@ -31,5 +31,27 @@ uint8_t xilinx_gpio_read(xilinx_gpio_handle_t *handle, uint32_t pin) { sys_ret_t xilinx_gpio_toggle(xilinx_gpio_handle_t *handle, uint32_t pin) { handle->instance->DATA ^= (1U << pin); + return RET_OK; +} + +sys_ret_t xilinx_gpio_port_mode(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t output_mask) { + if(bank == 0) { + handle->instance->TRI = ~output_mask; + } + else { + handle->instance->TRI2 = ~output_mask; + } + + return RET_OK; +} + +sys_ret_t xilinx_gpio_port_write(xilinx_gpio_handle_t *handle, uint8_t bank, uint32_t value) { + if(bank == 0) { + handle->instance->DATA = value; + } + else { + handle->instance->DATA2 = value; + } + return RET_OK; } \ No newline at end of file diff --git a/src/drivers/xilinx_timer.c b/src/drivers/xilinx_timer.c index 4ec13a3..09d5c55 100644 --- a/src/drivers/xilinx_timer.c +++ b/src/drivers/xilinx_timer.c @@ -1,2 +1,2 @@ -#include "xilinx_timer.h" +#include "drivers/xilinx_timer.h" diff --git a/src/drivers/xilinx_uartlite.c b/src/drivers/xilinx_uartlite.c index 396a961..c436b27 100644 --- a/src/drivers/xilinx_uartlite.c +++ b/src/drivers/xilinx_uartlite.c @@ -1,4 +1,4 @@ -#include "xilinx_uartlite.h" +#include "drivers/xilinx_uartlite.h" sys_ret_t xilinx_uartlite_init(xilinx_uartlite_handle_t *handle) { handle->instance->CTRL |= 0x03; // Reset FIFO diff --git a/src/flute_it.c b/src/flute_it.c index 5338a0a..c7f7a54 100644 --- a/src/flute_it.c +++ b/src/flute_it.c @@ -1,22 +1,17 @@ #include "flute_system.h" #include "soc_peripherals.h" -void Timer_IRQHandler(void) { - SysTick++; - *(uint64_t *)(CLINT_BASE + 0x4000) = SYS_TICK_STEP; - *(uint64_t *)(CLINT_BASE + 0xBFF8) = 0ULL; +__attribute__((interrupt)) void Default_IRQHandler(void) { + for(;;) { + // + } } -__attribute__((interrupt)) void Exception_Handler(void) { - uint64_t mcause = 0; +__attribute__((interrupt)) void Timer_IRQHandler(void) { + SysTick++; - __csrr("mcause", mcause); - - switch(mcause) { - case 0x8000000000000007: // MTIME - Timer_IRQHandler(); - break; - default: - for(;;) {} - } + uint64_t *mtimecmp = (uint64_t *)(CLINT_BASE + 0x4000); + uint64_t *mtime = (uint64_t *)(CLINT_BASE + 0xBFF8); + + *mtimecmp = *mtime + SYS_TICK_STEP; // Interrupt flag will be cleared by a write to MTIMECMP. } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 96f8283..6afb57a 100644 --- a/src/main.c +++ b/src/main.c @@ -22,13 +22,20 @@ int main(int argc, char *argv[]) { printf("System clock frequency: %luHz\r\n", SYS_CLK_FREQ); - xilinx_gpio_pinmode(&soc_gpio, 0, 1); + xilinx_gpio_port_mode(&soc_gpio, 0, 0x000000FF); // All output + + uint8_t led_data = 0x01; for(;;) { System_Delay(500); + __csrr("mcycle", csr); printf("mcycle: 0x%016llx\r\n", csr); - xilinx_gpio_toggle(&soc_gpio, 0); + + xilinx_gpio_port_write(&soc_gpio, 0, ~led_data); + + led_data <<= 1U; + if(led_data == 0) led_data = 0x01; } return 0; diff --git a/src/system_init.c b/src/system_init.c index a9388f4..3e6b481 100644 --- a/src/system_init.c +++ b/src/system_init.c @@ -12,7 +12,7 @@ void System_Init(void) { xilinx_gpio_pinmode(&soc_gpio, 0, 1); // Setup interrupt system - uint64_t csr = 0ULL; + uint64_t csr = 0x01ULL; // Enable vector'd exception handling. __csrw("mtvec", csr); SysTick = 0ULL; diff --git a/startup/startup.S b/startup/startup.S index a71afbd..e1e6732 100644 --- a/startup/startup.S +++ b/startup/startup.S @@ -84,7 +84,13 @@ inf_loop: .option norvc; .org 0x00 - jal x0, Exception_Handler - + jal x0, Default_IRQHandler // USI + jal x0, Default_IRQHandler // SSI + jal x0, Default_IRQHandler // RFU + jal x0, Default_IRQHandler // MSI + jal x0, Default_IRQHandler // UTI + jal x0, Default_IRQHandler // STI + jal x0, Default_IRQHandler // RFU + jal x0, Timer_IRQHandler // MTI .org 0x1000 jal x0, Reset_Handler