bugfix(driver): fix i2s and timergroup some issues

* fix i2s and timergroup dev array used by isr crash issue

* Closes IDFGH-2432

* Closes https://github.com/espressif/esp-idf/issues/4545

* fix i2s adc data inv issue

* Closes IDFGH-2444

* Closes https://github.com/espressif/esp-idf/issues/4557
This commit is contained in:
xiongyu 2019-12-27 20:27:01 +08:00
parent 6784b2bcd5
commit 4a9fc1026a
3 changed files with 6 additions and 2 deletions

View file

@ -90,7 +90,8 @@ typedef struct {
} i2s_obj_t; } i2s_obj_t;
static i2s_obj_t *p_i2s_obj[I2S_NUM_MAX] = {0}; static i2s_obj_t *p_i2s_obj[I2S_NUM_MAX] = {0};
static i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1}; /* DRAM_ATTR is required to avoid I2S array placed in flash, due to accessed from ISR */
static DRAM_ATTR i2s_dev_t* I2S[I2S_NUM_MAX] = {&I2S0, &I2S1};
static portMUX_TYPE i2s_spinlock[I2S_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; static portMUX_TYPE i2s_spinlock[I2S_NUM_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED};
static int _i2s_adc_unit = -1; static int _i2s_adc_unit = -1;
static int _i2s_adc_channel = -1; static int _i2s_adc_channel = -1;

View file

@ -1183,10 +1183,12 @@ esp_err_t adc_set_data_inv(adc_unit_t adc_unit, bool inv_en)
if (adc_unit & ADC_UNIT_1) { if (adc_unit & ADC_UNIT_1) {
// Enable ADC data invert // Enable ADC data invert
SENS.sar_read_ctrl.sar1_data_inv = inv_en; SENS.sar_read_ctrl.sar1_data_inv = inv_en;
SYSCON.saradc_ctrl2.sar1_inv = inv_en;
} }
if (adc_unit & ADC_UNIT_2) { if (adc_unit & ADC_UNIT_2) {
// Enable ADC data invert // Enable ADC data invert
SENS.sar_read_ctrl2.sar2_data_inv = inv_en; SENS.sar_read_ctrl2.sar2_data_inv = inv_en;
SYSCON.saradc_ctrl2.sar2_inv = inv_en;
} }
portEXIT_CRITICAL(&rtc_spinlock); portEXIT_CRITICAL(&rtc_spinlock);
return ESP_OK; return ESP_OK;

View file

@ -36,7 +36,8 @@ static const char* TIMER_TAG = "timer_group";
#define TIMER_SCALE_ERROR "HW TIMER SCALE ERROR" #define TIMER_SCALE_ERROR "HW TIMER SCALE ERROR"
#define TIMER_ALARM_ERROR "HW TIMER ALARM ERROR" #define TIMER_ALARM_ERROR "HW TIMER ALARM ERROR"
#define DIVIDER_RANGE_ERROR "HW TIMER divider outside of [2, 65536] range error" #define DIVIDER_RANGE_ERROR "HW TIMER divider outside of [2, 65536] range error"
static timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1}; /* DRAM_ATTR is required to avoid TG array placed in flash, due to accessed from ISR */
static DRAM_ATTR timg_dev_t *TG[2] = {&TIMERG0, &TIMERG1};
static portMUX_TYPE timer_spinlock[TIMER_GROUP_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED}; static portMUX_TYPE timer_spinlock[TIMER_GROUP_MAX] = {portMUX_INITIALIZER_UNLOCKED, portMUX_INITIALIZER_UNLOCKED};
#define TIMER_ENTER_CRITICAL(mux) portENTER_CRITICAL(mux); #define TIMER_ENTER_CRITICAL(mux) portENTER_CRITICAL(mux);