فهرست منبع

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
xiongyu 6 سال پیش
والد
کامیت
96a5e34d7a
3فایلهای تغییر یافته به همراه6 افزوده شده و 2 حذف شده
  1. 2 1
      components/driver/i2s.c
  2. 2 0
      components/driver/rtc_module.c
  3. 2 1
      components/driver/timer.c

+ 2 - 1
components/driver/i2s.c

@@ -96,7 +96,8 @@ typedef struct {
 } i2s_obj_t;
 
 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 int _i2s_adc_unit = -1;
 static int _i2s_adc_channel = -1;

+ 2 - 0
components/driver/rtc_module.c

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

+ 2 - 1
components/driver/timer.c

@@ -35,7 +35,8 @@ static const char* TIMER_TAG = "timer_group";
 #define TIMER_SCALE_ERROR       "HW TIMER SCALE ERROR"
 #define TIMER_ALARM_ERROR       "HW TIMER ALARM 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};
 
 #define TIMER_ENTER_CRITICAL(mux)      portENTER_CRITICAL_SAFE(mux);