diff options
Diffstat (limited to 'fw/fe310/eos/trap_entry.S')
-rw-r--r-- | fw/fe310/eos/trap_entry.S | 192 |
1 files changed, 99 insertions, 93 deletions
diff --git a/fw/fe310/eos/trap_entry.S b/fw/fe310/eos/trap_entry.S index 506683b..fb2b121 100644 --- a/fw/fe310/eos/trap_entry.S +++ b/fw/fe310/eos/trap_entry.S @@ -25,6 +25,18 @@ #define INT_PWM1_BASE 44 #define INT_PWM2_BASE 48 +#define I2S_MIC_BUF (0*4) +#define I2S_SPK_BUF (1*4) +#define I2S_FMT (2*4) +#define I2S_MODE (3*4) +#define I2S_MIC_WM (4*4) +#define I2S_SPK_WM (5*4) +#define I2S_MIC_EVT (6*4) +#define I2S_SPK_EVT (7*4) +#define I2S_MIC_CMP2 (8*4) +#define I2S_MIC_CMP3 (9*4) +#define I2S_SAMPLE (10*4) + #include "board.h" #include "irq_def.h" #include "evt_def.h" @@ -37,7 +49,7 @@ .global eos_trap_entry eos_trap_entry: - addi sp, sp, -10*REGBYTES + addi sp, sp, -12*REGBYTES STORE x8, 0*REGBYTES(sp) STORE x9, 1*REGBYTES(sp) STORE x18, 2*REGBYTES(sp) @@ -46,8 +58,10 @@ eos_trap_entry: STORE x21, 5*REGBYTES(sp) STORE x22, 6*REGBYTES(sp) STORE x23, 7*REGBYTES(sp) - STORE x24, 8*REGBYTES(sp) - STORE x25, 9*REGBYTES(sp) + STORE x24, 8*REGBYTES(sp) # format: 0 - PCM16; 1 - ALAW + STORE x25, 9*REGBYTES(sp) # mode: 0 - stereo; 1 - mono + STORE x26, 10*REGBYTES(sp) # channel: 0 - left; 1 - right + STORE x27, 11*REGBYTES(sp) # _eos_event_q addr csrr x8, mcause li x18, MCAUSE_EXT @@ -86,51 +100,57 @@ evtq_push: jalr x0, x21 i2s_handle_sd: - li x9, I2S_CTRL_ADDR_WS_MIC - lw x18, PWM_COUNT(x9) - lw x19, PWM_CMP1(x9) - lw x20, PWM_CMP2(x9) - lw x21, PWM_CMP3(x9) + li x8, I2S_CTRL_ADDR_WS_SPK + lw x18, PWM_COUNT(x8) + lw x19, PWM_CMP3(x8) # exit if too early - bltu x18, x21, i2s_sd_exit - - # move CMPs for next channel and store parity to x25 - li x25, 0 - bltu x20, x19, 0f - li x25, 1 - neg x19, x19 - li x22, PLIC_PRIORITY - sw x0, 4*I2S_IRQ_SD_ID(x22) + bltu x18, x19, i2s_sd_exit + + la x27, _eos_i2s_drvr + + # move CMPs for next channel and store channel bit to x26 + lw x20, I2S_MIC_CMP2(x27) + lw x21, I2S_MIC_CMP3(x27) # 16-bit period + + add x23, x19, x20 + add x24, x23, x21 + slli x20, x21, 1 # 32-bit period + slli x21, x20, 1 # 64-bit period + bltu x24, x21, 0f + neg x21, x21 + add x23, x23, x21 + add x24, x24, x21 0: - add x20, x20, x19 - add x21, x21, x19 - sw x20, PWM_CMP2(x9) - sw x21, PWM_CMP3(x9) + li x26, 0 + bltu x23, x20, 0f + li x26, 1 +0: + bltu x19, x20, 0f + neg x20, x20 + li x18, PLIC_PRIORITY + sw x0, 4*I2S_IRQ_SD_ID(x18) +0: + add x19, x19, x20 + + li x9, I2S_CTRL_ADDR_WS_MIC + sw x19, PWM_CMP3(x8) + sw x23, PWM_CMP2(x9) + sw x24, PWM_CMP3(x9) - la x9, _eos_i2s_fmt - lw x24, 0(x9) + lw x24, I2S_FMT(x27) + lw x25, I2S_MODE(x27) i2s_abuf_pop: - la x9, _eos_i2s_mode - lw x22, 0(x9) - and x22, x22, x25 - beqz x22, 0f + and x8, x25, x26 + beqz x8, 0f - la x9, _eos_i2s_sample - lw x8, 0(x9) + lw x8, I2S_SAMPLE(x27) j i2s_sd_xchg - 0: - mv x8, x0 - - # check for pop from spk buf - la x9, _eos_i2s_spk_wm - lw x22, 0(x9) - beqz x22, i2s_sd_xchg - # pop from spk buf -> x8 - la x9, _eos_i2s_spk_buf + lw x9, I2S_SPK_BUF(x27) + beqz x9, i2s_sd_xchg lhu x18, I2S_ABUF_OFF_IDXR(x9) lhu x19, I2S_ABUF_OFF_IDXW(x9) lhu x20, I2S_ABUF_OFF_SIZE(x9) @@ -160,12 +180,12 @@ i2s_abuf_pop: and x18, x18, x21 # check for push to event queue - bgtu x18, x22, i2s_decode + lw x9, I2S_SPK_WM(x27) + bgtu x18, x9, i2s_decode - la x9, _eos_i2s_spk_evt_enable - lw x18, 0(x9) - beqz x18, i2s_decode - sw x0, 0(x9) + lw x9, I2S_SPK_EVT(x27) + beqz x9, i2s_decode + sw x0, I2S_SPK_EVT(x27) # push to event queue jal x22, evtq_push @@ -212,8 +232,8 @@ i2s_decode: beqz x9, 3f mul x8, x8, x9 3: - la x9, _eos_i2s_sample - sw x8, 0(x9) + beqz x25, i2s_sd_xchg + sw x8, I2S_SAMPLE(x27) i2s_sd_xchg: # read/write shift reg: x8 -> sr -> x8 @@ -318,16 +338,12 @@ i2s_encode: andi x8, x8, 0xff i2s_abuf_push: - # check parity - # bnez x25, i2s_sd_exit - - # check for push to mic buf - la x9, _eos_i2s_mic_wm - lw x22, 0(x9) - beqz x22, i2s_sd_exit + # check channel + # bnez x26, i2s_sd_exit # push to mic buf - la x9, _eos_i2s_mic_buf + lw x9, I2S_MIC_BUF(x27) + beqz x9, i2s_sd_exit lhu x18, I2S_ABUF_OFF_IDXR(x9) lhu x19, I2S_ABUF_OFF_IDXW(x9) lhu x20, I2S_ABUF_OFF_SIZE(x9) @@ -357,12 +373,12 @@ i2s_abuf_push: 2: # check for push to event queue - bltu x18, x22, i2s_sd_exit + lw x9, I2S_MIC_WM(x27) + bltu x18, x9, i2s_sd_exit - la x9, _eos_i2s_mic_evt_enable - lw x18, 0(x9) - beqz x18, i2s_sd_exit - sw x0, 0(x9) + lw x9, I2S_MIC_EVT(x27) + beqz x9, i2s_sd_exit + sw x0, I2S_MIC_EVT(x27) # push to event queue jal x22, evtq_push @@ -427,16 +443,6 @@ _eos_i2s_start_pwm: ret -.global _eos_flash_set -_eos_flash_set: - li a3, SPI0_CTRL_ADDR - sw x0, SPI_REG_FCTRL(a3) - sw a0, SPI_REG_SCKDIV(a3) - sw a1, SPI_REG_FFMT(a3) - li a0, 1 - sw a0, SPI_REG_FCTRL(a3) - ret - trap_exit_data: # Remain in M-mode after mret li x18, MSTATUS_MPP @@ -452,7 +458,9 @@ trap_exit_data: LOAD x23, 7*REGBYTES(sp) LOAD x24, 8*REGBYTES(sp) LOAD x25, 9*REGBYTES(sp) - addi sp, sp, 10*REGBYTES + LOAD x26, 10*REGBYTES(sp) + LOAD x27, 11*REGBYTES(sp) + addi sp, sp, 12*REGBYTES mret @@ -465,7 +473,7 @@ handle_intr: .align 4 trap_entry_text: - addi sp, sp, -22*REGBYTES + addi sp, sp, -20*REGBYTES STORE x1, 0*REGBYTES(sp) STORE x2, 1*REGBYTES(sp) @@ -482,12 +490,10 @@ trap_entry_text: STORE x15, 12*REGBYTES(sp) STORE x16, 13*REGBYTES(sp) STORE x17, 14*REGBYTES(sp) - STORE x26, 15*REGBYTES(sp) - STORE x27, 16*REGBYTES(sp) - STORE x28, 17*REGBYTES(sp) - STORE x29, 18*REGBYTES(sp) - STORE x30, 19*REGBYTES(sp) - STORE x31, 20*REGBYTES(sp) + STORE x28, 15*REGBYTES(sp) + STORE x29, 16*REGBYTES(sp) + STORE x30, 17*REGBYTES(sp) + STORE x31, 18*REGBYTES(sp) li x18, MCAUSE_TIMER beq x8, x18, handle_timer @@ -526,23 +532,23 @@ trap_exit_text: LOAD x15, 12*REGBYTES(sp) LOAD x16, 13*REGBYTES(sp) LOAD x17, 14*REGBYTES(sp) - LOAD x26, 15*REGBYTES(sp) - LOAD x27, 16*REGBYTES(sp) - LOAD x28, 17*REGBYTES(sp) - LOAD x29, 18*REGBYTES(sp) - LOAD x30, 19*REGBYTES(sp) - LOAD x31, 20*REGBYTES(sp) - - LOAD x8, 22*REGBYTES(sp) - LOAD x9, 23*REGBYTES(sp) - LOAD x18, 24*REGBYTES(sp) - LOAD x19, 25*REGBYTES(sp) - LOAD x20, 26*REGBYTES(sp) - LOAD x21, 27*REGBYTES(sp) - LOAD x22, 28*REGBYTES(sp) - LOAD x23, 29*REGBYTES(sp) - LOAD x24, 30*REGBYTES(sp) - LOAD x25, 31*REGBYTES(sp) + LOAD x28, 15*REGBYTES(sp) + LOAD x29, 16*REGBYTES(sp) + LOAD x30, 17*REGBYTES(sp) + LOAD x31, 18*REGBYTES(sp) + + LOAD x8, 20*REGBYTES(sp) + LOAD x9, 21*REGBYTES(sp) + LOAD x18, 22*REGBYTES(sp) + LOAD x19, 23*REGBYTES(sp) + LOAD x20, 24*REGBYTES(sp) + LOAD x21, 25*REGBYTES(sp) + LOAD x22, 26*REGBYTES(sp) + LOAD x23, 27*REGBYTES(sp) + LOAD x24, 28*REGBYTES(sp) + LOAD x25, 29*REGBYTES(sp) + LOAD x26, 30*REGBYTES(sp) + LOAD x27, 31*REGBYTES(sp) addi sp, sp, 32*REGBYTES mret |