Bladeren bron

i2s: fix mclk stopped when setting clock

laokaiyao 4 jaren geleden
bovenliggende
commit
a9df58c776
2 gewijzigde bestanden met toevoegingen van 17 en 12 verwijderingen
  1. 17 0
      components/driver/i2s.c
  2. 0 12
      components/hal/i2s_hal.c

+ 17 - 0
components/driver/i2s.c

@@ -1895,6 +1895,14 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config,
 #endif
     /* Enable module clock */
     i2s_hal_enable_module_clock(&p_i2s[i2s_num]->hal);
+#if SOC_I2S_SUPPORTS_TDM
+    if (i2s_config->mode & I2S_MODE_TX) {
+        i2s_ll_tx_enable_clock(p_i2s[i2s_num]->hal.dev);
+    }
+    if (i2s_config->mode & I2S_MODE_RX) {
+        i2s_ll_rx_enable_clock(p_i2s[i2s_num]->hal.dev);
+    }
+#endif
 
     /* Step 5: Initialize I2S configuration and set the configurations to register */
     i2s_hal_config_param(&(pre_alloc_i2s_obj->hal), &pre_alloc_i2s_obj->hal_cfg);
@@ -1911,6 +1919,7 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config,
 
     /* Step 7: Set I2S clocks and start. No need to give parameters since configurations has been set in 'i2s_driver_init' */
     ESP_GOTO_ON_ERROR(i2s_set_clk(i2s_num, 0, 0, 0), err, TAG, "I2S set clock failed");
+
     return ESP_OK;
 
 err:
@@ -1972,6 +1981,14 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num)
         esp_pm_lock_delete(p_i2s[i2s_num]->pm_lock);
         p_i2s[i2s_num]->pm_lock = NULL;
     }
+#endif
+#if SOC_I2S_SUPPORTS_TDM
+    if (p_i2s[i2s_num]->hal_cfg.mode & I2S_MODE_TX) {
+        i2s_ll_tx_disable_clock(p_i2s[i2s_num]->hal.dev);
+    }
+    if (p_i2s[i2s_num]->hal_cfg.mode & I2S_MODE_RX) {
+        i2s_ll_rx_disable_clock(p_i2s[i2s_num]->hal.dev);
+    }
 #endif
     /* Disable module clock */
     i2s_hal_disable_module_clock(&p_i2s[i2s_num]->hal);

+ 0 - 12
components/hal/i2s_hal.c

@@ -347,32 +347,20 @@ void i2s_hal_config_param(i2s_hal_context_t *hal, const i2s_hal_config_t *hal_cf
 
 void i2s_hal_start_tx(i2s_hal_context_t *hal)
 {
-#if SOC_I2S_SUPPORTS_TDM
-    i2s_ll_tx_enable_clock(hal->dev);
-#endif
     i2s_ll_tx_start(hal->dev);
 }
 
 void i2s_hal_start_rx(i2s_hal_context_t *hal)
 {
-#if SOC_I2S_SUPPORTS_TDM
-    i2s_ll_rx_enable_clock(hal->dev);
-#endif
     i2s_ll_rx_start(hal->dev);
 }
 
 void i2s_hal_stop_tx(i2s_hal_context_t *hal)
 {
     i2s_ll_tx_stop(hal->dev);
-#if SOC_I2S_SUPPORTS_TDM
-    i2s_ll_tx_disable_clock(hal->dev);
-#endif
 }
 
 void i2s_hal_stop_rx(i2s_hal_context_t *hal)
 {
     i2s_ll_rx_stop(hal->dev);
-#if SOC_I2S_SUPPORTS_TDM
-    i2s_ll_rx_disable_clock(hal->dev);
-#endif
 }