summaryrefslogtreecommitdiff
path: root/fw/fe310/eos/dev/egpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/eos/dev/egpio.c')
-rw-r--r--fw/fe310/eos/dev/egpio.c273
1 files changed, 154 insertions, 119 deletions
diff --git a/fw/fe310/eos/dev/egpio.c b/fw/fe310/eos/dev/egpio.c
index 7358082..cfcd0f3 100644
--- a/fw/fe310/eos/dev/egpio.c
+++ b/fw/fe310/eos/dev/egpio.c
@@ -6,6 +6,8 @@
#include "board.h"
#include "eos.h"
+#include "log.h"
+
#include "event.h"
#include "soc/interrupt.h"
@@ -18,24 +20,31 @@
#include "sdcard.h"
#include "ctp.h"
#include "eve.h"
+
#include "app.h"
#include "drv/fxl6408.h"
#include "egpio.h"
+#include "egpio_priv.h"
/* FXL chip only */
-static const uint8_t egpio_switch[2] = {
- EGPIO_BIT_SDCARD_DET | EGPIO_BIT_BTN_WAKE,
+static const uint8_t egpio_switch[EGPIO_MAX_FXL_CHIP] = {
+ EGPIO_BIT_SDCARD_NDET | EGPIO_BIT_BTN_WAKE,
EGPIO_BIT_MIC_MUTE | EGPIO_BIT_HP_NDET,
};
static uint8_t egpio_pinval[EGPIO_MAX_CHIP];
+static uint8_t egpio_intmask[EGPIO_MAX_FXL_CHIP];
static uint8_t egpio_alt_pin;
static uint32_t wake_start;
static eos_egpio_intr_handler_t egpio_intr_handler;
static eos_egpio_ext_handler_t egpio_ext_handler;
+static int egpio_fxl_set_mask(uint8_t chip_id, uint8_t mask);
+static int egpio_set_val(uint8_t pin, int val);
+static int egpio_get_val(uint8_t pin);
+
#define EGPIO_ALT_EVEAUDIO_DIS 0x01
#define EGPIO_ALT_LSGAIN_SEL 0x02
#define EGPIO_ALT_AUDIO_SEL 0x04
@@ -43,8 +52,8 @@ static eos_egpio_ext_handler_t egpio_ext_handler;
#define BITSET(var, bit, val) { var = (val) ? (var | (bit)) : (var & ~(bit)); }
#define PINSWITCH(STPIN, SETPIN) { \
int rv; \
- BITSET(egpio_alt_pin, pin2alt_bit(STPIN), _eos_egpio_get_val(STPIN)); \
- rv = _eos_egpio_set_val(SETPIN, !!(egpio_alt_pin & pin2alt_bit(SETPIN))); \
+ BITSET(egpio_alt_pin, pin2alt_bit(STPIN), egpio_get_val(STPIN)); \
+ rv = egpio_set_val(SETPIN, !!(egpio_alt_pin & pin2alt_bit(SETPIN))); \
if (rv) return rv; \
}
@@ -65,20 +74,22 @@ static int handle_egpio_intr(uint8_t chip_id, uint8_t intr) {
int rv;
switch (chip_id) {
- case 0: {
+ case EGPIO_CHIP_FXL0: {
if (intr & EGPIO_BIT_BAT_INT) {
uint8_t fault0, fault1;
rv = eos_batt_read_fault(&fault0, &fault1);
if (rv) return rv;
- if (egpio_intr_handler) egpio_intr_handler(EGPIO_INT_TYPE_BAT, fault1, fault0);
+ if (egpio_intr_handler) egpio_intr_handler(EOS_EGPIO_INT_TYPE_BAT, fault1, fault0);
}
if (intr & EGPIO_BIT_CTP_INT) {
- eos_ctp_handle_intr();
+ rv = eos_ctp_handle_intr();
+ if (rv < 0) return rv;
}
if (intr & EGPIO_BIT_EVE_INT) {
- eos_eve_handle_intr();
+ rv = eos_eve_handle_intr();
+ if (rv < 0) return rv;
}
if (intr & EGPIO_BIT_BTN_WAKE) {
int btn_wake, tdelta;
@@ -89,27 +100,29 @@ static int handle_egpio_intr(uint8_t chip_id, uint8_t intr) {
} else {
tdelta = eos_tdelta_ms(wake_start);
}
- if (egpio_intr_handler) egpio_intr_handler(EGPIO_INT_TYPE_WAKE, btn_wake, btn_wake ? tdelta : 0);
+ if (egpio_intr_handler) egpio_intr_handler(EOS_EGPIO_INT_TYPE_WAKE, btn_wake, btn_wake ? tdelta : 0);
}
- if (intr & EGPIO_BIT_SDCARD_DET) {
- int sdc_det = eos_egpio_get_val(EGPIO_PIN_SDCARD_DET);
+ if (intr & EGPIO_BIT_SDCARD_NDET) {
+ int sdc_det;
- eos_sdc_insert(sdc_det);
- if (egpio_intr_handler) egpio_intr_handler(EGPIO_INT_TYPE_SDCARD, sdc_det, 0);
+ sdc_det = !eos_egpio_get_val(EGPIO_PIN_SDCARD_NDET);
+ rv = eos_sdc_insert(sdc_det, 0);
+ if (rv) EOS_LOG(EOS_LOG_ERR, "SDC INSERT ERR:%d\n", rv);
+ if (egpio_intr_handler) egpio_intr_handler(EOS_EGPIO_INT_TYPE_SDCARD, sdc_det, rv);
}
break;
}
- case 1: {
+ case EGPIO_CHIP_FXL1: {
if (intr & EGPIO_BIT_MIC_MUTE) {
- if (egpio_intr_handler) egpio_intr_handler(EGPIO_INT_TYPE_MUTE, eos_egpio_get_val(EGPIO_PIN_MIC_MUTE), 0);
+ if (egpio_intr_handler) egpio_intr_handler(EOS_EGPIO_INT_TYPE_MUTE, eos_egpio_get_val(EGPIO_PIN_MIC_MUTE), 0);
}
if (intr & EGPIO_BIT_HP_NDET) {
int hp_det, i2s_running, app_audio;
hp_det = !eos_egpio_get_val(EGPIO_PIN_HP_NDET);
i2s_running = eos_i2s_running();
- app_audio = !_eos_egpio_get_val(EGPIO_PIN_AUDIO_SEL);
+ app_audio = !egpio_get_val(EGPIO_PIN_AUDIO_SEL);
if (i2s_running || app_audio) {
if (i2s_running) {
eos_i2s_hp_change(hp_det);
@@ -125,7 +138,7 @@ static int handle_egpio_intr(uint8_t chip_id, uint8_t intr) {
PINSWITCH(EGPIO_PIN_EVEAUDIO_DIS, EGPIO_PIN_LSGAIN_SEL);
}
}
- if (egpio_intr_handler) egpio_intr_handler(EGPIO_INT_TYPE_HP, hp_det, 0);
+ if (egpio_intr_handler) egpio_intr_handler(EOS_EGPIO_INT_TYPE_HP, hp_det, 0);
}
break;
}
@@ -135,14 +148,18 @@ static int handle_egpio_intr(uint8_t chip_id, uint8_t intr) {
}
static int handle_egpio_evt(uint8_t chip_id) {
- uint8_t intr_reg, def_reg;
+ uint8_t intr_reg, mask_reg;
int rv;
rv = fxl6408_reg_read(chip_id, FXL6408_REG_INT_STATE, &intr_reg);
- if (rv) return rv;;
- if (!intr_reg) return 0;
+ if (rv) return rv;
+
+ intr_reg &= ~egpio_intmask[chip_id];
+ if (!intr_reg) return EOS_OK;
if (intr_reg & egpio_switch[chip_id]) {
+ uint8_t def_reg;
+
rv = fxl6408_reg_read(chip_id, FXL6408_REG_I_DEFAULT, &def_reg);
if (rv) return rv;
@@ -157,47 +174,47 @@ static int handle_egpio_evt(uint8_t chip_id) {
rv = handle_egpio_intr(chip_id, intr_reg);
if (rv) return rv;
- return 1;
+ return EOS_OK;
}
static void handle_evt(unsigned char type, unsigned char *buffer, uint16_t len) {
+ int rv;
+
type &= ~EOS_EVT_MASK;
switch (type) {
- case EGPIO_ETYPE_INT: {
- int rv;
-
- rv = handle_egpio_evt(0);
- if (rv < 0) goto handle_evt_fin;
+ case EOS_EGPIO_ETYPE_INT: {
+ rv = handle_egpio_evt(EGPIO_CHIP_FXL0);
+ if (rv) goto handle_evt_fin;
if (GPIO_REG(GPIO_INPUT_VAL) & (1 << EGPIO_PIN_INT)) goto handle_evt_fin;
- rv = handle_egpio_evt(1);
- if (rv < 0) goto handle_evt_fin;
+ rv = handle_egpio_evt(EGPIO_CHIP_FXL1);
+ if (rv) goto handle_evt_fin;
if (GPIO_REG(GPIO_INPUT_VAL) & (1 << EGPIO_PIN_INT)) goto handle_evt_fin;
if (egpio_ext_handler) rv = egpio_ext_handler();
handle_evt_fin:
- clear_csr(mstatus, MSTATUS_MIE);
GPIO_REG(GPIO_LOW_IP) = (1 << EGPIO_PIN_INT);
+ clear_csr(mstatus, MSTATUS_MIE);
GPIO_REG(GPIO_LOW_IE) |= (1 << EGPIO_PIN_INT);
set_csr(mstatus, MSTATUS_MIE);
+ if (rv) EOS_LOG(EOS_LOG_ERR, "EGPIO HANDLE INTR ERR:%d\n", rv);
break;
}
- case EGPIO_ETYPE_INT_CTP:
- case EGPIO_ETYPE_INT_EVE: {
+ case EOS_EGPIO_ETYPE_INT_CTP: {
if (eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) {
- eos_ctp_handle_intr();
+ rv = eos_ctp_handle_intr();
} else {
- eos_eve_handle_intr();
+ rv = eos_eve_handle_intr();
}
-handle_evt_eve_fin:
+ GPIO_REG(GPIO_LOW_IP) = (1 << CTP_PIN_INT);
clear_csr(mstatus, MSTATUS_MIE);
- GPIO_REG(GPIO_LOW_IP) = (1 << EVE_PIN_INT);
- GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_LOW_IE) |= (1 << CTP_PIN_INT);
set_csr(mstatus, MSTATUS_MIE);
+ if (rv < 0) EOS_LOG(EOS_LOG_ERR, "CTP/EVE HANDLE INTR ERR:%d\n", rv);
break;
}
}
@@ -205,16 +222,12 @@ handle_evt_eve_fin:
static void handle_intr(void) {
GPIO_REG(GPIO_LOW_IE) &= ~(1 << EGPIO_PIN_INT);
- eos_evtq_push_isr(EOS_EVT_EGPIO | EGPIO_ETYPE_INT, NULL, 0);
+ eos_evtq_push_isr(EOS_EVT_EGPIO | EOS_EGPIO_ETYPE_INT, NULL, 0);
}
-static void handle_intr_eve(void) {
- GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INT);
- if (egpio_pinval[EGPIO_CHIP_FXL0] & EGPIO_PIN2BIT(EGPIO0_PIN_CTP_SEL)) {
- eos_evtq_push_isr(EOS_EVT_EGPIO | EGPIO_ETYPE_INT_CTP, NULL, 0);
- } else {
- eos_evtq_push_isr(EOS_EVT_EGPIO | EGPIO_ETYPE_INT_EVE, NULL, 0);
- }
+static void handle_intr_ctp(void) {
+ GPIO_REG(GPIO_LOW_IE) &= ~(1 << CTP_PIN_INT);
+ eos_evtq_push_isr(EOS_EVT_EGPIO | EOS_EGPIO_ETYPE_INT_CTP, NULL, 0);
}
int eos_egpio_init(void) {
@@ -224,83 +237,98 @@ int eos_egpio_init(void) {
wakeup_cause = eos_pwr_wakeup_cause();
rst = (wakeup_cause == EOS_PWR_WAKE_RST);
if (rst) {
- rv = fxl6408_reg_read(0, FXL6408_REG_ID_CTRL, &data);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_ID_CTRL, &data);
+ if (rv) return rv;
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_ID_CTRL, &data);
if (rv) return rv;
- rv = fxl6408_reg_read(1, FXL6408_REG_ID_CTRL, &data);
+
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL0, 0xff);
+ if (rv) return rv;
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL1, 0xff);
if (rv) return rv;
- rv = fxl6408_reg_write(0, FXL6408_REG_INT_MASK, 0xff);
+ /* clear interrupts */
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_INT_STATE, &data);
if (rv) return rv;
- rv = fxl6408_reg_write(1, FXL6408_REG_INT_MASK, 0xff);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_INT_STATE, &data);
if (rv) return rv;
/* 1st chip */
data = EGPIO_BIT_CTP_SEL | EGPIO_BIT_EXP_IO0 | EGPIO_BIT_EXP_IO1;
- rv = fxl6408_reg_write(0, FXL6408_REG_IO_DIR, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_IO_DIR, data);
if (rv) return rv;
data = EGPIO_BIT_CTP_SEL;
- rv = fxl6408_reg_write(0, FXL6408_REG_O_STATE, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_O_STATE, data);
if (rv) return rv;
data = EGPIO_BIT_EXP_IO0 | EGPIO_BIT_EXP_IO1;
- rv = fxl6408_reg_write(0, FXL6408_REG_O_HIZ, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_O_HIZ, data);
if (rv) return rv;
- data = EGPIO_BIT_EVE_INT | EGPIO_BIT_SDCARD_DET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT | EGPIO_BIT_CTP_INT;
- rv = fxl6408_reg_write(0, FXL6408_REG_PULL_ENA, data);
+ data = EGPIO_BIT_EVE_INT | EGPIO_BIT_SDCARD_NDET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT | EGPIO_BIT_CTP_INT;
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_PULL_ENA, data);
if (rv) return rv;
- data = EGPIO_BIT_EVE_INT | EGPIO_BIT_SDCARD_DET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT | EGPIO_BIT_CTP_INT;
- rv = fxl6408_reg_write(0, FXL6408_REG_PULL_DIR, data);
+ data = EGPIO_BIT_EVE_INT | EGPIO_BIT_SDCARD_NDET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT | EGPIO_BIT_CTP_INT;
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_PULL_DIR, data);
if (rv) return rv;
/* 2nd chip */
data = EGPIO_BIT_HPAMP_CS | EGPIO_BIT_AUDIO_SEL | EGPIO_BIT_USR0 | EGPIO_BIT_USR1 | EGPIO_BIT_USR2 | EGPIO_BIT_USR3;
- rv = fxl6408_reg_write(1, FXL6408_REG_IO_DIR, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_IO_DIR, data);
if (rv) return rv;
data = EGPIO_BIT_HPAMP_CS | EGPIO_BIT_AUDIO_SEL;
- rv = fxl6408_reg_write(1, FXL6408_REG_O_STATE, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_O_STATE, data);
if (rv) return rv;
data = EGPIO_BIT_USR0 | EGPIO_BIT_USR1 | EGPIO_BIT_USR2 | EGPIO_BIT_USR3;
- rv = fxl6408_reg_write(1, FXL6408_REG_O_HIZ, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_O_HIZ, data);
if (rv) return rv;
data = 0;
- rv = fxl6408_reg_write(1, FXL6408_REG_PULL_ENA, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_PULL_ENA, data);
if (rv) return rv;
data = 0;
- rv = fxl6408_reg_write(1, FXL6408_REG_PULL_DIR, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_PULL_DIR, data);
+ if (rv) return rv;
+ } else {
+ /* read interrupt mask */
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_INT_MASK, &data);
+ if (rv) return rv;
+ egpio_intmask[EGPIO_CHIP_FXL0] = data;
+
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_INT_MASK, &data);
if (rv) return rv;
+ egpio_intmask[EGPIO_CHIP_FXL1] = data;
}
- rv = fxl6408_reg_read(0, FXL6408_REG_I_STATE, &data);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_I_STATE, &data);
if (rv) return rv;
- data &= egpio_switch[0];
+ data &= egpio_switch[EGPIO_CHIP_FXL0];
egpio_pinval[EGPIO_CHIP_FXL0] = data;
data |= EGPIO_BIT_EVE_INT | EGPIO_BIT_BAT_INT | EGPIO_BIT_CTP_INT;
- rv = fxl6408_reg_write(0, FXL6408_REG_I_DEFAULT, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL0, FXL6408_REG_I_DEFAULT, data);
if (rv) return rv;
- rv = fxl6408_reg_read(0, FXL6408_REG_IO_DIR, &data_dir);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_IO_DIR, &data_dir);
if (rv) return rv;
- rv = fxl6408_reg_read(0, FXL6408_REG_O_STATE, &data);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL0, FXL6408_REG_O_STATE, &data);
if (rv) return rv;
egpio_pinval[EGPIO_CHIP_FXL0] |= (data & data_dir);
- rv = fxl6408_reg_read(1, FXL6408_REG_I_STATE, &data);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_I_STATE, &data);
if (rv) return rv;
- data &= egpio_switch[1];
+ data &= egpio_switch[EGPIO_CHIP_FXL1];
egpio_pinval[EGPIO_CHIP_FXL1] = data;
- rv = fxl6408_reg_write(1, FXL6408_REG_I_DEFAULT, data);
+ rv = fxl6408_reg_write(EGPIO_CHIP_FXL1, FXL6408_REG_I_DEFAULT, data);
if (rv) return rv;
- rv = fxl6408_reg_read(1, FXL6408_REG_IO_DIR, &data_dir);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_IO_DIR, &data_dir);
if (rv) return rv;
- rv = fxl6408_reg_read(1, FXL6408_REG_O_STATE, &data);
+ rv = fxl6408_reg_read(EGPIO_CHIP_FXL1, FXL6408_REG_O_STATE, &data);
if (rv) return rv;
egpio_pinval[EGPIO_CHIP_FXL1] |= (data & data_dir);
@@ -313,31 +341,31 @@ int eos_egpio_run(void) {
eos_evtq_set_handler(EOS_EVT_EGPIO, handle_evt);
- GPIO_REG(GPIO_INPUT_EN) |= (1 << EGPIO_PIN_INT);
- clear_csr(mstatus, MSTATUS_MIE);
- GPIO_REG(GPIO_LOW_IE) |= (1 << EGPIO_PIN_INT);
- set_csr(mstatus, MSTATUS_MIE);
- eos_intr_set(INT_GPIO_BASE + EGPIO_PIN_INT, IRQ_PRIORITY_EGPIO, handle_intr);
-
- /* EVE_PIN_INT will be set in intr_set() below */
- eos_intr_set(INT_GPIO_BASE + EVE_PIN_INT, IRQ_PRIORITY_EVE, handle_intr_eve);
-
wakeup_cause = eos_pwr_wakeup_cause();
rst = (wakeup_cause == EOS_PWR_WAKE_RST);
if (rst) {
- /* turn on interrupts when all is configured */
- data = ~(EGPIO_BIT_SDCARD_DET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT);
- rv = fxl6408_reg_write(0, FXL6408_REG_INT_MASK, data);
+ /* enable interrupts when all is configured */
+ data = ~(EGPIO_BIT_SDCARD_NDET | EGPIO_BIT_BTN_WAKE | EGPIO_BIT_BAT_INT);
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL0, data);
if (rv) return rv;
data = ~(EGPIO_BIT_MIC_MUTE | EGPIO_BIT_HP_NDET);
- rv = fxl6408_reg_write(1, FXL6408_REG_INT_MASK, data);
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL1, data);
if (rv) return rv;
}
rv = eos_egpio_intr_set();
if (rv) return rv;
+ /* CTP_PIN_INT is configured in intr_set() above */
+ eos_intr_set(INT_GPIO_BASE + CTP_PIN_INT, IRQ_PRIORITY_CTP, handle_intr_ctp);
+
+ GPIO_REG(GPIO_INPUT_EN) |= (1 << EGPIO_PIN_INT);
+ clear_csr(mstatus, MSTATUS_MIE);
+ GPIO_REG(GPIO_LOW_IE) |= (1 << EGPIO_PIN_INT);
+ set_csr(mstatus, MSTATUS_MIE);
+ eos_intr_set(INT_GPIO_BASE + EGPIO_PIN_INT, IRQ_PRIORITY_EGPIO, handle_intr);
+
return EOS_OK;
}
@@ -346,33 +374,32 @@ void eos_egpio_eve_set(uint16_t gpio_reg) {
if (gpio_reg & (1 << EVE_GPIO_DISP)) egpio_pinval[EGPIO_CHIP_EVE] |= EGPIO_PIN2BIT(EGPIO_PIN_DISP_SEL);
}
-int _eos_egpio_intr_set(int i2s_running, int app_disp) {
- uint8_t data;
+static int egpio_intr_set(int i2s_running, int app_disp) {
+ uint8_t mask;
int rv;
- rv = fxl6408_reg_read(0, FXL6408_REG_INT_MASK, &data);
- if (rv) return rv;
+ mask = egpio_intmask[EGPIO_CHIP_FXL0];
+ mask |= EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT;
- data &= ~(EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT);
- if (app_disp) {
- data |= (EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT);
- } else if (!i2s_running) {
- if (eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) {
- data |= EGPIO_BIT_CTP_INT;
+ if (!app_disp) {
+ if (i2s_running) {
+ mask &= ~(EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT);
+ } else if (eos_egpio_get_val(EGPIO_PIN_CTP_SEL)) {
+ mask &= ~EGPIO_BIT_EVE_INT;
} else {
- data |= EGPIO_BIT_EVE_INT;
+ mask &= ~EGPIO_BIT_CTP_INT;
}
}
- rv = fxl6408_reg_write(0, FXL6408_REG_INT_MASK, data);
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL0, mask);
if (rv) return rv;
- GPIO_REG(GPIO_INPUT_EN) |= (1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_INPUT_EN) |= (1 << CTP_PIN_INT);
clear_csr(mstatus, MSTATUS_MIE);
if (app_disp || i2s_running) {
- GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_LOW_IE) &= ~(1 << CTP_PIN_INT);
} else {
- GPIO_REG(GPIO_LOW_IE) |= (1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_LOW_IE) |= (1 << CTP_PIN_INT);
}
set_csr(mstatus, MSTATUS_MIE);
@@ -380,25 +407,23 @@ int _eos_egpio_intr_set(int i2s_running, int app_disp) {
}
int eos_egpio_intr_set(void) {
- return _eos_egpio_intr_set(eos_i2s_running(), !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
+ return egpio_intr_set(eos_i2s_running(), !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
}
int eos_egpio_intr_disable(void) {
- uint8_t data;
+ uint8_t mask;
int rv;
- rv = fxl6408_reg_read(0, FXL6408_REG_INT_MASK, &data);
- if (rv) return rv;
-
- data |= (EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT);
+ mask = egpio_intmask[EGPIO_CHIP_FXL0];
+ mask |= (EGPIO_BIT_EVE_INT | EGPIO_BIT_CTP_INT);
- rv = fxl6408_reg_write(0, FXL6408_REG_INT_MASK, data);
+ rv = egpio_fxl_set_mask(EGPIO_CHIP_FXL0, mask);
if (rv) return rv;
clear_csr(mstatus, MSTATUS_MIE);
- GPIO_REG(GPIO_LOW_IE) &= ~(1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_LOW_IE) &= ~(1 << CTP_PIN_INT);
set_csr(mstatus, MSTATUS_MIE);
- GPIO_REG(GPIO_INPUT_EN) &= ~(1 << EVE_PIN_INT);
+ GPIO_REG(GPIO_INPUT_EN) &= ~(1 << CTP_PIN_INT);
return EOS_OK;
}
@@ -435,7 +460,17 @@ int eos_egpio_fxl_set_pin(uint8_t reg, uint8_t pin, uint8_t val) {
return EOS_OK;
}
-int _eos_egpio_get_val(uint8_t pin) {
+static int egpio_fxl_set_mask(uint8_t chip_id, uint8_t mask) {
+ int rv;
+
+ rv = fxl6408_reg_write(chip_id, FXL6408_REG_INT_MASK, mask);
+ if (rv) return rv;
+
+ egpio_intmask[chip_id] = mask;
+ return EOS_OK;
+}
+
+static int egpio_get_val(uint8_t pin) {
uint8_t chip_id;
chip_id = EGPIO_PIN2CHIP(pin);
@@ -443,7 +478,7 @@ int _eos_egpio_get_val(uint8_t pin) {
return !!(egpio_pinval[chip_id] & EGPIO_PIN2BIT(pin));
}
-int _eos_egpio_set_val(uint8_t pin, int val) {
+static int egpio_set_val(uint8_t pin, int val) {
uint8_t chip_id;
int rv;
@@ -485,7 +520,7 @@ int eos_egpio_get_val(uint8_t pin) {
case EGPIO_PIN_EVEAUDIO_DIS:
case EGPIO_PIN_LSGAIN_SEL: {
- int lspk_on = (eos_i2s_running() || !_eos_egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET);
+ int lspk_on = (eos_i2s_running() || !egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET);
if ((pin == EGPIO_PIN_EVEAUDIO_DIS) && lspk_on) {
return !!(egpio_alt_pin & pin2alt_bit(pin));
@@ -498,7 +533,7 @@ int eos_egpio_get_val(uint8_t pin) {
}
}
- return _eos_egpio_get_val(pin);
+ return egpio_get_val(pin);
}
int eos_egpio_set_val(uint8_t pin, int val) {
@@ -520,7 +555,7 @@ int eos_egpio_set_val(uint8_t pin, int val) {
return EOS_OK;
}
- if ((val != _eos_egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET)) {
+ if ((val != egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET)) {
if (val) {
/* store LSGAIN_SEL pin and set EVEAUDIO_DIS pin */
PINSWITCH(EGPIO_PIN_LSGAIN_SEL, EGPIO_PIN_EVEAUDIO_DIS);
@@ -534,7 +569,7 @@ int eos_egpio_set_val(uint8_t pin, int val) {
case EGPIO_PIN_EVEAUDIO_DIS:
case EGPIO_PIN_LSGAIN_SEL: {
- int lspk_on = (eos_i2s_running() || !_eos_egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET);
+ int lspk_on = (eos_i2s_running() || !egpio_get_val(EGPIO_PIN_AUDIO_SEL)) && eos_egpio_get_val(EGPIO_PIN_HP_NDET);
if ((pin == EGPIO_PIN_EVEAUDIO_DIS) && lspk_on) {
BITSET(egpio_alt_pin, pin2alt_bit(pin), val);
@@ -549,7 +584,7 @@ int eos_egpio_set_val(uint8_t pin, int val) {
}
}
- rv = _eos_egpio_set_val(pin, val);
+ rv = egpio_set_val(pin, val);
if (rv) return rv;
return EOS_OK;
@@ -559,13 +594,13 @@ int eos_egpio_i2s_start(void) {
uint8_t data;
int rv, audio_sel;
- rv = _eos_egpio_intr_set(1, !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
+ rv = egpio_intr_set(1, !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
if (rv) return rv;
- audio_sel = _eos_egpio_get_val(EGPIO_PIN_AUDIO_SEL);
+ audio_sel = egpio_get_val(EGPIO_PIN_AUDIO_SEL);
BITSET(egpio_alt_pin, pin2alt_bit(EGPIO_PIN_AUDIO_SEL), audio_sel);
- rv = _eos_egpio_set_val(EGPIO_PIN_AUDIO_SEL, 1);
+ rv = egpio_set_val(EGPIO_PIN_AUDIO_SEL, 1);
if (rv) return rv;
if (!audio_sel && eos_egpio_get_val(EGPIO_PIN_HP_NDET)) {
@@ -579,7 +614,7 @@ int eos_egpio_i2s_start(void) {
int eos_egpio_i2s_stop(void) {
int rv, audio_sel;
- rv = _eos_egpio_intr_set(0, !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
+ rv = egpio_intr_set(0, !eos_egpio_get_val(EGPIO_PIN_DISP_SEL));
if (rv) return rv;
audio_sel = (egpio_alt_pin & pin2alt_bit(EGPIO_PIN_AUDIO_SEL));
@@ -588,7 +623,7 @@ int eos_egpio_i2s_stop(void) {
PINSWITCH(EGPIO_PIN_LSGAIN_SEL, EGPIO_PIN_EVEAUDIO_DIS);
}
- rv = _eos_egpio_set_val(EGPIO_PIN_AUDIO_SEL, audio_sel);
+ rv = egpio_set_val(EGPIO_PIN_AUDIO_SEL, audio_sel);
if (rv) return rv;
return EOS_OK;