合并bacon_dev分支的修改:1.增加寻找超出指定执行周期的指令;2.删除汇编中不需要的代码;3.增加协议的细节内容

This commit is contained in:
2025-03-03 10:59:07 +08:00
parent 7f123244be
commit c64df6956d
4 changed files with 95 additions and 306 deletions

View File

@@ -6,48 +6,19 @@
/*
使RV32E RV32I 使x0, x16~x31
便使ABI使x0, x16~x31x1~x15使ABI
x16~x23, 使
x24, TL2CDR_BASE
x25, 4
x26, 4(tx0_txLen)
x27,
x28, plic_claim
x29, REG_ISR_ADDR
x30,
x31,
*/
#endif
#ifndef __riscv_i
#if !(defined(__riscv_i) || defined(__USE_RV32I_ABI))
#error "must be compiled in RV32I"
#endif
#define REG_TL2CDR_BASE x24
#define REG_rx_data x25
#define REG_tx_data x26
#define REG_tx_data_len x27
#define REG_plic_claim x28
#define REG_ISR_ADDR x29
#define REG_min_isr_num x30
#define REG_max_isr_num x31
#define REG_4 x23
.globl _prog_start
.globl _rv32i_plic_handle
.section .text.init, "ax", %progbits
_prog_start:
//a0 call_function no
//a0 call_function no
li x16, SYS_INIT
beqz a0, init_func //
@@ -64,277 +35,79 @@ _prog_start:
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:
mv x30, a1 # plic_claim
mv x31, a2 # isr_flag
la x17, _rv32i_plic_handle
mv a0, x17
//li x29, TL2CDR_BASE
ret
//---------------------------------------------------------
//
//a1,
//a2,
//a3, dummy
//a4, dummy
send_data_func:
mv REG_tx_data, a1
mv REG_tx_data_len, a2
//*tx0_txLen = 8 + tx_len; //前导+长度命令
mv x16, a2
addi x17, x16, 8
//sw x17, TX0_WriteTxLen(REG_TL2CDR_BASE)
i_tx0_txLen(x17)
//*tx0_txFifo = (tx_len << 20) | (0 << 16) | 0x0000;
slli x17, x16, 20
//sw x17, TX0_WriteTxFifo(REG_TL2CDR_BASE)
i_tx0_txFifo(x17)
li a0, 1
#warning ..................................................
ret
//---------------------------------------------------------
//,
//a1,
set_recv_info_func:
mv REG_rx_data, a1
li a0, 1
ret
#if 0
slave_work_func:
1:
lw x18, (CDR_INT_RX0START * 4)(x31)
beqz x18, 1b
sw x0, (CDR_INT_RX0START * 4)(x31)
lw x20, RX0_ReadRxFifo(x29)
srli x19, x20, 20
addi x19, x19, 4
sw x19, TX1_WriteTxLen(x29)
sw x20, TX1_WriteTxFifo(x29)
li x21, 4
1:
lw x18, HLM_ReadStatus(x29)
andi x18, x18, HLM_RX0_VALID
beqz x18, 1b
lw x20, RX0_ReadRxFifo(x29)
sw x20, TX1_WriteTxFifo(x29)
addi x21, x21, 4
bltu x21, x19, 1b
ret
#else
slave_work_func:
1:
//lw x18, HLM_ReadStatus(x29)
i_hlm_status(x18)
andi x19, x18, HLM_RX0_VALID
beqz x19, 1b
//lw x20, RX0_ReadRxFifo(x29)
i_rx0_rxFifo(x20)
srli x19, x20, 20
addi x19, x19, 4
//sw x19, TX1_WriteTxLen(x29)
i_tx1_txLen(x29)
//sw x20, TX1_WriteTxFifo(x29)
i_tx1_txFifo(x29)
li x21, 4
1:
//lw x18, HLM_ReadStatus(x29)
i_hlm_status(x29)
andi x18, x18, HLM_RX0_VALID
beqz x18, 1b
//lw x20, RX0_ReadRxFifo(x29)
i_rx0_rxFifo(x29)
//sw x20, TX1_WriteTxFifo(x29)
i_tx1_txFifo(x29)
addi x21, x21, 4
bltu x21, x19, 1b
ret
#endif
.balign 32
_rv32i_plic_handle:
lw x16, 0(x30) # x16 = *plic_claim
sw x16, 0(x30) # *plic_claim = x16
slli x17, x16, 2 # x17 = x17 * 4
add x17, x31, x17 # x17 = x31 + x17
li x16, 1
sw x16, 0(x17)
mret
#if 0
_prog_start:
//a0 call_function no
li x16, SYS_INIT
beqz a0, init_system_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
10: j 10b //
ret //
//
//a1, plic_claim,
init_system_func:
mv REG_plic_claim, a1 # plic_claim
la x17, _rv32i_plic_handle
mv a0, x17
li REG_TL2CDR_BASE, TL2CDR_BASE
la REG_ISR_ADDR, isr_hdl_table
li REG_min_isr_num, 14
li REG_max_isr_num, 25
li REG_4, 4
ret
//
//a1,
//a2,
//a3, dummy
//a4, dummy
send_data_func:
mv REG_tx_data, a1
mv REG_tx_data_len, a2
//*tx0_txLen = 8 + tx_len; //前导+长度命令
mv x16, a2
addi x17, x16, 8
//sw x17, TX0_WriteTxLen(REG_TL2CDR_BASE)
i_tx0_txLen(x17)
//*tx0_txFifo = (tx_len << 20) | (0 << 16) | 0x0000;
slli x17, x16, 20
//sw x17, TX0_WriteTxFifo(REG_TL2CDR_BASE)
i_tx0_txFifo(x17)
//*tx0_txFifo = data[0]
#lw x17, 0(REG_tx_data)
#sw x17, TX0_WriteTxFifo(REG_TL2CDR_BASE)
#add REG_tx_data, REG_tx_data, REG_4
#sub REG_tx_data_len, REG_tx_data_len, REG_4
li a0, 1
ret
//,
//a1,
//---------------------------------------------------------
set_recv_info_func:
mv REG_rx_data, a1
li a0, 1
ret
//--------------------------------------------
//
//---------------------------------------------------------
//,使
.balign 32
_rv32i_plic_handle:
lw x16, 0(REG_plic_claim) # x16 = *plic_claim
sw x16, 0(REG_plic_claim) # *plic_claim = x16
bltu x16, REG_min_isr_num, exit_handle #if x16 < REG_min_isr_num then goto exit_handle
bltu REG_max_isr_num, x16, exit_handle #if REG_max_isr_num < x16 then goto exit_handle
sub x17, x16, REG_min_isr_num
slli x17, x17, 2 # x17 = x17 * 4
add x18, REG_ISR_ADDR, x17 # x18 = REG_ISR_ADDR + x17
jr x18
exit_handle:
mret
isr_tx0_end_hdl:
#li x17, 1
#sw x17, TX0_WriteSoftReset(REG_TL2CDR_BASE)
//i_tx0_softReset(x17)
mret
isr_tx1_end_hdl:
#li x17, 1
#sw x17, TX1_WriteSoftReset(REG_TL2CDR_BASE)
//i_tx1_softReset(x17)
mret
isr_rx0_err_hdl:
mret
isr_rx1_err_hdl:
mret
isr_rx0_start_hdl:
mret
isr_rx1_start_hdl:
//lw x22, RX1_ReadRxLen(REG_TL2CDR_BASE)
i_rx1_rxLen(x22)
sw x22, 0(REG_rx_data)
add REG_rx_data, REG_rx_data, REG_4
mret
isr_rx0_end_hdl:
mret
isr_rx1_end_hdl:
mret
isr_tx0_deq_hdl:
beqz REG_tx_data_len, 1f //if (REG_tx_data_len > 0)
lw x17, 0(REG_tx_data)
//sw x17, TX0_WriteTxFifo(REG_TL2CDR_BASE)
i_tx0_txFifo(x17)
add REG_tx_data, REG_tx_data, REG_4
sub REG_tx_data_len, REG_tx_data_len, REG_4
1:
mret
isr_tx1_deq_hdl:
mret
isr_rx0_enq_hdl:
mret
isr_rx1_enq_hdl:
//lw x17, RX1_ReadRxFifo(REG_TL2CDR_BASE)
i_rx1_rxFifo(x17)
sw x17, 0(REG_rx_data)
//add REG_rx_data, REG_rx_data, REG_4
mret
isr_hdl_table:
j isr_tx0_end_hdl
j isr_tx1_end_hdl
j isr_rx0_err_hdl
j isr_rx1_err_hdl
j isr_rx0_start_hdl
j isr_rx1_start_hdl
j isr_rx0_end_hdl
j isr_rx1_end_hdl
j isr_tx0_deq_hdl
j isr_tx1_deq_hdl
j isr_rx0_enq_hdl
j isr_rx1_enq_hdl
#endif