diff options
Diffstat (limited to 'fw/fe310/eos/soc/trap_entry.S')
-rw-r--r-- | fw/fe310/eos/soc/trap_entry.S | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/fw/fe310/eos/soc/trap_entry.S b/fw/fe310/eos/soc/trap_entry.S index 7417254..1d3d1c2 100644 --- a/fw/fe310/eos/soc/trap_entry.S +++ b/fw/fe310/eos/soc/trap_entry.S @@ -99,12 +99,11 @@ i2s_handle_sd: # store channel bit to x25 li x18, I2S_CTRL_ADDR_WS lw x18, PWM_CFG(x18) + # 29th - pwmcmp1ip bit li x19, (1 << 29) and x25, x18, x19 srli x25, x25, 29 - bnez x25, i2s_sd_complete - la x27, _eos_i2s_drvr lw x26, I2S_FMT(x27) @@ -123,10 +122,12 @@ i2s_abuf_pop: lw x21, I2S_ABUF_OFF_ARRAY(x9) add x21, x21, x20 beqz x26, 0f + mv x22, x18 lbu x8, 0(x21) addi x18, x18, 1 j 1f 0: + srli x22, x18, 1 lb x8, 0(x21) lbu x20, 1(x21) slli x8, x8, 8 @@ -135,6 +136,13 @@ i2s_abuf_pop: 1: sh x18, I2S_ABUF_OFF_IDXR(x9) + # check for correct channel if mode is stereo + lw x21, I2S_MODE(x27) + bnez x21, 2f + andi x22, x22, 1 + xor x22, x22, x25 + beqz x22, i2s_abuf_pop + 2: li x21, 0xffff sub x18, x19, x18 @@ -194,13 +202,11 @@ i2s_decode: 3: i2s_sd_xchg: - # li x18, 0xa5a5 - # mv x8, x18 # read/write shift reg: x8 -> sr -> x8 li x18, GPIO_CTRL_ADDR - li x19, (0x1 << I2S_PIN_SD_IN) - li x20, (0x1 << I2S_PIN_SD_OUT) - li x21, (0x1 << I2S_PIN_SR_CK) + li x19, (1 << I2S_PIN_SD_IN) + li x20, (1 << I2S_PIN_SD_OUT) + li x21, (1 << I2S_PIN_SR_CK) lw x22, GPIO_OUTPUT_VAL(x18) lw x9, GPIO_OUTPUT_EN(x18) @@ -272,6 +278,9 @@ i2s_sd_xchg: slli x8, x8, 16 srai x8, x8, 16 + # skip right channel + bnez x25, i2s_sd_complete + i2s_encode: beqz x26, i2s_abuf_push # aLaw encode -> x8 @@ -352,7 +361,7 @@ i2s_abuf_push: i2s_sd_complete: li x18, GPIO_CTRL_ADDR - li x19, (0x1 << I2S_PIN_INT) + li x19, (1 << I2S_PIN_INT) sw x19, GPIO_FALL_IP(x18) li x18, I2S_IRQ_SD_ID |