mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	[adc] Enable ADC on ESP32-P4 (#9954)
This commit is contained in:
		| @@ -1,6 +1,6 @@ | |||||||
| from esphome import pins | from esphome import pins | ||||||
| import esphome.codegen as cg | import esphome.codegen as cg | ||||||
| from esphome.components.esp32 import get_esp32_variant | from esphome.components.esp32 import VARIANT_ESP32P4, get_esp32_variant | ||||||
| from esphome.components.esp32.const import ( | from esphome.components.esp32.const import ( | ||||||
|     VARIANT_ESP32, |     VARIANT_ESP32, | ||||||
|     VARIANT_ESP32C2, |     VARIANT_ESP32C2, | ||||||
| @@ -140,6 +140,16 @@ ESP32_VARIANT_ADC1_PIN_TO_CHANNEL = { | |||||||
|         9: adc_channel_t.ADC_CHANNEL_8, |         9: adc_channel_t.ADC_CHANNEL_8, | ||||||
|         10: adc_channel_t.ADC_CHANNEL_9, |         10: adc_channel_t.ADC_CHANNEL_9, | ||||||
|     }, |     }, | ||||||
|  |     VARIANT_ESP32P4: { | ||||||
|  |         16: adc_channel_t.ADC_CHANNEL_0, | ||||||
|  |         17: adc_channel_t.ADC_CHANNEL_1, | ||||||
|  |         18: adc_channel_t.ADC_CHANNEL_2, | ||||||
|  |         19: adc_channel_t.ADC_CHANNEL_3, | ||||||
|  |         20: adc_channel_t.ADC_CHANNEL_4, | ||||||
|  |         21: adc_channel_t.ADC_CHANNEL_5, | ||||||
|  |         22: adc_channel_t.ADC_CHANNEL_6, | ||||||
|  |         23: adc_channel_t.ADC_CHANNEL_7, | ||||||
|  |     }, | ||||||
| } | } | ||||||
|  |  | ||||||
| # pin to adc2 channel mapping | # pin to adc2 channel mapping | ||||||
| @@ -198,6 +208,14 @@ ESP32_VARIANT_ADC2_PIN_TO_CHANNEL = { | |||||||
|         19: adc_channel_t.ADC_CHANNEL_8, |         19: adc_channel_t.ADC_CHANNEL_8, | ||||||
|         20: adc_channel_t.ADC_CHANNEL_9, |         20: adc_channel_t.ADC_CHANNEL_9, | ||||||
|     }, |     }, | ||||||
|  |     VARIANT_ESP32P4: { | ||||||
|  |         49: adc_channel_t.ADC_CHANNEL_0, | ||||||
|  |         50: adc_channel_t.ADC_CHANNEL_1, | ||||||
|  |         51: adc_channel_t.ADC_CHANNEL_2, | ||||||
|  |         52: adc_channel_t.ADC_CHANNEL_3, | ||||||
|  |         53: adc_channel_t.ADC_CHANNEL_4, | ||||||
|  |         54: adc_channel_t.ADC_CHANNEL_5, | ||||||
|  |     }, | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -136,8 +136,8 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage | |||||||
|   adc_oneshot_unit_handle_t adc_handle_{nullptr}; |   adc_oneshot_unit_handle_t adc_handle_{nullptr}; | ||||||
|   adc_cali_handle_t calibration_handle_{nullptr}; |   adc_cali_handle_t calibration_handle_{nullptr}; | ||||||
|   adc_atten_t attenuation_{ADC_ATTEN_DB_0}; |   adc_atten_t attenuation_{ADC_ATTEN_DB_0}; | ||||||
|   adc_channel_t channel_; |   adc_channel_t channel_{}; | ||||||
|   adc_unit_t adc_unit_; |   adc_unit_t adc_unit_{}; | ||||||
|   struct SetupFlags { |   struct SetupFlags { | ||||||
|     uint8_t init_complete : 1; |     uint8_t init_complete : 1; | ||||||
|     uint8_t config_complete : 1; |     uint8_t config_complete : 1; | ||||||
|   | |||||||
| @@ -72,10 +72,9 @@ void ADCSensor::setup() { | |||||||
|   // Initialize ADC calibration |   // Initialize ADC calibration | ||||||
|   if (this->calibration_handle_ == nullptr) { |   if (this->calibration_handle_ == nullptr) { | ||||||
|     adc_cali_handle_t handle = nullptr; |     adc_cali_handle_t handle = nullptr; | ||||||
|     esp_err_t err; |  | ||||||
|  |  | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|     // RISC-V variants and S3 use curve fitting calibration |     // RISC-V variants and S3 use curve fitting calibration | ||||||
|     adc_cali_curve_fitting_config_t cali_config = {};  // Zero initialize first |     adc_cali_curve_fitting_config_t cali_config = {};  // Zero initialize first | ||||||
| #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) | #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) | ||||||
| @@ -187,7 +186,7 @@ float ADCSensor::sample_fixed_attenuation_() { | |||||||
|       ESP_LOGW(TAG, "ADC calibration conversion failed with error %d, disabling calibration", err); |       ESP_LOGW(TAG, "ADC calibration conversion failed with error %d, disabling calibration", err); | ||||||
|       if (this->calibration_handle_ != nullptr) { |       if (this->calibration_handle_ != nullptr) { | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|         adc_cali_delete_scheme_curve_fitting(this->calibration_handle_); |         adc_cali_delete_scheme_curve_fitting(this->calibration_handle_); | ||||||
| #else   // Other ESP32 variants use line fitting calibration | #else   // Other ESP32 variants use line fitting calibration | ||||||
|         adc_cali_delete_scheme_line_fitting(this->calibration_handle_); |         adc_cali_delete_scheme_line_fitting(this->calibration_handle_); | ||||||
| @@ -220,7 +219,7 @@ float ADCSensor::sample_autorange_() { | |||||||
|     if (this->calibration_handle_ != nullptr) { |     if (this->calibration_handle_ != nullptr) { | ||||||
|       // Delete old calibration handle |       // Delete old calibration handle | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|       adc_cali_delete_scheme_curve_fitting(this->calibration_handle_); |       adc_cali_delete_scheme_curve_fitting(this->calibration_handle_); | ||||||
| #else | #else | ||||||
|       adc_cali_delete_scheme_line_fitting(this->calibration_handle_); |       adc_cali_delete_scheme_line_fitting(this->calibration_handle_); | ||||||
| @@ -232,7 +231,7 @@ float ADCSensor::sample_autorange_() { | |||||||
|     adc_cali_handle_t handle = nullptr; |     adc_cali_handle_t handle = nullptr; | ||||||
|  |  | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|     adc_cali_curve_fitting_config_t cali_config = {}; |     adc_cali_curve_fitting_config_t cali_config = {}; | ||||||
| #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) | #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0) | ||||||
|     cali_config.chan = this->channel_; |     cali_config.chan = this->channel_; | ||||||
| @@ -261,7 +260,7 @@ float ADCSensor::sample_autorange_() { | |||||||
|       ESP_LOGW(TAG, "ADC read failed in autorange with error %d", err); |       ESP_LOGW(TAG, "ADC read failed in autorange with error %d", err); | ||||||
|       if (handle != nullptr) { |       if (handle != nullptr) { | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|         adc_cali_delete_scheme_curve_fitting(handle); |         adc_cali_delete_scheme_curve_fitting(handle); | ||||||
| #else | #else | ||||||
|         adc_cali_delete_scheme_line_fitting(handle); |         adc_cali_delete_scheme_line_fitting(handle); | ||||||
| @@ -281,7 +280,7 @@ float ADCSensor::sample_autorange_() { | |||||||
|       } |       } | ||||||
|       // Clean up calibration handle |       // Clean up calibration handle | ||||||
| #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | #if USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C5 || USE_ESP32_VARIANT_ESP32C6 || \ | ||||||
|     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 |     USE_ESP32_VARIANT_ESP32S3 || USE_ESP32_VARIANT_ESP32H2 || USE_ESP32_VARIANT_ESP32P4 | ||||||
|       adc_cali_delete_scheme_curve_fitting(handle); |       adc_cali_delete_scheme_curve_fitting(handle); | ||||||
| #else | #else | ||||||
|       adc_cali_delete_scheme_line_fitting(handle); |       adc_cali_delete_scheme_line_fitting(handle); | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								tests/components/adc/test.esp32-p4-idf.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tests/components/adc/test.esp32-p4-idf.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | packages: | ||||||
|  |   base: !include common.yaml | ||||||
|  |  | ||||||
|  | sensor: | ||||||
|  |   - id: !extend my_sensor | ||||||
|  |     pin: GPIO50 | ||||||
		Reference in New Issue
	
	Block a user