diff options
Diffstat (limited to 'code/fe310/eos')
| -rw-r--r-- | code/fe310/eos/trap_entry.S | 125 | 
1 files changed, 63 insertions, 62 deletions
| diff --git a/code/fe310/eos/trap_entry.S b/code/fe310/eos/trap_entry.S index bf02c84..25412d8 100644 --- a/code/fe310/eos/trap_entry.S +++ b/code/fe310/eos/trap_entry.S @@ -31,29 +31,6 @@    .section      .data.entry    .align 2 -.global eos_trap_entry -eos_trap_entry: -  addi sp, sp, -4*REGBYTES -  STORE x8, 0*REGBYTES(sp) -  STORE x9, 1*REGBYTES(sp) -  STORE x18, 2*REGBYTES(sp) -  STORE x19, 3*REGBYTES(sp) - -  csrr x8, mcause -  li x18, MCAUSE_EXT -  bne x8, x18, handler -  li x18, PLIC_CLAIM -  lw x9, 0(x18) -  li x18, I2S_IRQ_SD_ID -  beq x9, x18, handler_sd -  li x18, I2S_IRQ_CK_ID -  beq x9, x18, handler_ck -  li x18, I2S_IRQ_WS_ID -  beq x9, x18, handler_ws -  li x18, I2S_IRQ_CI_ID -  beq x9, x18, handler_ci -  j handler -  evtq_push:    la x9, _eos_event_q    lbu x18, MSGQ_OFF_IDXR(x9) @@ -78,13 +55,36 @@ evtq_push:    mv x8, x0    jalr x0, x20 -handler_sd: +.global eos_trap_entry +eos_trap_entry: +  addi sp, sp, -4*REGBYTES +  STORE x8, 0*REGBYTES(sp) +  STORE x9, 1*REGBYTES(sp) +  STORE x18, 2*REGBYTES(sp) +  STORE x19, 3*REGBYTES(sp) + +  csrr x8, mcause +  li x18, MCAUSE_EXT +  bne x8, x18, handler +  li x18, PLIC_CLAIM +  lw x9, 0(x18) +  li x18, I2S_IRQ_SD_ID +  beq x9, x18, i2s_handler_sd +  li x18, I2S_IRQ_CK_ID +  beq x9, x18, i2s_handler_ck +  li x18, I2S_IRQ_WS_ID +  beq x9, x18, i2s_handler_ws +  li x18, I2S_IRQ_CI_ID +  beq x9, x18, i2s_handler_ci +  j handler + +i2s_handler_sd:    # exit if too early    li x18, I2S_PWM_CTRL_ADDR_CK    lw x8, PWM_COUNT(x18)    lw x9, PWM_CMP2(x18)    srli x9, x9, I2S_PWM_SCALE_CK -  bltu x8, x9, handler_sd_exit_ +  bltu x8, x9, i2s_handler_sd_exit_    # read mic value -> x8    li x18, GPIO_CTRL_ADDR @@ -111,8 +111,8 @@ handler_sd:    # bit <= 0 or bit > 32 -> exit    li x18, 32 -  bge x0, x9, handler_sd_exit -  bge x9, x18, handler_sd_exit +  bge x0, x9, i2s_handler_sd_exit +  bge x9, x18, i2s_handler_sd_exit    # sample |= sd gpio value << (32 - bit) -> x8    # sample_mask |= 1 << (32 - bit) -> x20 @@ -137,7 +137,7 @@ handler_sd:    # bit < I2S_SMPL_BITS -> exit    li x18, I2S_SMPL_BITS -  blt x9, x18, handler_sd_exit +  blt x9, x18, i2s_handler_sd_exit    # disable ck irq    li x18, PLIC_PRIORITY @@ -162,7 +162,7 @@ handler_sd:    and x20, x20, x19    beq x19, x20, 0f    # drop missing -  # bne x19, x20, handler_sd_exit +  # bne x19, x20, i2s_handler_sd_exit    # lw x8, 0(x18)    # zero missing frame    mv x8, x0 @@ -208,7 +208,7 @@ handler_sd:    lhu x20, I2S_ABUF_OFF_SIZE(x9)    sub x18, x19, x18 -  beq x18, x20, handler_sd_exit +  beq x18, x20, i2s_handler_sd_exit    addi x20, x20, -1    and x20, x20, x19 @@ -222,29 +222,29 @@ handler_sd:    # check for push to event queue    la x9, _eos_i2s_mic_wm    lw x20, 0(x9) -  beqz x20, handler_sd_exit +  beqz x20, i2s_handler_sd_exit    la x9, _eos_i2s_mic_buf    lhu x18, I2S_ABUF_OFF_IDXR(x9)    sub x18, x19, x18 -  bltu x18, x20, handler_sd_exit +  bltu x18, x20, i2s_handler_sd_exit    la x9, _eos_i2s_mic_rd    lw x18, 0(x9) -  beqz x18, handler_sd_exit +  beqz x18, i2s_handler_sd_exit    sw x0, 0(x9)    # push to event queue    jal x20, evtq_push -  beqz x8, handler_sd_exit +  beqz x8, i2s_handler_sd_exit    li x18, (EOS_EVT_AUDIO | I2S_EVT_MIC)    sb x18, MSGQ_ITEM_OFF_CMD(x8) -handler_sd_exit: +i2s_handler_sd_exit:    LOAD x20, 0*REGBYTES(sp)    addi sp, sp, 1*REGBYTES -handler_sd_exit_: +i2s_handler_sd_exit_:    # complete    li x18, I2S_IRQ_SD_ID    li x19, PLIC_CLAIM @@ -253,7 +253,7 @@ handler_sd_exit_:    # exit    j trap_exit_data -handler_ck: +i2s_handler_ck:    # enable sd irq    li x18, PLIC_PRIORITY    li x19, I2S_IRQ_SD_PRIORITY @@ -267,7 +267,7 @@ handler_ck:    # exit    j trap_exit_data -handler_ws: +i2s_handler_ws:    # enable ci irq    li x18, PLIC_PRIORITY    li x19, I2S_IRQ_CI_PRIORITY @@ -281,12 +281,12 @@ handler_ws:    # exit    j trap_exit_data -handler_ci: +i2s_handler_ci:    # exit if too early    li x18, I2S_PWM_CTRL_ADDR_WS    lw x8, PWM_COUNT(x18)    lw x9, PWM_CMP2(x18) -  bltu x8, x9, handler_ci_exit +  bltu x8, x9, i2s_handler_ci_exit    # disable ci/enable ck irq    li x18, PLIC_PRIORITY @@ -303,7 +303,7 @@ handler_ci:    la x9, _eos_i2s_spk_buf    lhu x18, I2S_ABUF_OFF_IDXR(x9)    lhu x19, I2S_ABUF_OFF_IDXW(x9) -  beq x18, x19, handler_ci_exit +  beq x18, x19, i2s_handler_ci_exit    lhu x19, I2S_ABUF_OFF_SIZE(x9)    addi x19, x19, -1 @@ -367,7 +367,7 @@ handler_ci:    # andi x9, x9, 0xff    # sw x9, UART_REG_TXFIFO(x18) -handler_ci_exit: +i2s_handler_ci_exit:    # complete    li x18, I2S_IRQ_CI_ID    li x19, PLIC_CLAIM @@ -383,6 +383,7 @@ handler_ci_exit:  #include "net_def.h"  #include "spi_def.h" +# x9 - cmd, x18 - buffer, x19 - len, x20 - &flags, x21 - flags  spi_xchg_start:    ori x21, x21, SPI_FLAG_INIT    andi x21, x21, ~SPI_FLAG_CTS @@ -433,7 +434,7 @@ spi_xchg_start:    sw x21, SPI_REG_IE(x20)    jalr x0, x8   -handler_spi_xchg: +spi_handler_xchg:    addi sp, sp, -4*REGBYTES    STORE x20, 0*REGBYTES(sp)    STORE x21, 1*REGBYTES(sp) @@ -452,7 +453,7 @@ handler_spi_xchg:    li x8, SPI_CSMODE_AUTO    sw x8, SPI_REG_CSMODE(x19)    sw x0, SPI_REG_IE(x19) -  j handler_spi_xchg_exit +  j spi_handler_xchg_exit  1:    andi x8, x20, SPI_FLAG_INIT @@ -508,7 +509,7 @@ handler_spi_xchg:  5:    la x18, _eos_spi_state_len    sw x21, 0(x18) -  j handler_spi_xchg_exit +  j spi_handler_xchg_exit  6:    la x18, _eos_spi_state_len @@ -585,7 +586,7 @@ handler_spi_xchg:    la x18, _eos_spi_state_len_rx    lw x22, 0(x18)    sh x22, MSGQ_ITEM_OFF_SIZE(x8) -  j handler_spi_xchg_exit +  j spi_handler_xchg_exit  12:    la x18, _eos_spi_state_flags @@ -602,7 +603,7 @@ handler_spi_xchg:    andi x8, x8, ~SPI_FLAG_ONEW    sb x8, 0(x18) -  j handler_spi_xchg_exit +  j spi_handler_xchg_exit  14:    # push spi bufq @@ -617,10 +618,10 @@ handler_spi_xchg:    addi x8, x8, 1    sb x8, SPI_BUFQ_OFF_IDXW(x19) -  j handler_spi_xchg_exit +  j spi_handler_xchg_exit  15:   -  bne x21, x20, handler_spi_xchg_exit +  bne x21, x20, spi_handler_xchg_exit    sub x8, x20, x22    addi x8, x8, -1    li x9, SPI_SIZE_RXWM @@ -631,7 +632,7 @@ handler_spi_xchg:    li x9, SPI_IP_RXWM    sw x9, SPI_REG_IE(x19) -handler_spi_xchg_exit: +spi_handler_xchg_exit:    LOAD x20, 0*REGBYTES(sp)    LOAD x21, 1*REGBYTES(sp)    LOAD x22, 2*REGBYTES(sp) @@ -646,7 +647,7 @@ handler_spi_xchg_exit:    # exit    j trap_exit_data -handler_spi_cts: +spi_handler_cts:    addi sp, sp, -4*REGBYTES    STORE x20, 0*REGBYTES(sp)    STORE x21, 1*REGBYTES(sp) @@ -689,13 +690,13 @@ handler_spi_cts:    beqz x19, 1f    jal x8, spi_xchg_start -  j handler_spi_cts_exit +  j spi_handler_cts_exit  1:    la x9, _eos_spi_buf_q    lbu x18, SPI_BUFQ_OFF_IDXR(x9)    lbu x19, SPI_BUFQ_OFF_IDXW(x9) -  beq x18, x19, handler_spi_cts_exit +  beq x18, x19, spi_handler_cts_exit    andi x8, x18, SPI_SIZE_BUFQ - 1    slli x8, x8, 2 @@ -705,10 +706,10 @@ handler_spi_cts:    mv x9, x0    lw x18, SPI_BUFQ_OFF_ARRAY(x8)    mv x19, x0 -  beqz x18, handler_spi_cts_exit +  beqz x18, spi_handler_cts_exit    jal x8, spi_xchg_start -  j handler_spi_cts_exit +  j spi_handler_cts_exit  2:    lw x8, GPIO_IOF_EN(x19) @@ -718,7 +719,7 @@ handler_spi_cts:    and x8, x8, x9    sw x8, GPIO_IOF_EN(x19) -handler_spi_cts_exit: +spi_handler_cts_exit:    LOAD x20, 0*REGBYTES(sp)    LOAD x21, 1*REGBYTES(sp)    LOAD x22, 2*REGBYTES(sp) @@ -733,7 +734,7 @@ handler_spi_cts_exit:    # exit    j trap_exit_data -handler_spi_rts: +spi_handler_rts:    li x8, 1    slli x8, x8, SPI_PIN_RTS    li x18, GPIO_CTRL_ADDR @@ -749,9 +750,9 @@ handler_spi_rts:    sb x8, 0(x19)    andi x9, x8, SPI_FLAG_RDY -  beqz x9, handler_spi_rts_exit +  beqz x9, spi_handler_rts_exit    andi x9, x8, SPI_FLAG_CTS -  beqz x9, handler_spi_rts_exit +  beqz x9, spi_handler_rts_exit    andi x8, x8, ~SPI_FLAG_CTS    ori x8, x8, SPI_FLAG_RST @@ -765,19 +766,19 @@ handler_spi_rts:    li x8, SPI_IP_RXWM    sw x8, SPI_REG_IE(x19) -  j handler_spi_rts_exit +  j spi_handler_rts_exit  1:    lw x9, GPIO_FALL_IP(x18)    and x9, x9, x8 -  beqz x9, handler_spi_rts_exit +  beqz x9, spi_handler_rts_exit    sw x8, GPIO_FALL_IP(x18)    lbu x8, 0(x18)    andi x8, x8, ~SPI_FLAG_RTS    sb x8, 0(x19) -handler_spi_rts_exit: +spi_handler_rts_exit:    # XXX should complete!    # li x18, I2S_IRQ_SD_ID    # li x19, PLIC_CLAIM | 
