Compare commits
	
		
			6 Commits
		
	
	
		
			a7b4e7b715
			...
			bf0e4ec057
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bf0e4ec057 | |||
| 018e07ecee | |||
| fc37441911 | |||
| b5cee82f3e | |||
| 20161cc1af | |||
| 0843d92878 | 
							
								
								
									
										2
									
								
								env/common-gcc.mk
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								env/common-gcc.mk
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,7 @@ INCLUDES += -I$(PLATFORM_DIR) | |||||||
| INCLUDES += -I$(BSP_BASE)/libwrap/sys/ | INCLUDES += -I$(BSP_BASE)/libwrap/sys/ | ||||||
|  |  | ||||||
| LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) | LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) | ||||||
| LDFLAGS += -L$(ENV_DIR) | LDFLAGS += -L$(ENV_DIR) -L$(PLATFORM_DIR) | ||||||
| LD_SCRIPT += -T $(LINKER_SCRIPT) -Wl,--no-warn-rwx-segments -Wl,-Map=$(TARGET).map  -nostartfiles  | LD_SCRIPT += -T $(LINKER_SCRIPT) -Wl,--no-warn-rwx-segments -Wl,-Map=$(TARGET).map  -nostartfiles  | ||||||
|  |  | ||||||
| ifneq (,$(findstring specs=nano.specs,$(LDFLAGS), LD_SCRIPT)) | ifneq (,$(findstring specs=nano.specs,$(LDFLAGS), LD_SCRIPT)) | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ ENTRY( _start ) | |||||||
| MEMORY | MEMORY | ||||||
| { | { | ||||||
|   flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M |   flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M | ||||||
|   ram (wxa!ri) :   ORIGIN = 0x10000000, LENGTH = 64K |   ram (wxa!ri) :   ORIGIN = 0x20000000, LENGTH = 1M | ||||||
| } | } | ||||||
|  |  | ||||||
| PHDRS | PHDRS | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								env/riscv_vp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								env/riscv_vp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | /*.o | ||||||
							
								
								
									
										21
									
								
								env/riscv_vp/bsp_read.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								env/riscv_vp/bsp_read.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | #include "platform.h" | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | ssize_t _bsp_read(int fd, void *ptr, size_t len) { | ||||||
|  |   uint8_t *current = (uint8_t *)ptr; | ||||||
|  |   ssize_t result = 0; | ||||||
|  |   if (isatty(fd)) { | ||||||
|  |     for (current = (uint8_t *)ptr; (current < ((uint8_t *)ptr) + len) && | ||||||
|  |                                    (get_uart_rx_tx_reg_rx_avail(uart) > 0); | ||||||
|  |          current++) { | ||||||
|  |       *current = uart_read(uart); | ||||||
|  |       result++; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return result; | ||||||
|  |   } | ||||||
|  |   return EOF; | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								env/riscv_vp/bsp_write.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								env/riscv_vp/bsp_write.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | /* See LICENSE of license details. */ | ||||||
|  |  | ||||||
|  | #include "platform.h" | ||||||
|  | #include <errno.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | ssize_t _bsp_write(int fd, const void *ptr, size_t len) { | ||||||
|  |   const uint8_t *current = (const uint8_t *)ptr; | ||||||
|  |   if (isatty(fd)) { | ||||||
|  |     for (size_t jj = 0; jj < len; jj++) { | ||||||
|  |       uart_write(uart, current[jj]); | ||||||
|  |       if (current[jj] == '\n') { | ||||||
|  |         uart_write(uart, '\r'); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return len; | ||||||
|  |   } | ||||||
|  |   return 1; | ||||||
|  | } | ||||||
							
								
								
									
										177
									
								
								env/riscv_vp/flash.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								env/riscv_vp/flash.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | OUTPUT_ARCH( "riscv" ) | ||||||
|  |  | ||||||
|  | ENTRY( _start ) | ||||||
|  |  | ||||||
|  | INCLUDE memory_map.ld | ||||||
|  |  | ||||||
|  | PHDRS | ||||||
|  | { | ||||||
|  |   flash PT_LOAD; | ||||||
|  |   ram_init PT_LOAD; | ||||||
|  |   ram PT_NULL; | ||||||
|  |   dram PT_NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  |   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||||
|  |  | ||||||
|  |   .init ORIGIN(flash)        : | ||||||
|  |   { | ||||||
|  |     KEEP (*(SORT_NONE(.init))) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .text           : | ||||||
|  |   { | ||||||
|  |     *(.text.unlikely .text.unlikely.*) | ||||||
|  |     *(.text.startup .text.startup.*) | ||||||
|  |     *(.text .text.*) | ||||||
|  |     *(.gnu.linkonce.t.*) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .fini           : | ||||||
|  |   { | ||||||
|  |     KEEP (*(SORT_NONE(.fini))) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   PROVIDE (__etext = .); | ||||||
|  |   PROVIDE (_etext = .); | ||||||
|  |   PROVIDE (etext = .); | ||||||
|  |  | ||||||
|  |   .rodata         : | ||||||
|  |   { | ||||||
|  |     *(.rdata) | ||||||
|  |     *(.rodata .rodata.*) | ||||||
|  |     *(.gnu.linkonce.r.*) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   . = ALIGN(4); | ||||||
|  |  | ||||||
|  |   .preinit_array  : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||||
|  |     KEEP (*(.preinit_array)) | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .init_array     : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__init_array_start = .); | ||||||
|  |     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||||
|  |     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||||
|  |     PROVIDE_HIDDEN (__init_array_end = .); | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .fini_array     : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_start = .); | ||||||
|  |     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||||
|  |     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_end = .); | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .ctors          : | ||||||
|  |   { | ||||||
|  |     /* gcc uses crtbegin.o to find the start of | ||||||
|  |        the constructors, so we make sure it is | ||||||
|  |        first.  Because this is a wildcard, it | ||||||
|  |        doesn't matter if the user does not | ||||||
|  |        actually link against crtbegin.o; the | ||||||
|  |        linker won't look for a file to match a | ||||||
|  |        wildcard.  The wildcard also means that it | ||||||
|  |        doesn't matter which directory crtbegin.o | ||||||
|  |        is in.  */ | ||||||
|  |     KEEP (*crtbegin.o(.ctors)) | ||||||
|  |     KEEP (*crtbegin?.o(.ctors)) | ||||||
|  |     /* We don't want to include the .ctor section from | ||||||
|  |        the crtend.o file until after the sorted ctors. | ||||||
|  |        The .ctor section from the crtend file contains the | ||||||
|  |        end of ctors marker and it must be last */ | ||||||
|  |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||||
|  |     KEEP (*(SORT(.ctors.*))) | ||||||
|  |     KEEP (*(.ctors)) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .dtors          : | ||||||
|  |   { | ||||||
|  |     KEEP (*crtbegin.o(.dtors)) | ||||||
|  |     KEEP (*crtbegin?.o(.dtors)) | ||||||
|  |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||||
|  |     KEEP (*(SORT(.dtors.*))) | ||||||
|  |     KEEP (*(.dtors)) | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .dummy          : | ||||||
|  |   { | ||||||
|  | 	*(.comment.*) | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   .lalign         : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     PROVIDE( _data_lma = . ); | ||||||
|  |   } >flash AT>flash :flash | ||||||
|  |  | ||||||
|  |   .dalign         : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     PROVIDE( _data = . ); | ||||||
|  |   } >ram AT>flash :ram_init | ||||||
|  |  | ||||||
|  |   .data          : | ||||||
|  |   { | ||||||
|  |     __DATA_BEGIN__ = .; | ||||||
|  |     *(.data .data.*) | ||||||
|  |     *(.gnu.linkonce.d.*) | ||||||
|  |   } >ram AT>flash :ram_init | ||||||
|  |  | ||||||
|  |   .sdata          : | ||||||
|  |   { | ||||||
|  |     __SDATA_BEGIN__ = .; | ||||||
|  |     *(.sdata .sdata.*) | ||||||
|  |     *(.gnu.linkonce.s.*) | ||||||
|  |   } >ram AT>flash :ram_init | ||||||
|  |  | ||||||
|  |   .srodata        : | ||||||
|  |   { | ||||||
|  |     *(.srodata.cst16) | ||||||
|  |     *(.srodata.cst8) | ||||||
|  |     *(.srodata.cst4) | ||||||
|  |     *(.srodata.cst2) | ||||||
|  |     *(.srodata .srodata.*) | ||||||
|  |   } >ram AT>flash :ram_init | ||||||
|  |  | ||||||
|  |   . = ALIGN(4); | ||||||
|  |   PROVIDE( _edata = . ); | ||||||
|  |   PROVIDE( edata = . ); | ||||||
|  |  | ||||||
|  |   PROVIDE( _fbss = . ); | ||||||
|  |   PROVIDE( __bss_start = . ); | ||||||
|  |   .bss            : | ||||||
|  |   { | ||||||
|  |     *(.sbss*) | ||||||
|  |     *(.gnu.linkonce.sb.*) | ||||||
|  |     *(.bss .bss.*) | ||||||
|  |     *(.gnu.linkonce.b.*) | ||||||
|  |     *(COMMON) | ||||||
|  |     . = ALIGN(4); | ||||||
|  |   } >ram AT>ram :ram | ||||||
|  |  | ||||||
|  |   . = ALIGN(8); | ||||||
|  |   __BSS_END__ = .; | ||||||
|  |   __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,  MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); | ||||||
|  |   PROVIDE( _end = . ); | ||||||
|  |   PROVIDE( end = . ); | ||||||
|  |  | ||||||
|  |   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||||
|  |   { | ||||||
|  |     PROVIDE( _heap_end = . ); | ||||||
|  |     . = __stack_size; | ||||||
|  |     PROVIDE( _sp = . ); | ||||||
|  |   } >ram AT>ram :ram | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    | ||||||
|  |   PROVIDE( tohost = . ); | ||||||
|  |   PROVIDE( fromhost = . + 8 ); | ||||||
|  | } | ||||||
							
								
								
									
										138
									
								
								env/riscv_vp/init.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								env/riscv_vp/init.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <unistd.h> | ||||||
|  |  | ||||||
|  | #include "platform.h" | ||||||
|  | #include "encoding.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | extern int main(int argc, char** argv); | ||||||
|  | extern void trap_entry(void); | ||||||
|  | #define IRQ_M_SOFT   3 | ||||||
|  | #define IRQ_M_TIMER  7 | ||||||
|  | #define IRQ_M_EXT    11 | ||||||
|  |  | ||||||
|  | #define NUM_INTERRUPTS 16 | ||||||
|  | #define MTIMER_NEXT_TICK_INC 1000 | ||||||
|  |  | ||||||
|  | void handle_m_ext_interrupt(void); | ||||||
|  | void handle_m_time_interrupt(void); | ||||||
|  | uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp); | ||||||
|  | void default_handler(void); | ||||||
|  | void _init(void); | ||||||
|  |  | ||||||
|  | typedef void (*my_interrupt_function_ptr_t) (void); | ||||||
|  | my_interrupt_function_ptr_t localISR[NUM_INTERRUPTS] __attribute__((aligned(64))); | ||||||
|  |  | ||||||
|  | static unsigned long mtime_lo(void) | ||||||
|  | { | ||||||
|  |     unsigned long ret; | ||||||
|  |     __asm volatile("rdtime %0":"=r"(ret)); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if __riscv_xlen==32 | ||||||
|  |  | ||||||
|  | static uint32_t mtime_hi(void) | ||||||
|  | { | ||||||
|  |     unsigned long ret; | ||||||
|  |     __asm volatile("rdtimeh %0":"=r"(ret)); | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint64_t get_timer_value(void) | ||||||
|  | { | ||||||
|  |   while (1) { | ||||||
|  |     uint32_t hi = mtime_hi(); | ||||||
|  |     uint32_t lo = mtime_lo(); | ||||||
|  |     if (hi == mtime_hi()) | ||||||
|  |       return ((uint64_t)hi << 32) | lo; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #elif __riscv_xlen==64 | ||||||
|  |  | ||||||
|  | uint64_t get_timer_value() | ||||||
|  | { | ||||||
|  |   return mtime_lo(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | unsigned long get_timer_freq() | ||||||
|  | { | ||||||
|  |   return 32768; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | unsigned long get_cpu_freq() | ||||||
|  | { | ||||||
|  |   return 100000000; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void init_pll(void){ | ||||||
|  |     //TODO: implement initialization | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void uart_init(size_t baud_rate) | ||||||
|  | { | ||||||
|  |   //TODO: implement initialization | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __attribute__((weak)) handle_m_ext_interrupt(){ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __attribute__((weak)) handle_m_time_interrupt(){ | ||||||
|  |   uint64_t time = get_aclint_mtime(aclint); | ||||||
|  |   time+=MTIMER_NEXT_TICK_INC; | ||||||
|  |   set_aclint_mtimecmp(aclint, time); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __attribute__((weak)) default_handler(void) { | ||||||
|  |   puts("default handler\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void __attribute__((weak)) interrupt_handler(unsigned) { | ||||||
|  |   puts("interrupt handler\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp){ | ||||||
|  |   if ((mcause & MCAUSE_INT)) { | ||||||
|  |     if ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT) { | ||||||
|  |       handle_m_ext_interrupt(); | ||||||
|  |     } else if (((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){  | ||||||
|  |       handle_m_time_interrupt(); | ||||||
|  |     } else { | ||||||
|  |       interrupt_handler(mcause& ~MCAUSE_INT); | ||||||
|  |     } | ||||||
|  |   } else { | ||||||
|  |     write(1, "trap\n", 5); | ||||||
|  |     _exit(1 + mcause); | ||||||
|  |   } | ||||||
|  |   return mepc; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void _init() | ||||||
|  | { | ||||||
|  |    | ||||||
|  | #ifndef NO_INIT | ||||||
|  |   init_pll(); | ||||||
|  |   uart_init(115200); | ||||||
|  |   printf("core freq at %lu Hz\n", get_cpu_freq()); | ||||||
|  |   write_csr(mtvec, &trap_entry); | ||||||
|  |   if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present | ||||||
|  |     write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping | ||||||
|  |     write_csr(fcsr, 0); // initialize rounding mode, undefined at reset | ||||||
|  |   } | ||||||
|  |   int i=0; | ||||||
|  |   while(i<NUM_INTERRUPTS)  { | ||||||
|  |     localISR[i++] = default_handler; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #endif | ||||||
|  |    | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void _fini(void) | ||||||
|  | { | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								env/riscv_vp/memory_map.ld
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								env/riscv_vp/memory_map.ld
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | |||||||
|  | MEMORY | ||||||
|  | { | ||||||
|  |   ram   (wxa!ri) : ORIGIN = 0x00000000, LENGTH = 128K | ||||||
|  |   rom   (rxai!w) : ORIGIN = 0x1000E000, LENGTH = 2k | ||||||
|  |   flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 16M | ||||||
|  |   dram  (wxa!ri) : ORIGIN = 0x40000000, LENGTH = 2048M | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								env/riscv_vp/platform.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								env/riscv_vp/platform.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | // See LICENSE for license details. | ||||||
|  |  | ||||||
|  | #ifndef _ISS_PLATFORM_H | ||||||
|  | #define _ISS_PLATFORM_H | ||||||
|  |  | ||||||
|  | #if __riscv_xlen == 32 | ||||||
|  | #define MCAUSE_INT 0x80000000UL | ||||||
|  | #define MCAUSE_CAUSE 0x000003FFUL | ||||||
|  | #else | ||||||
|  | #define MCAUSE_INT 0x8000000000000000UL | ||||||
|  | #define MCAUSE_CAUSE 0x00000000000003FFUL | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define APB_BUS | ||||||
|  |  | ||||||
|  | #include "minres/devices/aclint.h" | ||||||
|  | #include "minres/devices/dma.h" | ||||||
|  | #include "minres/devices/gen/sysctrl.h" | ||||||
|  | #include "minres/devices/gpio.h" | ||||||
|  | #include "minres/devices/i2s.h" | ||||||
|  | #include "minres/devices/qspi.h" | ||||||
|  | #include "minres/devices/timer.h" | ||||||
|  | #include "minres/devices/uart.h" | ||||||
|  |  | ||||||
|  | #define PERIPH(TYPE, ADDR) ((volatile TYPE*)(ADDR)) | ||||||
|  | // values from memory_map.ld | ||||||
|  | #define XIP_START_LOC 0x30000000 | ||||||
|  | #define RAM_START_LOC 0x00000000 | ||||||
|  | #define APB_BASE 0x10000000 | ||||||
|  |  | ||||||
|  | #define gpio PERIPH(gpio_t, APB_BASE + 0x0000) | ||||||
|  | #define uart PERIPH(uart_t, APB_BASE + 0x01000) | ||||||
|  | #define timer PERIPH(timercounter_t, APB_BASE + 0x20000) | ||||||
|  | #define aclint PERIPH(aclint_t, APB_BASE + 0x30000) | ||||||
|  | #define sysctrl PERIPH(sysctrl_t, APB_BASE + 0x40000) | ||||||
|  | #define qspi PERIPH(qspi_t, APB_BASE + 0x50000) | ||||||
|  | #define i2s PERIPH(i2s_t, APB_BASE + 0x90000) | ||||||
|  | #define dma PERIPH(dma_t, APB_BASE + 0xB0000) | ||||||
|  |  | ||||||
|  | // Misc | ||||||
|  |  | ||||||
|  | #include <stdint.h> | ||||||
|  |  | ||||||
|  | void init_pll(void); | ||||||
|  | unsigned long get_cpu_freq(void); | ||||||
|  | unsigned long get_timer_freq(void); | ||||||
|  |  | ||||||
|  | #endif /* _ISS_PLATFORM_H */ | ||||||
							
								
								
									
										177
									
								
								env/riscv_vp/rom.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								env/riscv_vp/rom.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | |||||||
|  | OUTPUT_ARCH( "riscv" ) | ||||||
|  |  | ||||||
|  | ENTRY( _start ) | ||||||
|  |  | ||||||
|  | INCLUDE memory_map.ld | ||||||
|  |  | ||||||
|  | PHDRS | ||||||
|  | { | ||||||
|  |   rom PT_LOAD; | ||||||
|  |   ram_init PT_LOAD; | ||||||
|  |   ram PT_NULL; | ||||||
|  |   dram PT_NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  |   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||||
|  |  | ||||||
|  |   .init ORIGIN(rom)        : | ||||||
|  |   { | ||||||
|  |     KEEP (*(SORT_NONE(.init))) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .text           : | ||||||
|  |   { | ||||||
|  |     *(.text.unlikely .text.unlikely.*) | ||||||
|  |     *(.text.startup .text.startup.*) | ||||||
|  |     *(.text .text.*) | ||||||
|  |     *(.gnu.linkonce.t.*) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .fini           : | ||||||
|  |   { | ||||||
|  |     KEEP (*(SORT_NONE(.fini))) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   PROVIDE (__etext = .); | ||||||
|  |   PROVIDE (_etext = .); | ||||||
|  |   PROVIDE (etext = .); | ||||||
|  |  | ||||||
|  |   .rodata         : | ||||||
|  |   { | ||||||
|  |     *(.rdata) | ||||||
|  |     *(.rodata .rodata.*) | ||||||
|  |     *(.gnu.linkonce.r.*) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   . = ALIGN(4); | ||||||
|  |  | ||||||
|  |   .preinit_array  : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||||
|  |     KEEP (*(.preinit_array)) | ||||||
|  |     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .init_array     : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__init_array_start = .); | ||||||
|  |     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||||
|  |     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||||
|  |     PROVIDE_HIDDEN (__init_array_end = .); | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .fini_array     : | ||||||
|  |   { | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_start = .); | ||||||
|  |     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||||
|  |     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||||
|  |     PROVIDE_HIDDEN (__fini_array_end = .); | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .ctors          : | ||||||
|  |   { | ||||||
|  |     /* gcc uses crtbegin.o to find the start of | ||||||
|  |        the constructors, so we make sure it is | ||||||
|  |        first.  Because this is a wildcard, it | ||||||
|  |        doesn't matter if the user does not | ||||||
|  |        actually link against crtbegin.o; the | ||||||
|  |        linker won't look for a file to match a | ||||||
|  |        wildcard.  The wildcard also means that it | ||||||
|  |        doesn't matter which directory crtbegin.o | ||||||
|  |        is in.  */ | ||||||
|  |     KEEP (*crtbegin.o(.ctors)) | ||||||
|  |     KEEP (*crtbegin?.o(.ctors)) | ||||||
|  |     /* We don't want to include the .ctor section from | ||||||
|  |        the crtend.o file until after the sorted ctors. | ||||||
|  |        The .ctor section from the crtend file contains the | ||||||
|  |        end of ctors marker and it must be last */ | ||||||
|  |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||||
|  |     KEEP (*(SORT(.ctors.*))) | ||||||
|  |     KEEP (*(.ctors)) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .dtors          : | ||||||
|  |   { | ||||||
|  |     KEEP (*crtbegin.o(.dtors)) | ||||||
|  |     KEEP (*crtbegin?.o(.dtors)) | ||||||
|  |     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||||
|  |     KEEP (*(SORT(.dtors.*))) | ||||||
|  |     KEEP (*(.dtors)) | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .dummy          : | ||||||
|  |   { | ||||||
|  | 	*(.comment.*) | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |   .lalign         : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     PROVIDE( _data_lma = . ); | ||||||
|  |   } >rom AT>rom :rom | ||||||
|  |  | ||||||
|  |   .dalign         : | ||||||
|  |   { | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     PROVIDE( _data = . ); | ||||||
|  |   } >ram AT>rom :ram_init | ||||||
|  |  | ||||||
|  |   .data          : | ||||||
|  |   { | ||||||
|  |     __DATA_BEGIN__ = .; | ||||||
|  |     *(.data .data.*) | ||||||
|  |     *(.gnu.linkonce.d.*) | ||||||
|  |   } >ram AT>rom :ram_init | ||||||
|  |  | ||||||
|  |   .sdata          : | ||||||
|  |   { | ||||||
|  |     __SDATA_BEGIN__ = .; | ||||||
|  |     *(.sdata .sdata.*) | ||||||
|  |     *(.gnu.linkonce.s.*) | ||||||
|  |   } >ram AT>rom :ram_init | ||||||
|  |  | ||||||
|  |   .srodata        : | ||||||
|  |   { | ||||||
|  |     *(.srodata.cst16) | ||||||
|  |     *(.srodata.cst8) | ||||||
|  |     *(.srodata.cst4) | ||||||
|  |     *(.srodata.cst2) | ||||||
|  |     *(.srodata .srodata.*) | ||||||
|  |   } >ram AT>rom :ram_init | ||||||
|  |  | ||||||
|  |   . = ALIGN(4); | ||||||
|  |   PROVIDE( _edata = . ); | ||||||
|  |   PROVIDE( edata = . ); | ||||||
|  |  | ||||||
|  |   PROVIDE( _fbss = . ); | ||||||
|  |   PROVIDE( __bss_start = . ); | ||||||
|  |   .bss            : | ||||||
|  |   { | ||||||
|  |     *(.sbss*) | ||||||
|  |     *(.gnu.linkonce.sb.*) | ||||||
|  |     *(.bss .bss.*) | ||||||
|  |     *(.gnu.linkonce.b.*) | ||||||
|  |     *(COMMON) | ||||||
|  |     . = ALIGN(4); | ||||||
|  |   } >ram AT>ram :ram | ||||||
|  |  | ||||||
|  |   . = ALIGN(8); | ||||||
|  |   __BSS_END__ = .; | ||||||
|  |   __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,  MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); | ||||||
|  |   PROVIDE( _end = . ); | ||||||
|  |   PROVIDE( end = . ); | ||||||
|  |  | ||||||
|  |   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||||
|  |   { | ||||||
|  |     PROVIDE( _heap_end = . ); | ||||||
|  |     . = __stack_size; | ||||||
|  |     PROVIDE( _sp = . ); | ||||||
|  |   } >ram AT>ram :ram | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    | ||||||
|  |   PROVIDE( tohost = . ); | ||||||
|  |   PROVIDE( fromhost = . + 8 ); | ||||||
|  | } | ||||||
| @@ -16,6 +16,7 @@ static uint64_t get_aclint_mtime(volatile aclint_t* reg){ | |||||||
| } | } | ||||||
|  |  | ||||||
| static void set_aclint_mtimecmp(volatile aclint_t* reg, uint64_t value){ | static void set_aclint_mtimecmp(volatile aclint_t* reg, uint64_t value){ | ||||||
|  |     set_aclint_mtimecmp0lo(reg, (uint32_t)0xFFFFFFFF); | ||||||
|     set_aclint_mtimecmp0hi(reg, (uint32_t)(value >> 32)); |     set_aclint_mtimecmp0hi(reg, (uint32_t)(value >> 32)); | ||||||
|     set_aclint_mtimecmp0lo(reg, (uint32_t)value); |     set_aclint_mtimecmp0lo(reg, (uint32_t)value); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ static inline void uart_write(volatile uart_t* reg, uint8_t data){ | |||||||
|     set_uart_rx_tx_reg_data(reg, data); |     set_uart_rx_tx_reg_data(reg, data); | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline inline uint8_t uart_read(volatile uart_t* reg){ | static inline uint8_t uart_read(volatile uart_t* reg){ | ||||||
|     uint32_t res = get_uart_rx_tx_reg_data(reg); |     uint32_t res = get_uart_rx_tx_reg_data(reg); | ||||||
|     while((res&0x10000) == 0) res = get_uart_rx_tx_reg_data(reg); |     while((res&0x10000) == 0) res = get_uart_rx_tx_reg_data(reg); | ||||||
|     return res; |     return res; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user