#include "tl2cdr.h" #include "sysDef.h" #include "plic.h" #if 0 /* 其他代码全部使用RV32E编译,仅此代码采用 RV32I 编译,故而可以使用x0, x16~x31寄存器 为了方便,不再使用ABI中的别名,直接使用x0, x16~x31;x1~x15使用ABI中定义的别名 */ #endif #if !(defined(__riscv_i) || defined(__USE_RV32I_ABI)) #error "must be compiled in RV32I" #endif .globl _prog_start .globl _rv32i_plic_handle .section .text.init, "ax", %progbits _prog_start: //a0 call_function no li x16, SYS_INIT beqz a0, init_func //初始化系统,输入必要的地址信息,返回 中断程序 的地址 li x16, SYS_SEND_DATA beq a0, x16, send_data_func li x16, SYS_SET_RECV_INFO beq a0, x16, set_recv_info_func li x16, SYS_SLAVE_WORK beq a0, x16, slave_work_func 10: j 10b //死循环,输入错误的功能号 ret //心理安慰,并不会返回 //--------------------------------------------------------- //a1~a5 hlm_slave_work: li x18, 1 i_rx0_txPair(x18) i_rx0_limitTime(x0) i_rx1_txPair(x0) i_rx1_limitTime(x0) 1: i_hlm_read_intflag(x17) i_hlm_status(x16) andi x18, x17, HLM_INT_RX0_START ret //--------------------------------------------------------- //初始化系统,输入必要的地址信息,返回中断程序的地址 //a1, plic_claim的地址, 其实也可以不用传送 init_func: ret //--------------------------------------------------------- //主站启动发送数据 //a1, 当前需要发送的数据的地址 //a2, 当前数据发送的长度 //a3, dummy //a4, dummy send_data_func: #warning .................................................. ret //--------------------------------------------------------- //设置接收数据的地址,第一个接收数据的长度,往后都是数据 //a1, 设置接收数据的缓冲区 slave_work_func: 1: i_hlm_status(x18) andi x19, x18, HLM_RX0_VALID beqz x19, 1b i_rx0_rxFifo(x20) srli x19, x20, 20 addi x19, x19, 4 i_tx1_txLen(x29) i_tx1_txFifo(x29) li x21, 4 1: i_hlm_status(x29) andi x18, x18, HLM_RX0_VALID beqz x18, 1b i_rx0_rxFifo(x29) i_tx1_txFifo(x29) addi x21, x21, 4 bltu x21, x19, 1b ret //--------------------------------------------------------- set_recv_info_func: ret //--------------------------------------------------------- //中断程序,没有使用 .balign 32 _rv32i_plic_handle: mret