将mstStartup和slvStartup代码合二为一;增加mtime的驱动代码
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -4,6 +4,7 @@
|
|||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"system_cfg.h": "c",
|
"system_cfg.h": "c",
|
||||||
"plic.h": "c"
|
"plic.h": "c",
|
||||||
|
"compare": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
15
Makefile
15
Makefile
@@ -109,6 +109,13 @@ sw:
|
|||||||
-c ./tb/sw/src/mstStartup.S \
|
-c ./tb/sw/src/mstStartup.S \
|
||||||
-o ./tb/sw/build/mstStartup.o
|
-o ./tb/sw/build/mstStartup.o
|
||||||
|
|
||||||
|
|
||||||
|
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
||||||
|
-I ./tb/sw/ -I ./tb/sw/src \
|
||||||
|
-I ./tb/sw/tl2cdr \
|
||||||
|
-c ./tb/sw/src/clint.c \
|
||||||
|
-o ./tb/sw/build/clint.o
|
||||||
|
|
||||||
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
||||||
-I ./tb/sw/ -I ./tb/sw/src \
|
-I ./tb/sw/ -I ./tb/sw/src \
|
||||||
-I ./tb/sw/tl2cdr \
|
-I ./tb/sw/tl2cdr \
|
||||||
@@ -141,6 +148,7 @@ sw:
|
|||||||
./tb/sw/build/tl2cdr.o \
|
./tb/sw/build/tl2cdr.o \
|
||||||
./tb/sw/build/halfLvdsMacSvr.o \
|
./tb/sw/build/halfLvdsMacSvr.o \
|
||||||
./tb/sw/build/plic.o \
|
./tb/sw/build/plic.o \
|
||||||
|
./tb/sw/build/clint.o \
|
||||||
-o ./tb/sw/build/mstTest.elf
|
-o ./tb/sw/build/mstTest.elf
|
||||||
|
|
||||||
$(TARGET)-objcopy -O binary ./tb/sw/build/mstTest.elf ./tb/sw/build/mstTest.bin
|
$(TARGET)-objcopy -O binary ./tb/sw/build/mstTest.elf ./tb/sw/build/mstTest.bin
|
||||||
@@ -179,6 +187,12 @@ sw:
|
|||||||
-c ./tb/sw/tl2cdr/tl2cdr.c \
|
-c ./tb/sw/tl2cdr/tl2cdr.c \
|
||||||
-o ./tb/sw/build/tl2cdr.o
|
-o ./tb/sw/build/tl2cdr.o
|
||||||
|
|
||||||
|
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
||||||
|
-I ./tb/sw/ -I ./tb/sw/src \
|
||||||
|
-I ./tb/sw/tl2cdr \
|
||||||
|
-c ./tb/sw/src/clint.c \
|
||||||
|
-o ./tb/sw/build/clint.o
|
||||||
|
|
||||||
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
$(RVCC) -ggdb $(APP_MARCH) $(APP_CFLAGS) -Wall -mcmodel=medany -mexplicit-relocs \
|
||||||
-I ./tb/sw/ -I ./tb/sw/src \
|
-I ./tb/sw/ -I ./tb/sw/src \
|
||||||
-I ./tb/sw/tl2cdr \
|
-I ./tb/sw/tl2cdr \
|
||||||
@@ -211,6 +225,7 @@ sw:
|
|||||||
./tb/sw/build/tl2cdr.o \
|
./tb/sw/build/tl2cdr.o \
|
||||||
./tb/sw/build/halfLvdsMacSvr.o \
|
./tb/sw/build/halfLvdsMacSvr.o \
|
||||||
./tb/sw/build/plic.o \
|
./tb/sw/build/plic.o \
|
||||||
|
./tb/sw/build/clint.o \
|
||||||
-o ./tb/sw/build/slvTest.elf
|
-o ./tb/sw/build/slvTest.elf
|
||||||
|
|
||||||
$(TARGET)-objcopy -O binary ./tb/sw/build/slvTest.elf ./tb/sw/build/slvTest.bin
|
$(TARGET)-objcopy -O binary ./tb/sw/build/slvTest.elf ./tb/sw/build/slvTest.bin
|
||||||
|
|||||||
54
tb/sw/src/clint.c
Normal file
54
tb/sw/src/clint.c
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
#include "clint.h"
|
||||||
|
|
||||||
|
|
||||||
|
volatile const uint32_t * const mtime_high = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIME_HIGH);
|
||||||
|
volatile const uint32_t * const mtime_low = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIME_LOW);
|
||||||
|
volatile uint32_t * const mtimecmp_high = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIMECMP_HIGH);
|
||||||
|
volatile uint32_t * const mtimecmp_low = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIMECMP_LOW);
|
||||||
|
volatile uint32_t mtimer_int_flag = 0;
|
||||||
|
|
||||||
|
void set_mtimecmp(uint64_t value)
|
||||||
|
{
|
||||||
|
*mtimecmp_high = 0xFFFFFFFF; // 先写入高 32 位为全 1(禁用中断)
|
||||||
|
*mtimecmp_low = (uint32_t)value; // 写入低 32 位
|
||||||
|
*mtimecmp_high = (uint32_t)(value >> 32); // 写入高 32 位
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t read_mtimer()
|
||||||
|
{
|
||||||
|
uint32_t hi, lo;
|
||||||
|
do {
|
||||||
|
hi = *mtime_high; // 读取高 32 位
|
||||||
|
lo = *mtime_low; // 读取低 32 位
|
||||||
|
} while (hi != *mtime_high); // 检查高 32 位是否变化(避免进位)
|
||||||
|
return (((uint64_t)hi << 32) | lo);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enable_mtimer_int()
|
||||||
|
{
|
||||||
|
__asm__ volatile ("csrs mie, %0" :: "r"(0x80)); // mie.MTIE = 1
|
||||||
|
__asm__ volatile ("csrs mstatus, %0" :: "r"(0x8)); // mstatus.MIE = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
void disable_mtimer_int()
|
||||||
|
{
|
||||||
|
__asm__ volatile ("csrc mie, %0" :: "r"(0x80)); // mie.MTIE = 0
|
||||||
|
__asm__ volatile ("csrc mstatus, %0" :: "r"(0x8)); // mstatus.MIE = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_mtimer(uint32_t delta_t)
|
||||||
|
{
|
||||||
|
uint64_t t;
|
||||||
|
|
||||||
|
t = read_mtimer();
|
||||||
|
t += delta_t;
|
||||||
|
set_mtimecmp(t);
|
||||||
|
#if 0
|
||||||
|
uint64_t t;
|
||||||
|
|
||||||
|
t = *(volatile uint64_t *)(CLINT_BASE + CLINT_MTIME_LOW);
|
||||||
|
t += delta_t;
|
||||||
|
*(volatile uint64_t *)(CLINT_BASE + CLINT_MTIMECMP_LOW) = t;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
38
tb/sw/src/clint.h
Normal file
38
tb/sw/src/clint.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef __CLINT_H__
|
||||||
|
#define __CLINT_H__
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define CLINT_MTIME_TICK_PERIOD 4 //ns
|
||||||
|
|
||||||
|
|
||||||
|
#define CLINT_BASE (0x2000000)
|
||||||
|
#define CLINT_MTIME_LOW (0xBFF8)
|
||||||
|
#define CLINT_MTIME_HIGH (0xBFFC)
|
||||||
|
#define CLINT_MTIMECMP_LOW (0x4000)
|
||||||
|
#define CLINT_MTIMECMP_HIGH (0x4004)
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
#include "stdint.h"
|
||||||
|
extern volatile const uint32_t * const mtime_high;
|
||||||
|
extern volatile const uint32_t * const mtime_low;
|
||||||
|
extern volatile uint32_t * const mtimecmp_high;
|
||||||
|
extern volatile uint32_t * const mtimecmp_low;
|
||||||
|
|
||||||
|
extern volatile uint32_t mtimer_int_flag;
|
||||||
|
|
||||||
|
uint64_t read_timer(void);
|
||||||
|
void set_mtimecmp(uint64_t value) ;
|
||||||
|
void enable_mtimer_int();
|
||||||
|
void disable_mtimer_int();
|
||||||
|
void set_mtimer(uint32_t delta_t);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "tl2cdr.h"
|
#include "tl2cdr.h"
|
||||||
#include "halfLvdsMacSvr.h"
|
#include "halfLvdsMacSvr.h"
|
||||||
#include "plic.h"
|
#include "plic.h"
|
||||||
|
#include "clint.h"
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
uint8_t MST_TX_BUF[TX_BUF_NUM * TX_BUF_MAX_LEN] __attribute__((aligned(32)));
|
uint8_t MST_TX_BUF[TX_BUF_NUM * TX_BUF_MAX_LEN] __attribute__((aligned(32)));
|
||||||
@@ -13,12 +14,8 @@ uint8_t MST_RX_BUF[RX_BUF_NUM * RX_BUF_MAX_LEN] __attribute__((aligned(32)));
|
|||||||
extern const uint8_t int_svr_code[];
|
extern const uint8_t int_svr_code[];
|
||||||
uint32_t (*sys_call)(uint32_t no, ...);
|
uint32_t (*sys_call)(uint32_t no, ...);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t HLM_slave_poll(void);
|
static uint32_t HLM_slave_poll(void);
|
||||||
|
volatile uint32_t exti_isr_flag[32] = {0};
|
||||||
volatile uint32_t isr_flag[32] = {0};
|
|
||||||
|
|
||||||
uint32_t HLM_poll(uint32_t mode)
|
uint32_t HLM_poll(uint32_t mode)
|
||||||
{
|
{
|
||||||
@@ -36,12 +33,12 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
uint32_t rx_pkt_len = 0;
|
uint32_t rx_pkt_len = 0;
|
||||||
uint32_t rx_start = 0;
|
uint32_t rx_start = 0;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
uint32_t is_exit = 0;
|
||||||
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t *tx_data_ptr = (uint32_t *)MST_TX_BUF;
|
uint32_t *tx_data_ptr = (uint32_t *)MST_TX_BUF;
|
||||||
uint32_t *rx_data_ptr = (uint32_t *)MST_RX_BUF;
|
uint32_t *rx_data_ptr = (uint32_t *)MST_RX_BUF;
|
||||||
|
|
||||||
|
|
||||||
//准备数据
|
//准备数据
|
||||||
for (i = 0; i < tx_pkt_len; i++)
|
for (i = 0; i < tx_pkt_len; i++)
|
||||||
MST_TX_BUF[i] = i;
|
MST_TX_BUF[i] = i;
|
||||||
@@ -65,7 +62,7 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1)
|
while (!is_exit)
|
||||||
{
|
{
|
||||||
status = *HLM_status;
|
status = *HLM_status;
|
||||||
|
|
||||||
@@ -95,18 +92,20 @@ uint32_t HLM_poll(uint32_t mode)
|
|||||||
{
|
{
|
||||||
rx_start = 0;
|
rx_start = 0;
|
||||||
rx_index = 0;
|
rx_index = 0;
|
||||||
|
is_exit = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isr_flag[CDR_INT_RX1START])
|
if (exti_isr_flag[CDR_INT_RX1START])
|
||||||
{
|
{
|
||||||
isr_flag[CDR_INT_RX1START] = 0;
|
exti_isr_flag[CDR_INT_RX1START] = 0;
|
||||||
rx_start = 1;
|
rx_start = 1;
|
||||||
rx_index = 0;
|
rx_index = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (mode == WORKMODE_SLAVE)
|
else if (mode == WORKMODE_SLAVE)
|
||||||
{
|
{
|
||||||
@@ -133,6 +132,7 @@ uint32_t HLM_slave_poll(void)
|
|||||||
|
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
uint32_t is_terminal = 1;
|
uint32_t is_terminal = 1;
|
||||||
|
uint32_t detect_status = 1;
|
||||||
|
|
||||||
//填充检测下行设备的包
|
//填充检测下行设备的包
|
||||||
uint32_t detect_pkt = MAGIC_NUM;
|
uint32_t detect_pkt = MAGIC_NUM;
|
||||||
@@ -146,13 +146,13 @@ uint32_t HLM_slave_poll(void)
|
|||||||
*plic_enable_0_31 = 0;
|
*plic_enable_0_31 = 0;
|
||||||
|
|
||||||
|
|
||||||
|
set_mtimer(100);
|
||||||
|
enable_mtimer_int();
|
||||||
|
|
||||||
|
|
||||||
#ifdef __riscv_e
|
#ifdef __riscv_e
|
||||||
sys_call(SYS_SLAVE_WORK);
|
sys_call(SYS_SLAVE_WORK);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@@ -164,7 +164,7 @@ uint32_t HLM_slave_poll(void)
|
|||||||
|
|
||||||
for (i = 0; i < HLM_RX0_FIFO_LEFT(status); i++)
|
for (i = 0; i < HLM_RX0_FIFO_LEFT(status); i++)
|
||||||
{
|
{
|
||||||
if (down_rx_start) // && (status & HLM_RX0_VALID))
|
if (down_rx_start)
|
||||||
{//处理上行接收
|
{//处理上行接收
|
||||||
uint32_t data;
|
uint32_t data;
|
||||||
data = *rx0_rxFifo;
|
data = *rx0_rxFifo;
|
||||||
@@ -181,8 +181,6 @@ uint32_t HLM_slave_poll(void)
|
|||||||
down_rx_start = 0;
|
down_rx_start = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((rx_index & 0x1f) == 10)
|
|
||||||
detect_start = 1;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
@@ -206,8 +204,15 @@ uint32_t HLM_slave_poll(void)
|
|||||||
{
|
{
|
||||||
*rx1_softReset = 1;
|
*rx1_softReset = 1;
|
||||||
*tx0_softReset = 1;
|
*tx0_softReset = 1;
|
||||||
|
detect_status = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mtimer_int_flag)
|
||||||
|
{
|
||||||
|
mtimer_int_flag = 0;
|
||||||
|
detect_start = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{//不是终节点
|
{//不是终节点
|
||||||
@@ -219,5 +224,3 @@ uint32_t HLM_slave_poll(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,173 +1 @@
|
|||||||
#include "tl2cdr.h"
|
#include "startup.S"
|
||||||
|
|
||||||
.extern main
|
|
||||||
|
|
||||||
.extern int_svr_code
|
|
||||||
.extern plic_claim
|
|
||||||
.extern isr_flag
|
|
||||||
|
|
||||||
#ifdef __riscv_i
|
|
||||||
.extern plic_handle
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.globl _prog_start
|
|
||||||
.section .text.init
|
|
||||||
|
|
||||||
|
|
||||||
_prog_start:
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x3, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
#ifdef __riscv_i
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
li sp, 0x40011000
|
|
||||||
|
|
||||||
#ifdef __riscv_i
|
|
||||||
la t0, trap_entry
|
|
||||||
#else
|
|
||||||
li a0, 0
|
|
||||||
|
|
||||||
lui t0, %hi(plic_claim)
|
|
||||||
lw a1, %lo(plic_claim)(t0)
|
|
||||||
|
|
||||||
la a2, isr_flag
|
|
||||||
|
|
||||||
call int_svr_code
|
|
||||||
mv t0, a0 #这里选择不同的trap_entry服务函数,这个是RV32I的代码
|
|
||||||
#endif
|
|
||||||
csrw mtvec, t0
|
|
||||||
li t0, 1 << 11
|
|
||||||
csrw mie, t0
|
|
||||||
|
|
||||||
csrr t0, mstatus
|
|
||||||
ori t0, t0, 1<<3
|
|
||||||
csrw mstatus, t0
|
|
||||||
|
|
||||||
call main
|
|
||||||
|
|
||||||
ecall
|
|
||||||
|
|
||||||
#ifdef __riscv_i
|
|
||||||
.balign 32
|
|
||||||
trap_entry:
|
|
||||||
#.macro define_const name, value
|
|
||||||
# .equ \name, \value
|
|
||||||
#.endm
|
|
||||||
## 使用宏定义常量
|
|
||||||
#define_const CDR_INT_TXEND, 14
|
|
||||||
opt_trap_entry:
|
|
||||||
|
|
||||||
addi sp,sp,136
|
|
||||||
|
|
||||||
#sw ra,4(sp)
|
|
||||||
#sw sp,8(sp)
|
|
||||||
#sw gp,12(sp)
|
|
||||||
#sw tp,16(sp)
|
|
||||||
|
|
||||||
sw t0,20(sp)
|
|
||||||
sw t1,24(sp)
|
|
||||||
#sw t2,28(sp)
|
|
||||||
sw s0,32(sp)
|
|
||||||
sw s1,36(sp)
|
|
||||||
|
|
||||||
#sw a0,40(sp)
|
|
||||||
#sw a1,44(sp)
|
|
||||||
#sw a2,48(sp)
|
|
||||||
#sw a3,52(sp)
|
|
||||||
#sw a4,56(sp)
|
|
||||||
#sw a5,60(sp)
|
|
||||||
#sw a6,64(sp)
|
|
||||||
#sw a7,68(sp)
|
|
||||||
#sw s2,72(sp)
|
|
||||||
#sw s3,76(sp)
|
|
||||||
#sw s4,80(sp)
|
|
||||||
#sw s5,84(sp)
|
|
||||||
#sw s6,88(sp)
|
|
||||||
#sw s7,92(sp)
|
|
||||||
#sw s8,96(sp)
|
|
||||||
#sw s9,100(sp)
|
|
||||||
#sw s10,104(sp)
|
|
||||||
#sw s11,108(sp)
|
|
||||||
#sw t3,112(sp)
|
|
||||||
#sw t4,116(sp)
|
|
||||||
#sw t5,120(sp)
|
|
||||||
#sw t6,124(sp)
|
|
||||||
|
|
||||||
lui t1, %hi(plic_claim)
|
|
||||||
lw t0, %lo(plic_claim)(t1) # t0 = &plic_claim
|
|
||||||
|
|
||||||
lw t1, 0(t0) # t1 = *plic_claim
|
|
||||||
sw t1, 0(t0) # *plic_claim = t1
|
|
||||||
|
|
||||||
slli s0, t1, 2
|
|
||||||
la s1, isr_flag
|
|
||||||
add s1, s1, s0
|
|
||||||
li t0, 1
|
|
||||||
sw t0, 0(s1)
|
|
||||||
|
|
||||||
#lw ra,4(sp)
|
|
||||||
#lw sp,8(sp)
|
|
||||||
#lw gp,12(sp)
|
|
||||||
#lw tp,16(sp)
|
|
||||||
|
|
||||||
lw t0,20(sp)
|
|
||||||
lw t1,24(sp)
|
|
||||||
#lw t2,28(sp)
|
|
||||||
lw s0,32(sp)
|
|
||||||
lw s1,36(sp)
|
|
||||||
|
|
||||||
#lw a0,40(sp)
|
|
||||||
#lw a1,44(sp)
|
|
||||||
#lw a2,48(sp)
|
|
||||||
#lw a3,52(sp)
|
|
||||||
#lw a4,56(sp)
|
|
||||||
#lw a5,60(sp)
|
|
||||||
#lw a6,64(sp)
|
|
||||||
#lw a7,68(sp)
|
|
||||||
#lw s2,72(sp)
|
|
||||||
#lw s3,76(sp)
|
|
||||||
#lw s4,80(sp)
|
|
||||||
#lw s5,84(sp)
|
|
||||||
#lw s6,88(sp)
|
|
||||||
#lw s7,92(sp)
|
|
||||||
#lw s8,96(sp)
|
|
||||||
#lw s9,100(sp)
|
|
||||||
#lw s10,104(sp)
|
|
||||||
#lw s11,108(sp)
|
|
||||||
#lw t3,112(sp)
|
|
||||||
#lw t4,116(sp)
|
|
||||||
#lw t5,120(sp)
|
|
||||||
#lw t6,124(sp)
|
|
||||||
|
|
||||||
addi sp,sp,136
|
|
||||||
mret
|
|
||||||
#endif
|
|
||||||
@@ -1,168 +1 @@
|
|||||||
#include "tl2cdr.h"
|
#include "startup.S"
|
||||||
//#include "system_cfg.h"
|
|
||||||
|
|
||||||
.extern main
|
|
||||||
.extern int_svr_code
|
|
||||||
.extern plic_claim
|
|
||||||
.extern isr_flag
|
|
||||||
|
|
||||||
.globl _prog_start
|
|
||||||
.section .text.init
|
|
||||||
_prog_start:
|
|
||||||
li x1, 0
|
|
||||||
li x2, 0
|
|
||||||
li x3, 0
|
|
||||||
li x4, 0
|
|
||||||
li x5, 0
|
|
||||||
li x6, 0
|
|
||||||
li x7, 0
|
|
||||||
li x8, 0
|
|
||||||
li x9, 0
|
|
||||||
li x10, 0
|
|
||||||
li x11, 0
|
|
||||||
li x12, 0
|
|
||||||
li x13, 0
|
|
||||||
li x14, 0
|
|
||||||
li x15, 0
|
|
||||||
#ifdef __riscv_i
|
|
||||||
li x16, 0
|
|
||||||
li x17, 0
|
|
||||||
li x18, 0
|
|
||||||
li x19, 0
|
|
||||||
li x20, 0
|
|
||||||
li x21, 0
|
|
||||||
li x22, 0
|
|
||||||
li x23, 0
|
|
||||||
li x24, 0
|
|
||||||
li x25, 0
|
|
||||||
li x26, 0
|
|
||||||
li x27, 0
|
|
||||||
li x28, 0
|
|
||||||
li x29, 0
|
|
||||||
li x30, 0
|
|
||||||
li x31, 0
|
|
||||||
#endif
|
|
||||||
li sp, 0x40011000
|
|
||||||
|
|
||||||
#ifdef __riscv_i
|
|
||||||
la t0, trap_entry
|
|
||||||
#else
|
|
||||||
li a0, 0
|
|
||||||
|
|
||||||
lui t0, %hi(plic_claim)
|
|
||||||
lw a1, %lo(plic_claim)(t0)
|
|
||||||
|
|
||||||
la a2, isr_flag
|
|
||||||
|
|
||||||
call int_svr_code
|
|
||||||
mv t0, a0 #这里选择不同的trap_entry服务函数,这个是RV32I的代码
|
|
||||||
#endif
|
|
||||||
|
|
||||||
csrw mtvec, t0
|
|
||||||
li t0, 1 << 11
|
|
||||||
csrw mie, t0
|
|
||||||
|
|
||||||
csrr t0, mstatus
|
|
||||||
ori t0, t0, 1<<3
|
|
||||||
csrw mstatus, t0
|
|
||||||
|
|
||||||
call main
|
|
||||||
|
|
||||||
ecall
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __riscv_i
|
|
||||||
.balign 32
|
|
||||||
trap_entry:
|
|
||||||
#.macro define_const name, value
|
|
||||||
# .equ \name, \value
|
|
||||||
#.endm
|
|
||||||
## 使用宏定义常量
|
|
||||||
#define_const CDR_INT_TXEND, 14
|
|
||||||
opt_trap_entry:
|
|
||||||
|
|
||||||
addi sp,sp,136
|
|
||||||
|
|
||||||
#sw ra,4(sp)
|
|
||||||
#sw sp,8(sp)
|
|
||||||
#sw gp,12(sp)
|
|
||||||
#sw tp,16(sp)
|
|
||||||
|
|
||||||
sw t0,20(sp)
|
|
||||||
sw t1,24(sp)
|
|
||||||
#sw t2,28(sp)
|
|
||||||
sw s0,32(sp)
|
|
||||||
sw s1,36(sp)
|
|
||||||
|
|
||||||
#sw a0,40(sp)
|
|
||||||
#sw a1,44(sp)
|
|
||||||
#sw a2,48(sp)
|
|
||||||
#sw a3,52(sp)
|
|
||||||
#sw a4,56(sp)
|
|
||||||
#sw a5,60(sp)
|
|
||||||
#sw a6,64(sp)
|
|
||||||
#sw a7,68(sp)
|
|
||||||
#sw s2,72(sp)
|
|
||||||
#sw s3,76(sp)
|
|
||||||
#sw s4,80(sp)
|
|
||||||
#sw s5,84(sp)
|
|
||||||
#sw s6,88(sp)
|
|
||||||
#sw s7,92(sp)
|
|
||||||
#sw s8,96(sp)
|
|
||||||
#sw s9,100(sp)
|
|
||||||
#sw s10,104(sp)
|
|
||||||
#sw s11,108(sp)
|
|
||||||
#sw t3,112(sp)
|
|
||||||
#sw t4,116(sp)
|
|
||||||
#sw t5,120(sp)
|
|
||||||
#sw t6,124(sp)
|
|
||||||
|
|
||||||
lui t1, %hi(plic_claim)
|
|
||||||
lw t0, %lo(plic_claim)(t1) # t0 = &plic_claim
|
|
||||||
|
|
||||||
lw t1, 0(t0) # t1 = *plic_claim
|
|
||||||
sw t1, 0(t0) # *plic_claim = t1
|
|
||||||
|
|
||||||
slli s0, t1, 2
|
|
||||||
la s1, isr_flag
|
|
||||||
add s1, s1, s0
|
|
||||||
li t0, 1
|
|
||||||
sw t0, 0(s1)
|
|
||||||
|
|
||||||
#lw ra,4(sp)
|
|
||||||
#lw sp,8(sp)
|
|
||||||
#lw gp,12(sp)
|
|
||||||
#lw tp,16(sp)
|
|
||||||
|
|
||||||
lw t0,20(sp)
|
|
||||||
lw t1,24(sp)
|
|
||||||
#lw t2,28(sp)
|
|
||||||
lw s0,32(sp)
|
|
||||||
lw s1,36(sp)
|
|
||||||
|
|
||||||
#lw a0,40(sp)
|
|
||||||
#lw a1,44(sp)
|
|
||||||
#lw a2,48(sp)
|
|
||||||
#lw a3,52(sp)
|
|
||||||
#lw a4,56(sp)
|
|
||||||
#lw a5,60(sp)
|
|
||||||
#lw a6,64(sp)
|
|
||||||
#lw a7,68(sp)
|
|
||||||
#lw s2,72(sp)
|
|
||||||
#lw s3,76(sp)
|
|
||||||
#lw s4,80(sp)
|
|
||||||
#lw s5,84(sp)
|
|
||||||
#lw s6,88(sp)
|
|
||||||
#lw s7,92(sp)
|
|
||||||
#lw s8,96(sp)
|
|
||||||
#lw s9,100(sp)
|
|
||||||
#lw s10,104(sp)
|
|
||||||
#lw s11,108(sp)
|
|
||||||
#lw t3,112(sp)
|
|
||||||
#lw t4,116(sp)
|
|
||||||
#lw t5,120(sp)
|
|
||||||
#lw t6,124(sp)
|
|
||||||
|
|
||||||
addi sp,sp,136
|
|
||||||
mret
|
|
||||||
#endif
|
|
||||||
215
tb/sw/src/startup.S
Normal file
215
tb/sw/src/startup.S
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
#include "tl2cdr.h"
|
||||||
|
|
||||||
|
.extern main
|
||||||
|
|
||||||
|
.extern int_svr_code
|
||||||
|
.extern plic_claim
|
||||||
|
.extern exti_isr_flag
|
||||||
|
.extern mtimer_int_flag
|
||||||
|
|
||||||
|
#ifdef __riscv_i
|
||||||
|
.extern plic_handle
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.globl _prog_start
|
||||||
|
.section .text.init
|
||||||
|
|
||||||
|
|
||||||
|
_prog_start:
|
||||||
|
li x1, 0
|
||||||
|
li x2, 0
|
||||||
|
li x3, 0
|
||||||
|
li x4, 0
|
||||||
|
li x5, 0
|
||||||
|
li x6, 0
|
||||||
|
li x7, 0
|
||||||
|
li x8, 0
|
||||||
|
li x9, 0
|
||||||
|
li x10, 0
|
||||||
|
li x11, 0
|
||||||
|
li x12, 0
|
||||||
|
li x13, 0
|
||||||
|
li x14, 0
|
||||||
|
li x15, 0
|
||||||
|
#ifdef __riscv_i
|
||||||
|
li x16, 0
|
||||||
|
li x17, 0
|
||||||
|
li x18, 0
|
||||||
|
li x19, 0
|
||||||
|
li x20, 0
|
||||||
|
li x21, 0
|
||||||
|
li x22, 0
|
||||||
|
li x23, 0
|
||||||
|
li x24, 0
|
||||||
|
li x25, 0
|
||||||
|
li x26, 0
|
||||||
|
li x27, 0
|
||||||
|
li x28, 0
|
||||||
|
li x29, 0
|
||||||
|
li x30, 0
|
||||||
|
li x31, 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
li sp, 0x40011000
|
||||||
|
|
||||||
|
#ifdef __riscv_i
|
||||||
|
la t0, trap_entry
|
||||||
|
#else
|
||||||
|
li a0, 0
|
||||||
|
|
||||||
|
lui t0, %hi(plic_claim)
|
||||||
|
lw a1, %lo(plic_claim)(t0)
|
||||||
|
|
||||||
|
la a2, exti_isr_flag
|
||||||
|
|
||||||
|
call int_svr_code
|
||||||
|
mv t0, a0 #这里选择不同的trap_entry服务函数,这个是RV32I的代码
|
||||||
|
#endif
|
||||||
|
csrw mtvec, t0
|
||||||
|
li t0, 1 << 11
|
||||||
|
csrw mie, t0
|
||||||
|
|
||||||
|
csrr t0, mstatus
|
||||||
|
ori t0, t0, 1<<3
|
||||||
|
csrw mstatus, t0
|
||||||
|
|
||||||
|
call main
|
||||||
|
|
||||||
|
ecall
|
||||||
|
|
||||||
|
#ifdef __riscv_i
|
||||||
|
.balign 32
|
||||||
|
trap_entry:
|
||||||
|
#.macro define_const name, value
|
||||||
|
# .equ \name, \value
|
||||||
|
#.endm
|
||||||
|
## 使用宏定义常量
|
||||||
|
#define_const CDR_INT_TXEND, 14
|
||||||
|
opt_trap_entry:
|
||||||
|
|
||||||
|
addi sp,sp,136
|
||||||
|
|
||||||
|
#sw ra,4(sp)
|
||||||
|
#sw sp,8(sp)
|
||||||
|
#sw gp,12(sp)
|
||||||
|
#sw tp,16(sp)
|
||||||
|
|
||||||
|
sw t0,20(sp)
|
||||||
|
sw t1,24(sp)
|
||||||
|
sw t2,28(sp)
|
||||||
|
sw s0,32(sp)
|
||||||
|
sw s1,36(sp)
|
||||||
|
|
||||||
|
#sw a0,40(sp)
|
||||||
|
#sw a1,44(sp)
|
||||||
|
#sw a2,48(sp)
|
||||||
|
#sw a3,52(sp)
|
||||||
|
#sw a4,56(sp)
|
||||||
|
#sw a5,60(sp)
|
||||||
|
#sw a6,64(sp)
|
||||||
|
#sw a7,68(sp)
|
||||||
|
#sw s2,72(sp)
|
||||||
|
#sw s3,76(sp)
|
||||||
|
#sw s4,80(sp)
|
||||||
|
#sw s5,84(sp)
|
||||||
|
#sw s6,88(sp)
|
||||||
|
#sw s7,92(sp)
|
||||||
|
#sw s8,96(sp)
|
||||||
|
#sw s9,100(sp)
|
||||||
|
#sw s10,104(sp)
|
||||||
|
#sw s11,108(sp)
|
||||||
|
#sw t3,112(sp)
|
||||||
|
#sw t4,116(sp)
|
||||||
|
#sw t5,120(sp)
|
||||||
|
#sw t6,124(sp)
|
||||||
|
|
||||||
|
csrr t2, mcause
|
||||||
|
li s0, 0x80000000
|
||||||
|
and s0, t2, s0
|
||||||
|
1: beqz s0, 1b #这个是异常,死循环查问题吧
|
||||||
|
andi s0, t2, 0xf
|
||||||
|
la t2, isr_j_table
|
||||||
|
slli s0, s0, 2
|
||||||
|
add t2, t2, s0
|
||||||
|
jr t2
|
||||||
|
|
||||||
|
swi_isr:
|
||||||
|
j exit_isr # jump to exit_isr
|
||||||
|
|
||||||
|
mtime_isr:
|
||||||
|
li t1, 0x80
|
||||||
|
csrc mie, t1
|
||||||
|
la t1, mtimer_int_flag
|
||||||
|
li t0, 1
|
||||||
|
sw t0, 0(t1)
|
||||||
|
j exit_isr # jump to exit_isr
|
||||||
|
|
||||||
|
exti_isr:
|
||||||
|
lui t1, %hi(plic_claim)
|
||||||
|
lw t0, %lo(plic_claim)(t1) # t0 = &plic_claim
|
||||||
|
|
||||||
|
lw t1, 0(t0) # t1 = *plic_claim
|
||||||
|
sw t1, 0(t0) # *plic_claim = t1
|
||||||
|
|
||||||
|
slli s0, t1, 2
|
||||||
|
la s1, exti_isr_flag
|
||||||
|
add s1, s1, s0
|
||||||
|
li t0, 1
|
||||||
|
sw t0, 0(s1)
|
||||||
|
|
||||||
|
#lw ra,4(sp)
|
||||||
|
#lw sp,8(sp)
|
||||||
|
#lw gp,12(sp)
|
||||||
|
#lw tp,16(sp)
|
||||||
|
|
||||||
|
exit_isr:
|
||||||
|
lw t0,20(sp)
|
||||||
|
lw t1,24(sp)
|
||||||
|
lw t2,28(sp)
|
||||||
|
lw s0,32(sp)
|
||||||
|
lw s1,36(sp)
|
||||||
|
|
||||||
|
#lw a0,40(sp)
|
||||||
|
#lw a1,44(sp)
|
||||||
|
#lw a2,48(sp)
|
||||||
|
#lw a3,52(sp)
|
||||||
|
#lw a4,56(sp)
|
||||||
|
#lw a5,60(sp)
|
||||||
|
#lw a6,64(sp)
|
||||||
|
#lw a7,68(sp)
|
||||||
|
#lw s2,72(sp)
|
||||||
|
#lw s3,76(sp)
|
||||||
|
#lw s4,80(sp)
|
||||||
|
#lw s5,84(sp)
|
||||||
|
#lw s6,88(sp)
|
||||||
|
#lw s7,92(sp)
|
||||||
|
#lw s8,96(sp)
|
||||||
|
#lw s9,100(sp)
|
||||||
|
#lw s10,104(sp)
|
||||||
|
#lw s11,108(sp)
|
||||||
|
#lw t3,112(sp)
|
||||||
|
#lw t4,116(sp)
|
||||||
|
#lw t5,120(sp)
|
||||||
|
#lw t6,124(sp)
|
||||||
|
|
||||||
|
addi sp,sp,136
|
||||||
|
mret
|
||||||
|
|
||||||
|
isr_j_table:
|
||||||
|
1: j 1b # 0 jump to unknown_isr
|
||||||
|
1: j 1b # 1 jump to unknown_isr
|
||||||
|
1: j 1b # 2 jump to unknown_isr
|
||||||
|
j swi_isr # 3 jump to swi_isr
|
||||||
|
1: j 1b # 4 jump to unknown_isr
|
||||||
|
1: j 1b # 5 jump to unknown_isr
|
||||||
|
1: j 1b # 6 jump to unknown_isr
|
||||||
|
j mtime_isr # 7 jump to unknown_isr
|
||||||
|
1: j 1b # 8 jump to unknown_isr
|
||||||
|
1: j 1b # 9 jump to unknown_isr
|
||||||
|
1: j 1b # a jump to unknown_isr
|
||||||
|
j exti_isr # b jump to exti_isr
|
||||||
|
1: j 1b # c jump to unknown_isr
|
||||||
|
1: j 1b # d jump to unknown_isr
|
||||||
|
1: j 1b # e jump to unknown_isr
|
||||||
|
1: j 1b # f jump to unknown_isr
|
||||||
|
#endif
|
||||||
@@ -10,7 +10,5 @@
|
|||||||
#define WORKMODE_MASTER 0
|
#define WORKMODE_MASTER 0
|
||||||
#define WORKMODE_SLAVE 1
|
#define WORKMODE_SLAVE 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user